Semiconductor, Embedded/0. Digital, Analog, 회로 이론

I2C 구조 및 동작 원리

잇(IT) 2024. 8. 14. 19:37

I2C에 대해 알아보기 전에 Open Drain이란 개념이 등장하기 Open Drain에 대해 간단하게 알아보겠다.

 

- I2C에서 Open Drain을 사용하는 이유

I2C는 여러 장치가 동일한 선을 공유하는 방식이다. Open Drain 방식을 사용하면 하나의 선에 여러 장치가 데이터를 공유할 수 있기 때문이다. 또 신호 충돌을 방지할 수 있기 때문이다. 자세한 내용은 아래를 참고하길 바란다.

 

■ Open Drain

 

Open Drain은 위 그림과 같이 Drain이 Output Pin에 연결된 구조를 의미한다.

위와 같이 Pull-Up 저항이 없게 되면 Floating 상태가 되어 신호가 불안정해지고 잡음의 영향을 받을 수 있다.

위와 같이 Pull-Up 저항을 사용하게 되면 Data 선에 1의 신호를 지속적으로 전달할 수 있고, Data 선은 NMOS를 조절함으로서 내부에 전달되는 Data를 0 또는 1의 신호를 전달할 수 있다.

위 그림을 보게 되면 Pull-Up 저항을 통해 2개의 선이 연결되어 있는 것을 확인할 수 있다.

Device 1, 2에 NMOS 트랜지스터가 각각 있고, SCLK, DATA에 대한 선이 있다.

NMOS에 0의 신호가 전달되면 Pull-Up 저항에 의해 모든 IN Pin에는 1의 신호가 전달될 것이다.

만약 NMOS에 1의 신호가 전달되면 SDA, SCL 선을 통해 전달되는 1의 신호가 전부 GND로 흐르기 때문에 IN Pin에는 0의 신호가 전달된다.

 


■ I2C

 

Inter-Intefrated Circuit 하나의 Master에서 여러 개의 Slave를 제어하기 위한 프로토콜이다.

N개의 Master와 M개의 Slave가 SDA, SCLK 2개의 선을 통해 Data를 주고 받는다.

 

I2C는 SDA(Data 라인), SCL(Clock 라인)을 이용하는 동기식 시리얼 통신 방식이다.

■ I2C 통신 방식

 

Open Drain을 통해 알아봤듯이 SDA, SCL 라인은 모두 1(High) 상태를 유지한다.

 

1. 통신이 시작되면 SDA는 SCL보다 먼저 0(Low) 신호로 변한다. 반대로 통신이 종료되면 SCL 신호가 먼저 1(High)가되고 SDA가 1(High)로 돌아오는 것을 확인할 수 있다.

https://enidanny.github.io/iot/i2c-protocol/

 

2. 조금 더 자세한 통신 방식을 확인하게 되면 Start/Stop Condition을 제외한 실제 주고 받는 Data의 경우  SCL = 1(High)가 유지되는 순간에 수행된다.

https://enidanny.github.io/iot/i2c-protocol/

SDA, SCL 2개의 선만 가지고 Device를 구분할 수 있는 이유는 최초에 각 Device에 대해 Address를 주고 받기 때문이다.

Address를 주고 받은 다음 자신이 해당 Address에 해당하면 ACK 신호를 응답하고 자신의 Address가 아닌경우 ACK 신호를 응답하지 않음으로서 각 Device에 대한 구분이 가능해진다.


■ I2C Write

 

https://enidanny.github.io/iot/i2c-protocol/

 

Write 동작은 Master에서 Address를 보내면 그에 해당하는 Slave에서 ACK 신호를 보낸다.

첫번째 8비트 중 마지막 1비트는 Read/Write에 대한 비트에 해당하며 위는 Write 신호를 전달했을 경우를 나타낸다.

Write인 경우 Master에서 Slave의 메모리 주소, Slave에 전달할 Data 등 전부 Master에서 신호를 전달하게 되고, Slave의 경우 ACK 신호를 Master로 전달한다.

첫번째 주소는 Address에 대한 ACK, 두번째 주소는 Slave 내부 Register 주소에 대한 ACK, 마지막 ACK는 DATA를 전달 받고 통신을 STOP하기 위한 ACK에 해당한다.

STOP은 Master에서 더이상 Write 할 데이터가 없는 경우 동작하게 된다.


■ I2C Read

https://enidanny.github.io/iot/i2c-protocol/

 

Read의 Write와 동일하게 Slave, Reigster Address를 전달하는 것을 볼 수 있다. (이는 어떤 Slave의 Register의 값을 읽어올건지에 대한 확인을 위한 작업이다.)

이후 Slave로부터 ACK 신호를 받아 확인이 되면 그 다음에 Slave Address 주소 마지막 비트를 1로 전달함으로서 Slave에게 Read라는 신호를 전달한다.

이후 Read 동작이기 때문에 Master에서 Data를 전달하는 것이 아닌 Slave에서 Master에 Data를 전달하고 Data 전송이 끝나면 Master는 Write와 다르게 ACK 신호가 아닌 NACK 신호를 전달하고 STOP 신호를 전달한다.

728x90