I2C

Table of contents

Overview

I2C는 SDA/SCL을 공유하며 address, ACK/NACK, START/STOP으로 transaction을 구성한다. Open-drain과 pull-up, bus capacitance, clock stretching, timeout을 함께 검토한다.

Board and Peripheral Setup

💡

S32K312의 실제 I2C/LPI2C instance·pin mux·지원 speed·RTD API를 설치 패키지에서 확인한다. 아래 board_i2c_write_read는 repeated START를 지원한다고 명시한 설명용 adapter다.

설정 확인할 내용
Voltage / Pull-up 공급 전압·입력 허용치·open-drain 설정·외부 pull-up을 확인한다.
Speed Functional clock과 divider뿐 아니라 rise/fall time·filter·hold time을 확인한다.
Address 7-bit address와 R/W를 포함한 wire byte를 구분한다. 0x50을 driver가 다시 shift하는지 확인한다.
Transfer Register address 폭·byte order·repeated START·STOP 조건은 장치 데이터시트를 따른다.
Timeout Address NACK, data NACK, stretching, arbitration loss와 bus stuck를 구분한다.

Register Read Transaction

sequenceDiagram
 participant M as MCU Controller
 participant D as Device
 M->>D: START + address/W
 D-->>M: ACK
 M->>D: Register address
 D-->>M: ACK
 M->>D: repeated START + address/R
 D-->>M: Data byte
 M->>D: NACK + STOP

위는 1-byte register address와 1-byte read를 사용하는 가상 장치 예다. 모든 장치가 같은 protocol을 쓰지 않으며 마지막 read byte에 보내는 NACK는 정상 transaction 종료다.

C Adapter Example

#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
extern bool board_i2c_write_read(uint8_t address7,
    const uint8_t *tx, size_t tx_len,
    uint8_t *rx, size_t rx_len, uint32_t timeout_ms);
bool sensor_read_id(uint8_t *value) {
    if (!value) return false;
    const uint8_t reg = 0x0F; /* 가상 register */
    return board_i2c_write_read(0x50,&reg,1,value,1,10);
}

이 adapter는 동기식이며 반환 시 stack의 reg를 더 이상 참조하지 않는다는 계약이다. 비동기 driver라면 buffer를 완료 시점까지 유지한다. 0x50·0x0F·10 ms는 예제값이다.

Pull-up and Rise Time

이상적인 RC 근사에서 30~70% rise time은 약 0.8473×R_pullup×C_bus다. 실제 I2C mode의 rise-time 한계와 device의 sink current·VOL 한계를 함께 만족시키는 범위를 찾는다. 저항을 무조건 작게 하면 low-level 전류가 증가한다. 내부 pull-up만으로 규격 충족을 단정하지 않는다.

Bus Recovery

SDA low stuck이면 먼저 전원·pin mux·다른 controller의 소유 여부를 확인한다. Bus clear clock/STOP 생성은 제품과 controller가 허용하는 절차를 따른다. SCL이 계속 low면 clock pulse만으로 복구되지 않는다. Transaction 중 무조건 pin mux를 GPIO로 바꾸지 말고 driver를 정지하고 bus ownership을 확보한다.

Verification

정상 ID read, 잘못된 address, 장치 미연결, NACK, 긴 stretching, 동시 bus 접근, 전원 순서 변화, stuck line을 시험한다. Logic analyzer decode와 scope의 rise time·VOL 측정을 함께 확인한다.