I2C(TWI) 통신

임베디드/MCU 2014. 7. 24. 16:12

 오랜만에 MCU를 다루게 되면서 처음으로 I2C 통신을 사용하는 부품을 쓰는 일이 생겨 무려 3일동안 I2C에 대해 연구를 해보았습니다. 맨 처음엔 TivaWare에 들어있던 I2C 예제를 복붙해서 그냥 빌드시켜 프로그램을 실행해 보았는데 프로그램 구동 자체가 되지 않는 것을 확인하고는 상당히 시간을 많이 들여 공부해야 되겠다는 생각이 들더군요.

 직접 오실로스코프를 사용하여 화면에 나오는 값들을 일일해 측정하며 I2C 통신의 동작원리를 이해하였고 소스코드도 일일히 하나씩 써 가며 파형이 어떻게 달라지는지를 확인한 결과 드디어 센서가 정상적으로 동작함을 확인할 수 있었습니다.

 이후에 I2C를 공부하게 될 사람들에게 조금이나마 도움을 드리고자 I2C 통신에 처음으로 입문하시는 분들께 큰 힘이 되기를 바랍니다.


 I2C는 Inter Integrated Cricuit의 줄임말로 TWI(Two Wire Interface)라고도 불립니다. I2C 통신의 가장 큰 장점은 바로 단 2가닥의 선으로 여러 대의 기기와 연결하여 통신이 가능하다는 점입니다.



 위 그림에서 보았을 때 I2C 통신은 2종류의 주체로 나눌 수 있습니다. 통신의 중심이 되는 Master와 통신을 하고자 하는 주변 기기를 Slave로 설정할 수 있습니다. 일반적으로 mcu 1대와 여러대의 I2C 통신을 지원하는 기기와 연결할 경우 Master 1대와 Slave 여러대로 통신이 가능합니다. 물론 Master는 2대 이상도 가능하다.


 I2C에서 사용되는 두 선은 SDA와 SCL로 구성되어 있습니다. 통신이 개시되었을 때 SDA는 데이터를 주고 받는 역할을 하고 SCL은 동기화를 위한 CLOCK 역할을 합니다. 여기서 Master와 Slave 각각에 SDA와 SCL을 바로 연결해주기만 하면 되는 것이죠. 그러나 이러한 회로만으로는 오픈 드레인(회로에 + 전압이 걸리지 않는 상황) 상태가 되기 때문에 SDA와 SCL 회로에 풀업 저항(Pull-up resistor)을 달아 전압을 공급해 줘야 합니다. 풀업 저항에 대해 자세히 알고 싶으신 분은 아래 블로그를 참조해 주시길 바랍니다.


풀업(pull-up) 풀다운(pull-down) 저항 1

http://air802.tistory.com/2



 I2C 통신이 이루어지지 않고 있는 상황일 때에는 SDA와 SCL은 High 상태를 유지합니다. Master가 I2C 통신을 개시하게 될 때 SDA가 Low 상태로 내려가게 됩니다. 이 때 SCL은 I2C 통신이 시작되었음을 인지하고 클럭 역할을 하기 시작합니다.

 I2C 통신이 완료되었을 때 Master는 I2C 통신을 종료하게 됩니다. SCL이 HIGH 상태로 돌아왔을 때 SDA가 Low에서 High로 변하게 되면 I2C 통신이 완료됩니다.






 I2C Slave는 각각 자신의 고유 주소를 가지고 있습니다. 주소는 총 7비트로 구성되어 있으며 Master에서 맨 처음 통신하기를 원하는 Slave의 주소를 SDA를 통해 전달하면 해당 주소의 Slave는 Master에게 주소를 수신하였다는 ACK를 Low 상태로 끌어내려 마스터에게 발신합니다. 이후 Master는 Slave에게 데이터를 전송할 수 있게 됩니다. 이 때 데이터는 한 번에 8비트씩 여러번 전송이 가능합니다.




 위에서 Slave address가 모두 전송된 뒤 R/S 부분을 보실 수 있습니다. 이는 해당 Slave의 레지스터를 읽거나 쓸건지의 여부를 물어보는 레지스터로 R의 경우 SDA가 High 상태로 Slave에게 Data를 전달받을 수 있으며 S의 경우 SDA가 Low 상태로 Slave에게 Data를 전송할 수 있습니다.

 


참고자료 : http://mintnlatte.tistory.com/201

300x250