3.23. I2C 기초

I2C(Inter-Integrated Circuit, “I-제곱-C” 또는 “I-투-C”라고 읽음)는 같은 보드 상의 칩 간 근거리 연결을 위해 설계된 2선 직렬 버스입니다. 우선순위 면에서 SPI와 UART 사이에 위치합니다. SPI보다 느리지만 핀을 더 절약하며, SPI가 장치마다 전용 CS 라인을 필요로 하는 것과 달리 주소 지정 방식(같은 두 선에 여러 장치 연결)을 씁니다.

I2C는 가속도계, 온도 센서, 습도 센서, 자력계, 실시간 클록, EEPROM 같은 저속 센서에 적합한 버스로, 순수 처리량보다 핀과 버스 복잡성을 줄이는 것이 더 중요한 경우에 쓰입니다.

3.23.1. 두 개의 선, 둘 다 오픈 드레인

I2C 버스에는 단 두 개의 신호만 있습니다:

  • SCL(직렬 클록). (대부분의 경우) 컨트롤러가 구동합니다.

  • SDA(직렬 데이터). 현재 통신 중인 장치가 구동합니다. 주소 전송과 송신 데이터 동안에는 컨트롤러가, 읽기와 ACK 비트 동안에는 주변장치가 구동합니다.

두 라인 모두 오픈 드레인입니다. 버스 상의 모든 장치는 라인을 접지로 끌어내릴 수 있지만 결코 하이로 구동하지는 않습니다. 버스의 풀업 저항 두 개(일반적으로 공급 레일로 2.2 에서 10 )가 아무도 라인을 끌어내리지 않을 때 라인을 하이로 끌어올립니다. 와이어드-OR 동작은 여기서 비롯됩니다. 라인을 로우로 당기는 장치가 이기고, 하이 상태는 단지 “아무도 말하고 있지 않음”을 의미합니다.

MCU의 SCL 및 SDA 핀에 있는 내부 풀업은 대개 그 자체만으로 버스 풀업 역할을 하기에는 충분히 강하지 않습니다. 보통 버스에 외부 저항이 필요합니다. 많은 센서 브레이크아웃 보드에는 이미 풀업이 포함되어 있으니, 더 추가하기 전에 데이터시트를 확인하세요.

3.23.2. 트랜잭션

모든 I2C 트랜잭션은 동일한 형태를 따릅니다:

SCL과 SDA 파형. SCL이 하이인 동안 SDA가 떨어지고 (START), 그다음 SCL이 SDA 상의 바이트를 클로킹합니다. 읽기/쓰기 비트와 ACK가 있는 7비트 주소 바이트, 그다음 레지스터 바이트와 ACK, 그다음 데이터 바이트와 NACK, 그다음 SCL이 하이인 동안 SDA가 상승합니다(STOP).

I2C 트랜잭션: START, 7비트 주소 + R/W, ACK, 레지스터, ACK, 데이터, NACK, STOP.

교환은 비트 단위로 진행됩니다:

  • START. 컨트롤러가 SCL이 아직 하이인 동안 SDA를 로우로 당깁니다. 이 비정상적인 에지는 버스 상의 모든 장치에 트랜잭션이 시작되려 함을 알립니다.

  • 주소 + R/W. 컨트롤러가 7비트 주변장치 주소에 이어 하나의 읽기/쓰기 비트(쓰기는 0, 읽기는 1)를 클로킹해 내보냅니다.

  • ACK / NACK. 모든 바이트 뒤에 수신측이 한 클록 동안 SDA를 구동하여 ACK(로우) 또는 NACK(하이)를 보냅니다. 주소 바이트의 경우 주변장치는 자신의 주소를 인식하면 ACK를 보냅니다. 어떤 장치도 ACK를 보내지 않으면 컨트롤러는 NACK를 보고 해당 주소가 버스에 없음을 압니다.

  • 데이터 바이트. 각 바이트 뒤에 수신측의 ACK가 따라옵니다. 쓰기에서는 주변장치가 각 바이트에 ACK를 보내고, 읽기에서는 컨트롤러가 더 받고 싶은 각 바이트에 ACK를 보내고 마지막 바이트에 NACK를 보내 주변장치에 중단하라고 알립니다.

  • STOP. 컨트롤러가 SCL이 하이인 동안 SDA를 하이로 놓아 트랜잭션을 종료합니다.

반복 START는 중간에 STOP 없이 발행되는 두 번째 START입니다. 컨트롤러가 버스를 놓지 않은 채 같은 주변장치에 대해 방향을 전환합니다(쓰기 주소, 그다음 읽기 주소).

3.23.3. 주소 지정

7비트 주소 공간은 0x08에서 0x77까지를 다룹니다. 양 끝의 값은 특수 용도로 예약되어 있습니다. 각 장치의 주소는 칩 설계자가 정하며, 많은 부품은 하위 비트 몇 개를 보드 레벨에서(핀을 하이나 로우로 묶어서) 변경할 수 있게 하여 같은 센서 두 개를 같은 버스에 둘 수 있도록 합니다.

두 장치가 주소를 공유하면 다른 장치의 간섭 없이 그중 하나와 통신할 방법이 없으므로, 부품을 짝지어 사용하기 전에 데이터 시트를 확인하세요. i2c.scan()(코드에서의 I2C에서 다룸)은 주소 공간을 순회하며 어떤 주소가 응답하는지 보고하는데, 이는 버스에 무엇이 연결되어 있는지 알아내는 표준적인 방법입니다.

3.23.4. 장점과 단점

이 버스의 장점과 단점이 그 적합한 영역을 결정합니다:

  • 많은 장치를 위한 두 핀. 단일 SCL/SDA 쌍이 십여 개의 센서를 수용할 수 있습니다. SPI는 장치마다 추가 CS 핀이 필요합니다.

  • 표준 속도. 100 kHz(“표준 모드”)와 400 kHz(“고속 모드”)가 거의 모든 센서를 다룹니다. 1 MHz도 도달 가능하지만 버스 정전용량과 풀업 크기에 더 많은 것을 요구하기 시작합니다.

  • SPI에 비해 느림. 초당 수백 킬로비트 이상을 옮기는 작업은 SPI를 원합니다.

  • 주소 충돌. 같은 버스에 동일 주소를 가진 두 장치가 있는 것은 프로토콜이 해결할 수 없는 하드웨어 실수입니다.