I2C(Inter-Integrated Circuit)
IIC, I2C, eye-squared-C, 는 모두 동의어이다.
IInter integrated Circuit 으로
SDA SCL 두개의 핀이 통신에 필요하다. (HW 핵심요소: Pull-Up VDD)
I2C 에서도 Master 와 다수의 Slave 들을 구성할수있다.
두개의 핀인 SCL SDA 에 다수의 Slave 를 구성한다면 제한된 HW 공간인 임베디드 상에서 매우 효율적인 구성일수있다.
I2C 는 Half-Duplex 방식으로 동시에 데이터를 보낼수 없기때문에 여러 Slave 를 공유하는 I2C 라인에서는
단순하고 버스 점유율이 낮은 디바이스들을 구성하는것이 좋다.
위 그림을 예로들면 Master 가 Slave 1 과 통신하고 있다면 동시에 Slave 2 와는 통신할수 없는것이다.
이 이야기는 포스팅의 마지막 부분에서 다시한번 이야기 하도록 하겠다.
위 그림을 보면 SCL 과 SDA 두개의 라인에 Pull-Up Register 을 달아두었다.
Pull-Up Register 을 사용한다는 것을 Hint 로 짐작가능한것은 I2C는 Open Drain 방식을 사용해야한다는 것이다.
만약 I2C 를 사용하는 Master 와 Slave 디바이스가 3.3V 전원을 사용한다면 풀업 3.3V 와의 Pull-Up 저항을 달아두면 통신이 가능하다. 5V 라면 풀업 5V 를 달면 된다. 원하는 환경의 I2C 디지털 신호를 정확하게 Master Slave 간에 주기 위함이다. I2C 구성을 하였지만 제대로된 Pull-Up 전원과 저항을 구성하지 않았다면 이런 부분을 참고하면 된다.
Master 가 특정 Slave 와 통신을 하기 위해서는 Slave Address 를 알아야한다.
Slave Address 는 Slave 장치의 Datasheet 상에 Slave 를 찾아야 한다.
(포팅시 Linux kernel 최근 버전에서는 Device Tree 상에 i2c 가 존재하고 해당 i2c 하기에 slave address 를 기록해 두면 된다.)
임베디드 시스템에서 중요한 I2C 통신에 대해서는 다수의 I2C Slave 대신에 전용 I2C 를 두어 Master 1: Slave 1 을 구성하는 경우가 있다. 주로 Image Sensor 의 I2C 들은 보통 1개의 Slave 만으로 동작을 시켜서 I2C 통신에서 여러 Slave 가 존재함으로 인해 발생할수있는 다중 접근 문제점을 미연에 방지할수있다.
필자는 전용 I2C 를 사용한 AP(SoC) 에서 I2C 가 6개 있다면 모두 사용하지만 왠만하면 같은 I2C 라인을 사용하지 않는것을 권장한다.
I2C 라인 자체가 2개의 핀을 사용하여 최대 127개의 Slave 를 이론상 구성할 수 있다고 해도 이렇게 사용하는 경우는 거의 없다고 본다. 임베디드 시스템에서는 목적에 맞는 HW/SW 의 구성/구현과 안정적인 동작이 최우선이다.
I2C 에 대해서는 포팅하는 가이드도 기획중에 있다.
추후 업데이트 하도록 하고 이번 포스팅을 마치도록 하겠다.
'Embedded > Device Driver' 카테고리의 다른 글
SDIO (0) | 2021.12.17 |
---|---|
SPI (0) | 2021.08.02 |
댓글