연구노트/통신 설계

[I2C/SPI] I2C 통신원리 || 구조부터 통신 과정까지

ipmes 2026. 7. 24. 09:06

 

 


I2C 통신원리

구조부터 통신 과정까지


 

 

 


1부 [I2C/SPI] I2C, SPI 통신 || 간단히 알아보는 특징
2부 [I2C/SPI] I2C 통신원리 || 구조부터 통신 과정까지

3부 [I2C/SPI] SPI 통신원리 || 신호선부터 원리까지

4부 [I2C/SPI] I2C 통신 실험 || 아두이노 간 통신하기


 

SDA(Serial Data) 와 SCL(Serial Clock)

I2C는 전원과 접지를 제외하면 단 두 개의 신호선만 사용합니다.

 

  • SDA : 데이터를 송수신하는 데이터 라인
  • SCL : 데이터 전송 타이밍을 맞추기 위한 클럭 라인

 

즉, SCL에서 데이터를 언제 읽고 써야 하는지 타이밍을 알려주면, SDA가 그 타이밍에 맞춰 실제 데이터를 전달하는 역할을 합니다.

 

여기서 알 수 있듯이 I2C는 동기(Synchronous) 시리얼 통신 방식입니다.

동기식 통신이란 송신 장치와 수신 장치가 동일한 클럭(Clock) 신호를 기준으로 데이터를 주고받는 방식을 의미합니다.

 

또한 데이터를 전달하는 SDA 라인이 하나뿐이기 때문에 송신과 수신을 동시에 할 수 없고 하나의 선을 공유하는 반이중(Half Duplex) 통신 방식입니다.

 

 

단방향, 반이중, 전이중 통신의 차이점이 궁금하시다면 하단 링크에서 자세히 확인하실 수 있습니다.

 

https://ipmes.tistory.com/96

 

I2C 버스에는 크게 두 가지 역할이 존재합니다.

 

마스터(Master)

버스의 주도권을 가진 장치입니다.

클럭 신호를 생성하며, 어떤 슬레이브와 통신할지 주소로 지정하여 통신의 START와 STOP을 결정합니다.

 

 

슬레이브(Slave)

Master의 호출에 응답하는 장치입니다.

고유한 주소(Adress)를 가지고 있기 때문에 자신의 주소로 호출받았을 때만 응답합니다.

 

또한 기본적인 1:N 구조뿐만이 아닌 N:N Multi-Master 구성도 가능합니다.

두 개 이상의 Master가 같은 버스를 공유할 수 있으며, 여러 Master가 동시에 통신을 시도할 경우 아비트레이션(Arbitration, 중재) 과정을 통해 충돌을 해결합니다.

 

 

오픈 컬렉터(Open Collector) / 오픈 드레인(Open Drain) 구조

 

일반적인 GPIO 출력 방식인 Push-Pull 구조에서는 여러개의 장치가 한개의 선을 제어하려고 할 때 문제가 생길 수 있습니다.

예로 하나의 선에 어떤 장치는 High, 어떤 장치는 Low를 출력한다고 하면, Short가 발생하여 소자가 파손 될 수 있습니다.

 

 

 

반면 Open-Drain 또는 Open-Collector 구조에서는 신호선에 High를 직접 주지 않고, Low로 끌어내리는 역할만 수행합니다.

따라서 출력을 하지 않을 때 신호선을 High 상태로 유지해 줄 별도의 장치가 필요한데, 이 역할을 하는 것이 풀업(Pull-up) 저항입니다.

 

Pull-up 저항은 신호선을 전원에 연결하여, 어느 장치도 신호선을 Low로 끌어내리지 않을 때 High 상태가 유지되도록 만들어 줍니다.

 

 

 

어떤 장치가 FET 또는 BJT를 켜서 Low를 출력할 시, 신호선은 Low로 끌어내려지게 되고, 다른 장치가 출력을 하지 않더라도 쇼트가 발생하지 않아 안전하게 Low 상태를 유지합니다.

그리고 모든 장치가 출력을 해제하면 Pull-up 저항에 의해 High 상태로 되돌아 갑니다.

 

이러한 구조로 인해 여러 장치가 하나의 SDA와 SCL 라인을 안전하게 공유하면서도 충돌 없이 통신할 수 있습니다.

 

또한 이러한 구조는 서로 동작 전압이 다른 경우에도 통신이 가능하게 만듭니다.

예를 들어 3.3V로 동작하는 MCU와 5V로 동작하는 주변 IC가 연결되어 있다고 하더라도. 별도의 전압 변환기(Level Shifter) 없이도 두 장치가 안전하게 5V 수준에서 통신을 주고받을 수 있습니다.

 

 

주소(Address) 체계

 

 

I2C에서는 여러개의 Slave와 통신을 하기 때문에 각 Slave에 고유한 주소가 부여되어 있으며, Master는 통신을 시작할 때 이 주소를 함께 전송하여 원하는 장치를 선택합니다.

 

주소는 일반적으로 7비트를 사용하지만, 필요에 따라 10비트 주소도 제한적으로 사용됩니다.

일반적인 상황에서 주소는 항상 1byte로 전송되는데, Slave 주소가 7bit뿐이므로 나머지 1비트에는 읽기/쓰기(R/W) 플래그가 채워져 총 8bit가 완성됩니다.

 

즉, START 조건 직후 전송되는 첫 번째 byte는 'Slave 주소 7비트 + R/W 플래그 1비트'로 구성됩니다.

이 때 R/W 플래그 bit는 다음과 같습니다.

  • R/W = 0 : Master가 Slave에 쓰기(Write)
  • R/W = 1 : Master가 Slave에서 읽기(Read)

 

 

 

I2C 프로토콜(I2C Protocol)

 

I2C 버스는 Master가 주도하여 SCL 라인으로 클럭 신호를 출력하고, SDA 라인을 통해 Bit 단위로 데이터를 전송합니다.

데이터 전송을 시작하는 START 조건과 전송을 종료하는 STOP 조건이 존재하며, 이 두 조건은 오직 Master만 생성할 수 있고 Slave는 START 조건을 감지하여 통신 준비 상태로 전환합니다.

 

또한 프레임은 크게 주소 프레임(Address Frame)과 데이터 프레임(Data Frame), 두 가지 형태로 구분됩니다.

 

기본적인 통신 순서는 다음과 같습니다.

START - 슬레이브 주소 + R/W 비트 - ACK/NACK - 데이터 송수신 - ACK/NACK - STOP

 

 

시작조건(Start)

주소프레임을 시작하려면 마스터 장치는 먼저 SCL을 HIGH를 유지한 상태에서 SDA를 LOW로 만들어야 합니다.

 

주소(Address)

주소프레임은 새로운 통신이 개시될 때 항상 먼저 전송이 되며 위에서 설명한 기준에 따라 MSB(most significant bit)방식으로 데이터가 전송됩니다.

 

ACK(Acknowledge)

주소가 일치하는 슬레이브는 ACK 신호를 전송합니다.

ACK는 수신을 정상적으로 완료했다는 의미의 응답 신호로 SDA를 LOW로 끌어내립니다.

반대로 해당 클럭 타이밍에 SDA가 High 상태를 유지한다면 NACK(Not Acknowledge) 로 판단합니다.

 

ACK가 발생하는 경우는 다음과 같습니다.

  • 슬레이브가 주소를 정상적으로 수신했을 때
  • 데이터를 정상적으로 수신했을 때

즉, 주소뿐만 아니라 데이터를 전송할 때도 매 바이트마다 ACK가 발생합니다.

 

반대로

  • 슬레이브 주소가 일치하는 슬레이브가 존재하지 않을 때
  • 슬레이브가 어떤 문제가 발생하여 통신을 하지 못하는 경우
  • 마스터가 슬레이브로부터 데이터를 읽을 때, 더 이상 읽을 데이터가 없어 통신을 마치고자 마스터가 의도적으로 NACK을 보낼 때

슬레이브는 더 이상 응답을 하지 않고 종료를 합니다.

 

 

데이터 송수신

SDA 라인을 통해 전송되는 데이터는 항상 1byte 단위로 구성되며, 한 번의 통신에서 전송할 수 있는 데이터 바이트 수에는 특별한 제한이 없습니다.

하지만 1byte가 전송될 때마다 반드시 1bit의 ACK 신호가 뒤따라야 하며, 이 과정은 '데이터 - ACK - 데이터 - ACK'의 형태로 반복됩니다.

 

 

정지조건(STOP)

모든 데이터 프레임의 전송이 끝나면, 마스터는 통신을 종료하기 위해 STOP 조건을 생성합니다.

STOP 조건은 먼저 SCL 라인을 LOW에서 HIGH로 전환하여 유지한 뒤, 이어서 SDA 라인을 LOW에서 HIGH로 전환함으로써 만들어집니다.

 

 

 

실제 데이터 흐름

@Arduino Forum

 

해당 예제는 주소가 0x68인 Slave에서 0x57이라는 데이터 값을 읽어오는 상황을 보여줍니다.

 

시작조건에 맞춰 통신을 개시하였고, 0x68은 bit로 표현하면 0110 1000 이 되는데 이를 사진에서의 신호로도 확인할 수 있습니다.

그리고 읽기 이기 때문에 8번 bit는 High로 설정이 되었기 때문에, 실질적으로 주소 프레임에는 0110 1001 이라는 비트 데이터가 들어있습니다.

 

이어서 데이터 값인 0x57은 bit로 표현하면 0101 0111으로, 해당 신호 또한 사진에서 확인 가능합니다.

Slave는 정상적으로 주소와 데이터를 수신하였기 때문에 SDA를 LOW로 끌어내려 ACK로 응답하였으며, 정지조건에 맞춰 통신을 완료하였습니다.

 

 

 

마무리

 

이번 글에서는 I2C의 기본 신호선 구조부터 시작하여 통신 프로토콜과 실제 데이터의 송수신 과정을 중심으로 살펴보았습니다.

다음은 같은 동기식 시리얼 통신 방식인 SPI의 통신원리에 대해 알아보며 I2C와의 신호선 구성이나 통신방식의 차이를 알아보도록 하겠습니다.

 

 

 

 

 




TEL (062-226-1777, 010-9891-7244), E-mail (ipmes@ipmes.co.kr)

임베디드 시스템 | PCB 설계 제작 | 펌웨어 개발 | 신호처리 | 응용프로그램

 

#IPMES#아이피엠이에스#연구노트#임베디드#PCB제작#펌웨어개발,

#하드웨어개발#소프트웨어개발#회로설계,

#광주PCB#광주시제품#광주시제품개발#광주OEM#광주광역시PCB,

#광주임베디드#광주음성처리#광주신호처리#광주광역시임베디드,

#광주회로설계#광주아트웍#PCB샘플링