날짜: 2025년 2월 17일

참고
https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
https://www.ti.com/lit/an/sbaa565/sbaa565.pdf?ts=1739695193767
소개
LCD 통신이나 메모리와의 데이터 로깅 시스템 통신으로
유용한 동기식 직렬 통신 프로토콜
스펙
| 신호 선(Wire Used) | 2 |
|---|
| 최대 통신 속도(Maximum Speed) | 100kbps in Sandard mode400kbps in Fast mode3.4Mbps in High speed mode5Mbps in Ultra-Fast mode |
| 통신모드(Transmission Mode) | Synchronous |
| 통신 유형(Communication Type) | Serial |
전송 메시지 프레임

하나의 메시지 프레임

위 그림에서 왼쪽부터 MSB, 맨 오른쪽이 LSB이다.
I2C에서 데이터는 메시지 단위로 전송된다.
메시지는 데이터 프레임으로 나뉜다.
각 메시지는 slave의 binary address를 포함하는 주소 프레임과,
하나 이상의 데이터를 포함하는 데이터 프레임으로 구성된다.
또한 메시지에는 start 및 stop 조건(condition), write/read 비트,
그리고 각 데이터 프레임 사이의 구분자인 ACK/NACK 비트가 포함된다.
또한, SCL이 Low Voltage Level일 때만 SDA 신호가 변할 수 있다.
- Start Condition Open Bus 상태*일 때, slave SDA 라인이 High Voltage Level에서 Low Voltage Level로 전환된 후, SCL 라인이 High에서 Low Voltage Level로 전환된다.
- Address Frame 각 slave에 고유한 7bit 또는 10bit 시퀀스로, master가 특정 slave와 통신할 때 해당 slave를 식별할 수 있는 slave의 주소. 7bit 시퀀스의 경우 보통 16개의 주소는 reserved 되거나 다른 용도로 쓰므로 보통 112개의 주소를 쓸 수 있다고 보면 된다.
- Read/Write Bit master가 slave로 데이터를 보내는지(Low Voltage Level) 혹은 master가 slave로부터 데이터를 요청하는지(High Voltage Level)를 지정하는 단일 비트.
- ACK/NACK Bit 메시지 각 프레임 뒤에 오는 확인(ACK) 또는 비확인(NACK) 비트. 주소 프레임이나 데이터 프레임이 성공적으로 수신되었을 경우, 수신 장치가 송신 장치에게 ACK 비트를 반환한다. NACK 신호를 받은 장치는 방금 보낸 패킷을 재전송 혹은 전송 중단을 하는 조치를 취한다.
- Data Frame master가 slave로부터 ACK 비트를 감지한 후, 첫번째 데이터 프레임을 전송할 준비가 완료된다. 데이터 프레임은 늘 8bit 길이를 가지며, 가장 상위비트(MSB)부터 전송된다. 각 데이터 프레임 뒤에는 반드시 ACK/NACK 비트가 따라오며, 해당 데이터 프레임이 성공적으로 수신되었는지 확인하는 용도로 사용한다. 이를테면, 다음 프레임을 전송하기 전에 데이터를 전송한 주체(master or slave)에 따라 상대방으로부터 ACK 비트를 반드시 수신해야 한다. 모든 데이터 프레임이 전송된 후, master는 slaver에게 STOP condition을 보내 전송을 중단할 수 있다.
- Stop Condition 모든 데이터 프레임이 전송된 후, master는 slaver에게 STOP condition을 보내 전송을 중단할 수 있다. SDA 라인이 Low Voltage Level에서 High Voltage Level로 전환되기 전에 SCL이 Low에서 High Voltage Level로 전환된다.

통신 구조

- SDA(Serial Data)
- SCL(Serial Clock)
Master-Slave 구조로 하나의 마스터와 n개의 slave간 1:n 통신이 가능한 통신이다.
통신과정
- master는 SDA 라인을 High에서 Low Voltage Level로 전환한 뒤, SCL 라인을 High에서 Low Voltage Levle로 전한해 연결된 모든 slave에게 start condition을 전송한다.
- master는 통신 하고 싶은 slave 주소와 R/W 비트를 모든 slave에게 전송한다.
- 각 slave는 master가 보낸 주소를 자신의 주소와 비교하여 주소가 일치하면 slave는 SDA 라인을 한 bit동안 Low Voltage Level로 설정해 ACK bit를 반환한다. 만약 master가 보낸 slave 주소와 자신의 주소랑 다르면 Low가 아니라 High Voltage Level로 유지한다.
- master는 데이터 프레임을 전송 혹은 수신한다.
- 데이터 프레임이 전송된 후, 수신 장치는 데이터 프레임을 잘 받았다면 ACK 비트를 리턴한다.
- 전송 통신을 멈추기 위해 master는 SDA 라인이 High로 변환되기 전에 SCL 라인을 High Voltage Level로 변환시키는 것으로 slave에게 stop condition을 보낸다.
장점
- 배선이 간단하다
- 멀티 마스터와 멀티 슬레이브를 가질 수 있음
- UART보다 덜 복잡한 하드웨어
단점
- SPI보다 느림
- 데이터 프레임이 8bit로 제한됨
- SPI보다 더 복잡한 하드웨어가 요구
I2C 통신이 제대로 되고 있는지 확인하기(오실로스코프)
출처: https://wowon.tistory.com/225

기타
마스터가 여러 개 존재할 경우 통신의 혼란을 막기 위해 각 컨트롤러는 bus의 점유 상태를 확인한다.
- Open Bus : =버스가 열려있는 상태. SDA와 SCL 라인이 모두 HIGH 인 상태로, 어떤 Controller도 통신을 시작하지 않았거나, 이전 통신이 완료되어 버스도 해제된 상태. 이때 새로운 컨트롤러가 I2C START Condition을 통해 버스를 점유할 수 있다.
- Bus Occupied : =버스가 점유된 상태. SDA와 SCL 라인이 LOW인 경우. 특정 컨트롤러가 현재 통신 진행 중이므로 다른 장치들은 대기해야 함.
I2C는 여러 장치가 공유하는 시스템이므로 동시에 하나의 컨트롤러만이 버스를 사용할 수 있다.