[통신] I2C 통신
I2C 통신
I2C (Inter-Integrated Circuit) 통신은 필립스에서 개발한 반이중 방식 (Half Duflex)의 통신입니다. Atmel에서는 데이터(SDA)와 클럭(SCL) 두가닥을 이용한다고 해서 TWI (Two Wire Interface)라고도 합니다. SDA와 SCL 신호선에 Floating 현상을 방지하지 위해 Pull-up 저항 Rp를 연결해주어야 합니다. 아두이노 Mega2560으로 I2C를 테스트 해본 오실로스코프 이미지도 맨 아래 올려두었습니다.
I2C 프로토콜
아래는 I2C의 프로토콜이며, 필드별 설명입니다.
① START 시 Master가 HIGH 상태인 SDA 신호를 LOW로 떨어뜨립니다.
② 7Bit의 Slave 주소값이 존재해 2*7 = 128개의 Slave 주소를 입력할 수 있습니다.
③ R/W Bit의 경우 Write 시 0, Read 시 1로 Set 됩니다.
④ ACK/NACK Bit의 경우 Slave가 정상 수신한 경우 0으로 Clear해줍니다. (Slave가 해당 비트를 제어함)
⑤ ACK로 비트가 채워졌다면, 8Bit 데이터를 송신합니다.
⑥ Slave에서 8Bit 데이터를 수신했다면, 8Bit Data에 대한 ACK/NACK Bit를 설정합니다.
⑦ STOP 시 Master가 LOW 상태인 SDA 신호를 HIGH로 올립니다.
I2C 스코프로 찍어보기
아래는 아두이노 Mega 2560 2개로 I2C 통신을 해보고, 오실로스코프로 Trigger한 파형입니다.
1. Master 단독으로 송신하기
SDA가 Start시점에서 Low로 떨어졌고, Slave의 주소값은 임의로 0x02로 지정하였습니다. R/W를 0 으로 설정하여 Write모드로 설정하였으며, 현재 연결된 Slave가 없기때문에 NACK 신호처리가 된 모습입니다.
2. Master - Slave 통신
SCL을 기준으로 구분시키느라고 빨간줄을 그어놓았는데 오히려 눈이좀 아픈것 같네요ㅠㅠ
이번에는 Slave를 연결하였기 때문에 ACK가 0으로 채워졌고, Master에서 8bit 데이터를 세번 전송했습니다.
코드는 간단히 0x01 ~ 0x03 3Bytes를 송신하는 코드입니다.
결론적으로~
Master - Slave 간 I2C 통신이 올바르게 작동함을 확인할 수 있었습니다.
참고로, Mega2560의 경우 I2C 통신을 하기 위해서는 아래 빨간 네모 안의 pin을 사용해야 합니다.
읽어주셔서 감사합니다!