I2C Reference
I2C 통신 프로토콜 레퍼런스
I2C Reference 소개
I2C 레퍼런스는 I2C(Inter-Integrated Circuit) 2선식 직렬 통신 프로토콜을 검색할 수 있는 빠른 참조 도구입니다. 기본, 주소지정, 읽기, 쓰기, 다중마스터, 디버깅의 여섯 가지 카테고리로 정리되어 있어 임베디드 시스템 엔지니어, 펌웨어 개발자, 전자 공학 애호가가 I2C 센서, EEPROM, 주변 장치를 다룰 때 필요한 프로토콜 세부 정보, C 코드 패턴, 진단 명령어를 즉시 찾을 수 있습니다.
펌웨어 엔지니어들은 SDA와 SCL 라인에서 START와 STOP 조건의 타이밍 관계, 9번째 클럭 사이클에서의 ACK/NACK 핸드셰이크, R/W 비트가 포함된 7비트 주소 프레임 형식, 반복 START를 사용한 단일 바이트 및 다중 바이트(버스트) 레지스터 읽기 절차를 이 레퍼런스로 빠르게 확인합니다. STM32 HAL(HAL_I2C_Mem_Read, HAL_I2C_Mem_Write)과 Arduino Wire 라이브러리(Wire.beginTransmission, Wire.requestFrom)의 플랫폼별 패턴도 포함되어 있습니다. AT24C256 같은 EEPROM의 페이지 쓰기 경계도 다룹니다.
디버깅 카테고리는 하드웨어 초기화 작업에 특히 유용합니다. SDA가 LOW에 고착된 경우 SCL을 9번 토글하는 버스 복구, 풀업 저항 선택(3.3V 시스템에서 400kHz에는 4.7k, 100kHz에는 10k), Linux i2c-tools 명령어(i2cdetect, i2cget, i2cset, i2cdump), 주소 바이트와 ACK 펄스 검증을 위한 로직 분석기 체크포인트, 일부 마스터가 지원하지 않는 클럭 스트레칭 동작을 다룹니다.
주요 기능
- I2C 버스 기본 원리: SDA/SCL 오픈 드레인 배선, 풀업 저항 요구 사항, Standard/Fast/Fast+/HS 속도 모드
- START와 STOP 조건 타이밍: SCL HIGH 대비 SDA 에지 방향, 비트 뱅잉을 위한 C 코드 예제
- ACK/NACK 프로토콜: 9번째 클럭 비트, 수신자가 ACK를 위해 SDA LOW 유지, 마지막 읽기 바이트 후 마스터의 NACK
- 7비트 주소(0x08~0x77, 112개) 및 10비트 확장 주소(최대 1024개), General Call(0x00)
- 읽기 절차: 단일 바이트, 자동 증가 다중 바이트 버스트 읽기, STM32 HAL_I2C_Mem_Read, Arduino Wire.requestFrom
- 쓰기 절차: 단일 바이트, 버스트 쓰기, STM32 HAL_I2C_Mem_Write, Arduino Wire.beginTransmission, EEPROM 페이지 쓰기
- 다중 마스터: SDA 비교를 통한 중재, 슬레이브 처리 시간을 위한 클럭 스트레칭, 반복 START 버스 소유권
- 디버깅: SCL 9회 토글로 버스 복구, 풀업 저항 계산, i2cdetect/i2cget/i2cset/i2cdump 명령어
자주 묻는 질문
I2C란 무엇이고 어떻게 동작하나요?
I2C(Inter-Integrated Circuit)는 동기식 다중 마스터-다중 슬레이브 2선식 직렬 통신 프로토콜입니다. VDD로의 풀업 저항이 필요한 SDA(직렬 데이터)와 SCL(직렬 클럭) 라인을 사용합니다. 마스터가 클럭을 생성하고 모든 전송을 시작합니다. 통신은 START 조건(SCL이 HIGH일 때 SDA 하강)으로 시작하여, 수신자가 확인하는 주소와 데이터 바이트가 이어지고, STOP 조건(SCL이 HIGH일 때 SDA 상승)으로 종료됩니다.
I2C에 어떤 풀업 저항을 사용해야 하나요?
최적의 풀업 저항은 버스 속도와 커패시턴스에 따라 다릅니다. 3.3V에서 Standard Mode(100kHz)에는 10kΩ이 일반적입니다. Fast Mode(400kHz)에는 4.7kΩ을 권장합니다. Fast Mode Plus(1MHz)에는 2.2kΩ 이하가 필요할 수 있습니다. 최소 저항은 (VDD - VOL) / IOL로 계산합니다. 3.3V에서 3mA 싱크 전류라면 약 967Ω입니다. 너무 높은 저항은 상승 시간을 늦춰 고속에서 통신 오류를 유발합니다.
단일 바이트 읽기와 버스트(다중 바이트) 읽기의 차이는 무엇인가요?
단일 바이트 읽기는 START, 장치 주소+W 비트, 레지스터 주소를 보낸 후 반복 START, 장치 주소+R 비트, 1바이트 읽기, NACK, STOP 순서로 진행합니다. 버스트 읽기는 첫 번째 바이트 후 NACK 대신 ACK를 보내 더 많은 바이트를 요청합니다. 장치는 레지스터 포인터를 자동으로 증가시킵니다. 가속도계 XYZ 데이터(6바이트) 같은 다중 바이트 값을 단일 트랜잭션으로 읽는 데 필수적입니다.
I2C의 클럭 스트레칭이란 무엇인가요?
클럭 스트레칭은 슬레이브 장치가 마스터가 해제한 후에도 SCL 라인을 LOW로 유지하여 다음 바이트를 보내거나 받을 준비가 될 때까지 통신을 일시 중지하는 기능입니다. 슬레이브가 ADC 변환 수행 등 데이터를 처리하는 데 추가 시간이 필요할 때 사용됩니다. 모든 I2C 마스터가 클럭 스트레칭을 지원하지는 않으므로 마스터의 데이터시트를 확인하세요.
Linux에서 I2C 장치 주소를 스캔하는 방법은?
i2c-tools를 설치하고 sudo i2cdetect -y 1을 실행합니다(1은 I2C 버스 번호로 교체). 명령은 버스를 스캔하여 ACK로 응답하는 주소를 그리드로 표시합니다. 주소는 16진수로 표시되고 장치가 없으면 대시(--)가 나타납니다. 레지스터 읽기: sudo i2cget -y 1 0x48 0x00 w. 레지스터 쓰기: sudo i2cset -y 1 0x48 0x01 0x60. 모든 레지스터 덤프: sudo i2cdump -y 1 0x48.
I2C 다중 마스터 중재는 어떻게 동작하나요?
두 마스터가 동시에 전송을 시작하려 할 때 SDA 라인에서 비트 단위로 충돌이 해결됩니다. 각 마스터는 전송 중 SDA를 모니터링합니다. 마스터가 SDA를 HIGH로 구동하지만 LOW로 읽히면 다른 마스터가 LOW로 구동 중이므로 그 마스터가 중재에서 승리합니다. 패배한 마스터는 즉시 전송을 중지하고 대기합니다. I2C SDA는 오픈 드레인이므로 어떤 마스터도 LOW를 구동할 수 있지만 다른 마스터가 LOW를 당기는 것에 반해 HIGH를 구동할 수 없기 때문에 이 방식이 작동합니다.
I2C 버스 잠금(SDA가 LOW에 고착) 복구 방법은?
버스 잠금은 슬레이브가 전송 중간에 전원이 차단되어 SDA를 무기한 LOW로 유지할 때 발생합니다. 복구 절차: SCL을 출력으로 설정하고 HIGH/LOW로 9번 토글합니다. 이렇게 하면 슬레이브의 시프트 레지스터에서 남은 비트를 클럭 아웃합니다. 그런 다음 STOP 조건을 생성합니다(SDA LOW, SCL HIGH, SDA HIGH). 슬레이브 펌웨어가 소프트웨어 리셋을 지원하면 복구 후 General Call Reset(0x00, 0x06)을 전송합니다.
EEPROM 페이지 쓰기 제한이란 무엇이고 왜 중요한가요?
직렬 EEPROM(AT24C256 등)은 내부적으로 고정 크기의 페이지로 구성됩니다(AT24C256의 경우 64바이트). 페이지 경계를 넘는 쓰기는 다음 페이지로 넘어가지 않고 같은 페이지의 시작으로 돌아와 데이터를 손상시킵니다. 한 페이지를 초과하는 쓰기를 수행할 때는 페이지 경계에서 쓰기를 분할하고 각 페이지 쓰기 사이에 필요한 쓰기 사이클 지연(24 시리즈 EEPROM의 경우 보통 5ms)을 삽입해야 합니다.