Embedded System/AVR

[AVR] I2C(TWI) 통신

임베지수 2017. 4. 2. 14:47

  I2C(Inter-Intergrated Circuit) 통신은 필립스에서 개발한 직렬 컴퓨터 버스이며 저속의 주변 기기를 연결하기 위해 사용된다. Atmel에서는 TWI(Two-Wire Serial Interface)라고 하는데 통신에 필요한 선이 겨우 2개만 있으면 되기 때문이다. 처음에 I2C 통신을 공부하기 전에는 서로 뭔가 다른게 있을 줄 알았는데 알아보니까 완전히 같은거라고 한단다. -_-; 사람 헷갈리게시리...

 

  AVR에서는 I2C통신으로 128개의 서로 다른 디바이스와 통신할 수 있다고 나온다. 이는 디바이스의 주소가 7bit이기 때문이란다. 기본적인 구조는 다음과 같다.

 

 

  위 그림에서 보이듯 SDA라는 Data Bus와 SCL이라는 Clock Bus로 디바이스가 연결된다. Bus에 연결된 모든 디바이스는 각각의 주소를 가지고 있어서 서로 다른 디바이스임을 알 수 있다. 그리고 각 Bus에는 풀업저항이 달려있는데 Open Collector로 접속되어 있기때문에 달려있다고 나온다. Open Collector가 뭐인고? 전자회로 다시 공부해야겠다.

 

 

  Output부분이 콜렉터에서 나오는데 아무것도 연결되지 않아서 Open Collector라고 한다. 베이스에 High가 들어오면 Tr이 ON이 되고 Output은 Low가 된다. 하지만 베이스에 Low가 들어오면 Tr은 OFF가 되어서 Output이 High도 아니고 Low도 아닌 Open 상태(or HIGH-Z)가 된다. 따라서 출력에 High상태를 만들어 주기 위해 풀업저항을 단다고 한다. 자세한건 오른쪽 눌러서 확인. 클릭

 

 

이제 데이터 전송 방식을 보자. I2C통신은 하나의 클럭에 하나의 데이터를 보내는 방식으로 전송된다.

 

  그리고 데이터를 전송할 때는 주소를 먼저 보내고 데이터를 보내게 된다. 주소를 먼저 보내야 받을 놈(디바이스)이 자기 것인지 남의 것인지를 구별하기 때문이다.

 

  위 그림에서 보면 ACK라는 것이 있는데 이건 Acknowledge의 약자인데 네이버에 검색해보면 3번 뜻에 "받았음을 알리다" 라고 나온다. 즉 데이터를 보내고나서 보낸놈이 "받았나?"라고 물어보면 받은놈이 "받았음ㅇㅇ"라고 해주는 거란다.

 

 

나는 I2C 통신을 사용하는데 의의가 있으므로 이론적인 설명은 여기까지 하고 레지스터를 살펴보겠다.

사용될 레지스터는 TWBR, TWCR, TWSR, TWDR, TWAR이다. 순서대로 살펴보자~

 

먼저 TWBR, TWI Bit Rate Register이다. 즉 비트레이트를 설정해주는 레지스터이다.

 

 

 

TWI의 통신속도는 최대 400kHz이다. 거기에 맞춰주면 되는데 밑에 공식에 나와있는대로 하면 된다.

난 짱이니까 최고속도로 400kHz를 만들겠다. CPU클럭은 16Mhz이니까 TWBR이 12이고 TWPS가 0이면 된다.

  => 16Mhz / (16 + 2*12*4^0) = 400kHz

 

 

다음은 TWCR, TWI Control Register 이다. 말그대로 TWI 통신을 컨트롤해주는 레지스터다.

 

7번 비트 TWINT는 TWI Interrupt Flag다.