I2C 는 무엇인가?
내가 알게된지는 얼마안되지만, 시리얼 포트 다음으로 오래되었다고 한다. 필립스에서 최초로 개발한 통신디바이스로서 SDA 와 SCK 로 컨트롤 할 수 있다.
'처음 볼때는 아주 간단하네~' 하고 비웃을지도 모르겠다. 하지만, 말처럼 그리 쉽지는 않다. SDA 와 SCK 에 대해서 좀더 자세히 알아보자!!
SDA | 데이터와 어드레스를 전달하는 통로 |
SCK | I2C 클럭을 보내는 통로 |
기존의 플래시나 PCMCIA 와 다른 점이 있다면, SDA 의 존재이다. 하나의 선에 데이터정보와 어드레스정보를 보내기 때문이다.
참고로 플래시의 경우 데이터버스와 어드레스 버스가 따로 존재했다. 그렇다면, 슬레이브에서는 어떻게 데이터와 어드레스를 구분해낼 수 있을까?
흔히 I2C 는 마스터와 슬레이브로 나뉜다. 마스터는 어드레스를 보내고, 명령을 내리는 쪽을 가리키고 여기서는 CPU 가 해당한다.
슬레이브는 마스터가 요청하는 것에 대해 확인하는 ACK 신호를 보내고, 원하는 데이터 값을 마스터로 보내는 역할을 한다. 여기서는 SII178 이 해당한다.
답부터 말하자면, 이것은 I2C 디바이스마다 다르다. 예를 들어 DVI 디바이스인 SII178 의 경우, read 시에는
Slave Address + Register Address + Slave Address + Read 한 Data 값 |
이런식으로 데이터와 어드레스를 보낸다. 각각의 어드레스 사이에는 받았다는 신호를 ACK 로 마스터에 보내서, 마스터가 다음 어드레스 주소를 보낼 수 있게 한다. write 시에는
Slave Address + Register Address + Write 할 Data 값 |
역시 이렇게 보낸다. 이것은 어디까지나, SII178 의 경우다. 어떤 디바이스가 I2C 에 붙는 가에 따라서 얼마든지 달라질 수 있다.
위에서 나온 Address 들을 예를 들어 설명해보겠다.
Slave Address | 흔히 Chip ID 라고 한다. 이 ID로 디바이스가 결정되기 때문에 유일해야 한다. |
Register Address | 읽거나 쓸 어드레스 주소 |
ACK | 한 바이트를 보내고, 슬레이브에서 제대로 수신했다는 응답의 신호 |
보면 알겠지만, Write 보다 Read 가 좀더 복잡하다. 다시 말해 Read 동작은 Write + Read 라고 보면 된다. 또한 내가 예를 들어 설명한 것들은 Chip 의 데이터시트에 보면 나와있다.
그렇기 때문에 항상 어떤 디바이스든 콘드롤 하기 위해서는 반드시 데이터시트를 필독해야 한다.
Chip ID 주의할 점(SII178 의 경우)
앞에서 말했지만, Chip ID 는 데이터 시트에 나와 있다고 했다. 이것 어디까지나 보편적인 경우다. 각 디바이스마다 공통적이지는 않다. EEPROM 의 경우, 하드웨어 연결상태에 따라서 Chip ID 를 설정하도록 했다. 참고로 SII178 의 경우, 0x72 라는 값을 구체적으로 명시했다.
SII178 의 경우 0x72(01110010) 를 read 시에는 가장 마지막 bit 0 을 0으로 세팅해야 하고, write 시에는 bit 0 을 1 로 세팅해야 한다.
프로그램에서 주의할 점(ST5517ref)
ST 의 경우 어떤 디바이스든지, init 하고, setup , open 하는 식으로 초기화 과정을 거친다.
i2c_open() 는 open 시에 호출되어지는데, 이때, chip id 가 인자값으로 들어간다. 이때 주의해야 한다. 앞에서 데이터시트에서 명시된 0x72 값을 넣었다면, 제대로 된 어드레스 신호가 나가지 않을 것이다.
왜냐하면, 한 비트씩 왼쪽으로 쉬프트된 값을 써주어야 하기 때문이다. 예를 들면, 0x72 를 넣었다면,
0x72 = 01110010 → 오른쪽으로 쉬프트 → 00111001 → 0x39 |
0xE4 = 11100100 → 오른쪽으로 쉬프트 → 01110010 → 0x72 |
결국 chip id 에 0xE4 를 써주어야만 우리가 원하는 0x72 라는 값을 내보낼 수 있다.