본문 바로가기
Embedded System/통신

[통신] I2C

by MachineJW 2023. 3. 8.

I2C 통신은 I Two C 또는 I Square C 라고 하며, Inter IC Bus의 약자이다.

이전에 공부했듯이 시리얼 통신 중에서도 동기식(데이터를 언제 주고받을지 규약됨) 통신 이며, I2C 통신의 경우 SCL(Serial Clock Line)과 SDA(Serial Data Line)을 가지며 통신한다.

데이터 라인이 1개이기 때문에 Rx/Tx를 동시에 할 수 없으니 반이중(Half Duplex) 통신 방식이다.

 

I2C 통신은 노이즈에 대한 취약성이 있어 외부 장치와의 통신 용도보다는 내부 시스템 IC 끼리 데이터 교환 용도로 사용된다.

임베디드 영역에서 MCU와 시스템 통신을 하는 방법 중에 거의 필수적으로 사용하는 방법 중에 하나이기도 하다. 대부분의 MCU에는 I2C 인터페이스를 가지고 있다.

1. 신호 라인 구성

https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/

I2C 통신을 사용하게 된다면 기본적으로 Master와 Slave가 있다. Slave에는 Master와 통신을 할수 있도록 각 고유의 주소 값으로 구분되어 통신한다. Master는 통신을 제어하는 역할 즉, 장치를 선택하여 데이터를 전송하거나 데이터를 요구하는 주체가 된다. (이는 대부분 MCU가 됨)

Slave는 반대로 제어를 받는 측으로 자체적으로 통신을 주관할 수 없으며 Master가 데이터를 요구할 때만 출력을 한다. 하나의 데이터 라인에 여러 개의 슬레이브가 연결되어 있어도 마스터에 의하여 슬레이브 주소로 선택되어 데이터가 요구되는 방식이므로 데이터 신호 충돌을 하지 않는다. (위와 같은 구성이 가능하다)

대부분의 경우 슬레이브 장치들을 연결하며 생기는 커패시턴스 때문에 통신 속도의 제약이 생겨 이론상 많은 장치연결은 불가능하다. 선로의 커패시턴스에 대하여 I2C 규격에서는 최대 400pF 정도의 로드 커패시턴스를 제약하고 있다.

2. 같은 주소의 슬레이브를 연결해야 하는 경우

https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/#3

디바이스마다 고유 I2C 주소 값을 변경해야 할 경우를 대비하여, 변경을 할 수 있도록 옵션을 만들어 놓았을 수도 있다. 위 사진은 OLED 디스플레이에서 납땜에 따라 주소의 값이 변경되는 옵션이다.

https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/#3

위와 같이 옵션이 제공되지 않는 경우 주소의 값을 변경하는데 제약이 있다.

그러나 위의 사진 처럼 I2C 멀티플렉서를 사용하면, 동일한 주소를 가진 슬레이브들과 통신이 가능하다.

위의 사진은 TCA9548A I2C Multiplexer 이다.

3. 데이터 신호의 구성

https://thestempedia.com/docs/evive/arduino-core-interface/iic/

I2C 데이터의 전송은 START 비트에서 STOP비트로 묶어서 하나의 통신이 이루어진다.

파형에서 규칙은 START/STOP 비트 조건을 제외하고는 클럭(SCL)이 HIGH인 상태에서 절대로 데이터 신호가 변하면 안된다. 만약, 클럭 신호가 HIGH인 상태에서 데이터 신호가 변하면 슬레이브 장치는 START 또는 STOP 신호로 인식하여 오동작하게 된다.

START BIT

START 조건은 마스터가 SCL이 HIGH인 상태에서 SDA의 신호를 HIGH에서  LOW로 만드는 동작이다.

슬레이브는 이를 START 신호로 받아들여 통신 준비를 한다.

7bit의 SLAVE ADRESS( A6 ~ A0 )

다수의 슬레이브 장치가 연결되는 경우 어떤 장치에게 데이터를 전송할지 선택한다.

I2C통신은 7비트의 슬레이브 고유 주소를 함께 전송하여 슬레이브를 선택하게 된다.

R/W BIT

다음 동작이 READ 동작인지 WRITE 동작인지를 표시하는 비트이다.

READ 동작은 HIGH(1), WRITE 동작은 LOW(0)으로 출력한다.

ACK BIT

I2C 통신은 ACK 비트신호로 통신이 잘 이루어 지는지 확인한다. 이 비트는 데이터를 받는 쪽에서 출력한다.

마스터가 출력하는 주소와 R/W의 응답 신호는 이를 받는 해당 주소의 슬레이브 장치가 다음 클럭에서 ACK를 LOW해야 한다. 아무런 장치가 연결되어 있지 않아 반응이 없다면 데이터라인의 풀업 저항으로 HIGH가 되므로 이 신호는 NACK가 되어 마스터는 이를 판단한다.

DATA

READ/WRITE 비트로 결정되는 동작모드에 따라서 WRITE 동작이라면 슬레이브는 클럭 신호에 동기하여 1비트 단위로 1바이트 데이터를 취득하여 처리한다. READ 동작일 경우 슬레이브는 클럭에 동기하여 해당하는 바이트를 1비트 단위로 출력하게 된다.

STOP BIT

STOP 조건은 마스터가 SCL이 HIGH인 상태에서 SDA의 신호를 LOW에서 HIGH로 만드는 동작으로, 슬레이브는 이를 STOP 신호로 받아들여 통신을 종료한다.