본문 바로가기
Communication Interface&Protocol/시리얼 통신

시리얼 통신 : I2C(IIC)

by 누워있는말티즈 2022. 9. 2.

Inter-Integrated Circuit

I2C 통신은 총 4개의 연결선(VCC, GND, SCL, SDA)으로 구성된 half-duplex communication의 종류이다. 한 개의 마스터(Master)에 여러 개의 슬레이브(Slave)를 연결하여 신호를 송수신할 수 있으며 각 Slave는 특정한 주소로 구분하게 된다. 이 때의 주소를 I2C 주소라고 부르게 된다.

UART처럼 통신을 위해서는 2개의 선을 사용하지만 SCL은 Serial Clock을 의미하며 SDA는 Serial Data로 SCL선은 clock 동기화를 위해 사용되어 실제 데이터를 송수신하는 것은 하나의 SDA 선이다.


SCL : 마스터와 슬레이브의 데이터 통신을 위한 클럭을 맞춘다. SCL은 기본적으로 풀업 저항에 의해 HIGH 상태로 SCL이 HIGH인 상채에서 SDA만 LOW로 떨어지면 시작 신호(S)호 판단한다. 이후 SCL을 통해 Clock 신호가 생성된다.

SDA : 통신하고자 하는 데이터를 포함하며 SCL이 LOW일 때 송수신이 가능하다. 데이터를 읽을 때와 쓸 때의 packet 구조가 다르다. 전송할 때마다 ACK bit이 포함된다.

write 명령의 경우

read 명령의 경우

마스터의 Data 비트에는 슬레이브에서 얻고자 하는 내용의 command code가 작성된다. 해당 command는 사용하는 센서의 datasheet를 보면 보통$I^2C$ interface라고 적힌 부분의 register map에서 찾을 수 있다. 예시로 범용적으로 많이 사용하는 MPU-9250 센서의 시트를 살펴보자.

Resister map 일부를 가져왔다. 여기서 보면 레지스터 주소는 16진수로 표현된느 것을 확인할 수 있다. 즉, 0x13(16진수의 int는 int로 선언한 뒤 수 앞에 0x를 붙인다.)은 XG_OFFSET_H의 의미를 가지며 이는XG_OFFSET의 HIGH 8비트를 나타낸다[15:8]. 이처럼 뒤에 _L, _H가 붙는 경우는 보통 데이터가 8비트로 부족해 16비트를 사용하기 위해 앞 8비트와 뒤 8비트로 나누어 읽는 경우이다. 이러한 레지스터 주소는 데이터시트에서 확인하고 센서 드라이버 헤더 파일에 정의해주는 것이 일반적이다.

MPU9250.h

여담으로 MPU9250의 I2C 주소는 0x68이 기본이지만 보드에 존재하는 AD0 핀을 VCC로 연결해주면 주소가 0x69로 바뀐다. 이를 이용하여 2개의 MPU9250을 동시에 사용할 수 있다.

다양한 시중 MCU에서 I2C 기능을 구현해두었다. 아두이노의 경우 아날로그 A4(SDA), A5(SCL), 라즈베리파이의 경우 GPIO 3(SDA), 5(SCL)이다.

Debian 계열의 embeded linux 시스템 상에서 아래의 명령을 통해 연결된 장치의 I2C 주소를 확인할 수 있다.

*아래에서 ‘1’은 사용하는 MCU마다 다를 수 있다! 내장 I2C bus가 다르기 때문

sudo i2cdetect -y 1
반응형

'Communication Interface&Protocol > 시리얼 통신' 카테고리의 다른 글

시리얼 통신 : UART  (0) 2022.11.11
시리얼 통신 : MODBUS  (0) 2022.09.03
시리얼 통신 : UART  (0) 2022.09.02
시리얼 통신 (개요)  (0) 2022.08.31

댓글