brunch

You can make anything
by writing

C.S.Lewis

by 이경종 Mar 27. 2020

Ch4-3. I2C 통신 프로토콜

주변기기 및 통신 I/O

임베디드 디바이스에서 I2C만큼 CPU주변장치(Peripheral device)들과 통신에 독보적인 존재는 흔하지 않다. 100Kbps 이상 400Kbps 이하의 저속통신의 경우 I2C가 많이 사용된다. 실제 순수한 데이터가 아닌, 데이터를 보내기 위한 제어신호(control signal)를 송수신한 부분 역시 I2C가 많이 사용된다.

 

보통 I2C 통신속도는 100Kbps이며, 고속 I2C를 지원하는 기기의 경우 400Kbps까지 속도를 낼 수 있다.

많은 주변기기(Peripheral device)들이 메인 프로세서(SoC) 내지는 다른 주변기기들과 I2C로 통신을 하며, 대부분의 SoC들은 한두개 이상의 I2C 포트를 제공한다.


I2C가 널리 사용되는 이유는 단순하기 때문이다. 그래서 실제 데이터통신을 다른 방식으로 처리하는 기기들에서 제어신호 처리는 I2C로 하는 경우가 많다. 집에 있는 TV와 셋톱박스를 연결하는 HDMI 케이블이 대표적인 경우다.


각설하고, I2C 안으로 들어가보자.

I2C는 Inter-Integrated Circuit의 약자다. I2C를 TWI(Two Wire Interface)라고 부르기도 한다. Two wire라는 단어에서 짐작해듯이, I2C는 두개의 라인을 통신에 사용한다. 데이터를 주고 받기 위한 SDA와 타이밍동기화를 위한 클럭(Clock) 라인인 SCL 이다.


클럭이 있다는 것에서 눈치 깠겠지만, I2C 는 동기화 통신이다.(동기화 통신이 무엇인지는 Ch4-1을 참조하시라). I2C는 마스터(Master)와 슬레이브(Slave) 간 통신 구조다. 마스터와 슬레이브가 SCL에 동기화하여 SDA로 데이터를 주고 받는 것이다. 하나의 마스터에 여러개의 슬레이브가 붙을 수있다. 


통신 라인을 공유하므로, 한번에 단방향의 통신만 가능하다. 즉, 마스터와 하나의 슬레이브간 통신이 이루어지고 있을때 다른 슬레이브들은 대기 상태다. 마스터는 통신하는 슬레이브를 선택함으로써 통신을 제어한다.


I2C의 SCL과 SDA가 어떻게 작동해서 데이터를 전송하는지,  I2C의 타이밍 다이어그램을 살펴 보자.

미리 말해두지만,  I2C slave의 디바이스 드라이버를 직접 다루는 개발자가 아니라면, 이 내용을 확실히 이해할 필요는 없다. 마스터로써 I2C 슬레이브를 제어하는 것은 대부분 SoC의 SDK패키지에서 제공하는 API를 사용하면 되므로, 타이밍 다이어그램은 이해하지 않아도 상관없다. 


SCL은 항상 마스터의 출력이다. SDA는 데이터의 방향에 따라 마스터의 출력일수도 있고, 슬레이브의 출력(즉 마스터의 입력)일수도 있다.


I2C 통신에서 주요한 것은 start condition(시작조건)과 stop condition(종료조건)이라는 것이 있다는 것이다. start condition은 데이터전송을 시작할때 필요하고, start condition은 말 그대로 데이터 전송을 끝낼때 사용한다.


단순히 SDA, SCL 라인을 올리거나 내림으로써 start condition과 stop condition을 만들어낸다.

SCL이 active high인 동안 SDA가 active high에서 low로 바뀌는 것이 start condition이고, 

SCL이 active high인 동안 SDA가 active low에서 high로 바뀌는 것이 stop condition이다.

이 동작을 감지함으로써 I2C 통신 버스의 소유와 반납을 다른 장치들이 알 수 있게 된다.


마스터가 다수의 슬레이브를 어떻게 식별해서 통신할 수 있을까?

슬레이브는 각기 고유한 주소를 가지고 있다. 이 주소값은 7비트로, 이론상 하나의 마스터에 128개의 슬레이브까지 붙을 수 있다. I2C 확장형에서는 11비트의 주소값이 사용되기도 한다(실제 현업에서 개발을 하면서 11비트 주소값을 지원하는 I2C slave를 본 적은 없다.  I2C 주소값으로는 7비트를 쓴다고 보면 된다. 혹시 누구 그렇게 써보신 분 제보 바람)

마스터에서 주소를 전송하고, 통신 버스 제어권을 넘기면 슬레이브들은 자기 주소인 경우 마스터에 ack(응답)를 전송하고 데이터가 교환되는 구조다.


마스터에서 7비트 주소를 전송하고 나서 마지막 8번째 비트는 읽기인지 쓰기인지를 알려주는 비트다. 8번째 비트가 0이면 마스터가 슬레이브로 데이터를 내보내는 것이고(쓰기), 1이면 마스터가 슬레이브로부터 데이터를 읽어가는 것이다. 따라서 그 다음에 전송되는 Data 바이트는 마스터의 출력일수도 있고, 입력일수도 있다.


I2C 주소는 해당 슬레이브 디바이스의 데이터시트에 나와있다. 다른 I2C 디바이스들과 주소가 중복되는 것을 막기 위해, 보통 몇가지 값을 사용자가 지정할 수 있도록 되어 있다. 아래 그림과 같은 예를 들 수 있다. 아래 그림의 슬레이브 디바이스의 경우에는 Pin15라는 핀에 연결된 저항값에 따라 주소값이 결정되게 된다.

그런데 표에 나온 주소값이 이상하지 않은가? 아무 생각없이 글을 읽고 있다면, 모르겠쥐요....ㅎㅎ

분명 주소값은 7비트라고 했는데, 위 표에서 저항이 120K인 경우 주소값이 0xF8로 표시되어 있다. 이는 2진법으로 표현하면 1111_1000으로 8비트를 다 쓰고 있는 셈이다. 

왜냐하면 이 주소값의 경우는 R/W 비트를 포함한 8비트를 다 나타내고 있기 때문이다. 마지막 비트가 0이므로, 이 주소값은 쓰기인 경우의 주소값이다. 만약 마스터가 읽기로 동작한다면 주소값은 0xF9가 되는 것이다. 결국 이 슬레이브 디바이스의 I2C 주소는 0xF8이 아니라, 상위 7비트인 0x7C(0111_1100)가 실제 주소다. 이해했죠잉?


어떤 디바이스의 데이터시트를 보면, 7비트로 주소값을 나타낸 것들도 있고 8비트로 표시한 것들도 있다. 헷갈릴수 있다. 필자도 여전히 가끔씩은 엉뚱한 I2C 주소로 코딩해놓고, 왜 통신이 안되는지 고민할 때가 있다^^;;


그림 및 자료 출처: https://elecs.tistory.com/11   https://mintnlatte.tistory.com/201


       YES24 링크 / 교보문고 링크



작가의 이전글 Ch4-2. PIO와 pin muxing
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari