I2C(Inter-Integrated Circuit)는 저속의 직렬 통신 방식으로, 마이크로컨트롤러(MCU) 및 주변장치(센서, 디스플레이, EEPROM 등) 를 연결하는데 사용되고 있는 프로토콜이다.
I2C는 보통 두개 (SCL,SDA)의 선을 사용하여 여러가지 장치를 동일한 버스에 연결할 수 있는 특징이 있다.
- SCL(Serial Clock Line): 클럭 신호를 보내는 선입니다. 이 클럭 신호에 맞춰 데이터가 전송됩니다.
- SDA(Serial Data Line): 데이터가 전송되는 선입니다. 각 장치 간의 데이터 전송은 이 선을 통해 이루어집니다.
I2C의 주요 특징
- 마스터-슬레이브 구조: I2C 버스에는 마스터와 슬레이브가 있습니다. 마스터는 클럭 신호를 제어하며 슬레이브와 통신을 시작하고 종료할 수 있습니다. 마스터는 여러 슬레이브와 통신할 수 있으며, 슬레이브는 고유의 주소를 가져야 합니다.
- 동기식 통신: I2C는 클럭 신호(SCL)를 사용하여 통신하는 동기식 통신 방식입니다. 이로 인해 마스터가 클럭을 제공하여 데이터를 읽고 쓰는 타이밍을 제어합니다.
- 멀티 마스터: I2C는 여러 마스터가 동일한 버스에서 통신할 수 있는 멀티 마스터 기능을 지원합니다. 하지만 동시에 두 마스터가 데이터를 전송할 수는 없으며, 충돌이 발생할 경우 충돌 감지가 가능합니다.
- 다중 장치 지원: I2C 버스에는 여러 슬레이브 장치를 연결할 수 있으며, 각 슬레이브는 7비트 또는 10비트 주소를 가집니다. 마스터는 이 주소를 사용하여 특정 슬레이브와 통신합니다.
통신 순서
- 시작(Start): 마스터가 SDA 라인을 LOW로 설정하고, 클럭 신호(SCL)를 LOW로 내리는 순간 통신이 시작됩니다.
- 주소 전송: 마스터는 슬레이브의 주소와 읽기/쓰기 비트를 전송합니다.
- 데이터 전송: 슬레이브는 데이터를 전송하거나 데이터를 수신합니다. 데이터는 8비트씩 전송되며, 각 바이트 이후에 확인 신호(ACK)가 전송됩니다.
- 종료(Stop): 모든 데이터 전송이 완료되면 마스터가 SDA 라인을 HIGH로 설정하고, SCL을 HIGH로 올려 통신을 종료합니다.
제가 이번에 I2C 통신을 이용해서 활용해본 것은 Jetson 보드에 연결된 GPIO Expender 입니다.
I2C 통신으로 해당 장치에 명령을 내려 GPIO 상태를 High 또는 Low 로 변경할 수 있으며 LED 장치 등을 컨트롤 하는데 주로 쓰입니다.
Jetson agx xavier industrial 보드에 Texas Instrument 사의 TCA9539 모델을 I2C 통신으로 연결하여 사용하였습니다.
TCA9539의 구성은 간단하게 하기 사진과 같으며 I2C로 연결되어 명령어를 수신받아 작동하며 총 18개의 GPIO 신호를 셋팅할 수 있다.
I2C 연결을 시험해보기 위해서 가장 중요한건 Slave 장치의 주소를 알아야한다.
보통 장치의 데이터시트에 나와있다.
TCA9539 모델의 I2C Slave 주소는 다음과 같다.
같은 I2C 버스내에 주소가 같은 Slave 장치가 있을 수 있기 때문에 A1 및 A0 핀을 활용하여 주소를 4가지로 변경할 수 있는데, 기본인경우 0x74를 사용한다.
다음은 레지스터 주소를 살펴보았다.
0번 ~ 7번까지의 Output Port는 0x02 를 활용하면되고, 8~15번 Output Port는 0x03을 활용하면 된다.
해당 자리의 비트가 1이면 high, 0 이면 low 이다.
다만, 여기서 주의해야할 점은 Configuration port 설정이 이다.
해당 포트를 input으로 활용할건지 output으로 설정할건지 정할 수가 있는건데 0인경우 output 1인경우 input으로 설정된다.
POWER-UP DEFAULT가 1인관계로 output으로 설정하고싶다면 0으로 바꿔주자
Jetson 보드에서 I2C 통신을 시험해보기 위해 i2c-tools 패키지를 설치하였다.
i2c-tools 패키지 명령어 사용법
i2cset [-f] [-y] I2CBUS SLAVE_ADDRESS REGISTER [VALUE] [MODE]
- I2CBUS: I2C 버스 번호를 지정합니다. 예를 들어, /dev/i2c-1 장치가 버스 1이라면 1을 입력합니다.
- SLAVE_ADDRESS: I2C 슬레이브 장치의 주소입니다.
- REGISTER: 설정하려는 레지스터의 주소입니다.
- VALUE: 설정할 값입니다.
- MODE: 전송할 데이터의 형식을 지정할 수 있습니다. 기본적으로는 바이트(byte)를 사용하며, w를 사용하여 워드(word)를, c를 사용하여 블록 전송(block transfer)을 할 수 있습니다.
- -y: 이 플래그는 사용자에게 확인을 요구하지 않고 바로 명령을 실행하도록 만듭니다.
- -f: 커널의 드라이버가 I2C 장치를 사용 중일 때 강제로 통신을 시도할 수 있게 해줍니다.
i2c-tools를 활용하여 레지스터의 값을 읽어본결과 데이터시터에서 설명한대로 POWER-UP DEFAULT값이 설정되어 있다.
해당값을 0x00 으로 변경하고 다시 값을 읽어 확인해 보았다.
LED가 정상적으로 작동되는것을 확인했다 !
0x00 이 아니고 0x03(0000 0011), 0xf7(1111 0111) 등 특정 LED 키는것도 정상 동작한다.
'개발일지' 카테고리의 다른 글
Jetson 에서 Yocto Linux 탑재하기 [2] (0) | 2024.10.25 |
---|---|
Jetson 에서 Yocto Linux 탑재하기 (0) | 2024.10.24 |
Jetson과 NVRAM 간의 SPI 통신 [2] (0) | 2024.10.07 |
Jetson과 NVRAM 간의 SPI 통신 [1] (1) | 2024.10.07 |
YOCTO Project 란 ? (4) | 2024.09.26 |