그라운드 임베디드 유튜브 구독

노트 / 통신 프로토콜

I2C: 선 두 가닥에 여러 칩 달기

SCL과 SDA 두 선, 7비트 주소, ACK, 풀업 저항. 센서 통신의 표준인 I2C의 동작과 막혔을 때 푸는 법.

GROUND EMBEDDED · 정리 노트통신 05I2C 1START → 주소(7비트)+W → ACK → 레지스터 번호 → ACK 2→ 재START → 주소+R → ACK → 데이터 → ACK … → 마…

구조

모든 칩이 SCL(클럭), SDA(데이터) 두 선을 공유하고, 선은 오픈드레인 + 풀업 저항입니다. 누구든 선을 LOW로 당길 수 있고, 아무도 당기지 않으면 풀업이 HIGH로 만듭니다.

한 번의 읽기

START → 주소(7비트)+W → ACK → 레지스터 번호 → ACK
→ 재START → 주소+R → ACK → 데이터 → ACK … → 마지막 데이터 → NACK → STOP
  • ACK: 받은 쪽이 9번째 클럭에 SDA를 LOW로 당겨 "받았다"고 알림
  • 주소에 해당하는 칩이 없으면 NACK가 오고, 이것으로 연결 확인(I2C 스캔)을 할 수 있음

풀업 저항 고르기

너무 크면 너무 작으면
상승 에지가 느려 고속에서 깨짐 칩이 LOW로 당기는 전류 한계 초과

100kHz는 4.7~10kΩ, 400kHz는 2.2~4.7kΩ가 보통입니다. 버스 커패시턴스(선 길이, 칩 수)가 크면 더 작게 합니다.

클럭 스트레칭

슬레이브가 준비가 덜 되면 SCL을 LOW로 붙잡아 마스터를 기다리게 할 수 있습니다.

버스가 멈췄을 때

통신 도중 MCU가 리셋되면 슬레이브가 SDA를 LOW로 붙잡은 채 멈출 수 있습니다. 시작할 때 SCL을 GPIO로 9번 토글해 슬레이브를 풀어 주는 버스 복구 코드를 넣어 둡니다.