-
Inter - Integrated Circuit
서로 간에 연결된 회로로 직역할 수 있다. I2C는 양방향 2 와이어 직렬 버스로 통신하는 프로토콜을 의미한다.
이러한 I2C는 다음과 같은 특징을 가진다.
1
2개의 통신 선을 사용한다.
- SCL
- SDASDA는 데이터를 주고 받기 위한 선이다. SDA선으로 특정 신호를 주어 통신 START/STOP을 할 수 있다.
평소에 HIGH상태로 대기하다가 SDA가 먼저 LOW신호를 주면 SCL은 통신을 시작한다. 반대로 종료 시 SCL먼저 HIGH가 되고, 그 후 SDA가 HIGH가 된다.SCL은 타이밍 동기화를 위한 클럭 선이다. 그렇기 때문에 서로 baud rate ( = 통신 속도)가 맞지 않아도 사용할 수 있다.
의문점
왜 LOW에서 HIGH가 아닌 HIGH에서 LOW일까?
- Open-Drain: I2C의 Slave핀들은 각각의 기기가 전압을 올릴 힘이 없기 때문에 Active HIGH로 작동한다, 그렇기에 HIGH를 LOW로 끌어내려 사용하는 방식을 사용한다.
Active HIGH는 평소에 HIGH신호를 보내고, 스위치가 닫히면 LOW를 보내는 회로를 의미하며, 이는 Active Low (LOW일 때 시작)이다.
Open-Drain이라고 칭한다. 그렇다면 Open-Drain은 뭘까?
트랜지스터로 인해 내부 출력핀이 켜지면 GND로 연결되며, LOW가 된다. 내부 트랜지스터가 꺼지면 HIGH가 아닌 floating상태가 된다. 이는 애매한 값을 가지기에 좋지 않다.
이 상황을 Pull-UP 회로와 같이 사용하여 해결한다.왜 이렇게 번거로운 짓을 해놨을까?
그 이유는 역할 분담과 과전류 방지를 위해서이다.- 역할 분담: Open-Drain은 0v만을, Pull-Up은 5v만을 책임진다.
- 과전류 방지: 여러 부품이 LOW를 보낸다면? 과전류의 위험이 있다. 그렇기에 HIGH상태를 완전히 놓는다. 이 때 단 하나라도 LOW로 당기면, 모두 LOW가 된
2
하나의 Master에 여러 개의 Slave를 물려 통신 할 수 있다.
I2C는 기본적으로 주소값으로 각 모듈을 구분하기에 (1:N)이 가능하다.이때 Slave주소 값은 보통 7 bits 값을 가진다 ( = 0 ~ 127개, 총 127개의 Slave를 연결할 수 있다.)
Master는 Slave에게 7bits + read/write bit를 전송한다. 그 후 Slave는 SDA를 LOW 당기면 ACK ( = 긍정) 답이 된다.
데이터 비트를 전송 후 다시 ACK/NAK로 응답을 하며 통신한다.이는 어떤 방식으로 작동할까?
예를들어 어느 센서의 주소값이 0x77이라고 가정해 보자. 이는 이진수로 0111 0111이다.
전송을 위해서 비트를 왼쪽으로 한 칸 쉬프트한다. ( = 1110 1110)여기에 다음과 같은 read/write bit가 붙는다.
- write시: 1110 1110 | 0000 0000 = 1110 1110
- read시: 1110 1110 | 0000 0001 = 1110 1111
3
클럭 신호선 ( = SCL)을 사용하는 동기식 통신으로, 시간에 자유롭다.
개발자는 UART같은 baud rate를 맞춰야 하는 통신과 달리 신경 쓸 점이 하나 줄어든다.SCL선을 사용하므로 준비되지 않은 데이터에 대한 대비도 할 수 있다.
클럭 스트레칭 (Clock Stretching)
- Slave가 준비가 안 됐을 경우 SCL을 LOW로 유지하여 Master가 기다리게 할 수 있다.
- 저속 장치를 배려하기 위한 흐름 제어 기능이다.
저속 장치란 뭘까?
Gas Sensor같은 세세한 값을 센싱 하는 모듈들은 데이터가 준비되는 데에 시간이 걸리는 저속 Slave 모듈이다. 반면 MCU는 빠른 연산을 하는 Master이다.
4
SDA, SCL로 총 2개의 선만으로 배선을 구성할 수 있다.
많이 사용되는 다른 프로토콜을 예로 들어보자!
- I2C: SDA + SCL 두 가닥으로 배선이 끝난다.
- SPI: 최소 4가닥이 필요하다. (MOSI, MISO, SCK, CS) + Slave마다 CS핀 추가
- UART: TX/RX만 있으면 충분하지만 1:1 방식이다.
'임베디드' 카테고리의 다른 글
DMA (0) 2026.04.24 Havard & Neumann Architectures (0) 2026.04.21 ADC/DAC (0) 2026.04.18 Register Memory (0) 2026.04.13