본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 33강. 이제는 쉬워진 I2C 통신

by 덤더리덤떰 2025. 2. 14.

0.오늘의 목표

: OLED는 I2C 통신을 사용하기에 I2C에 대해 배워보자

 

1. 통신

: 시간 or 클럭(SPI, I2C)을 기준으로 통신

I2C통신(반이중 : 송수신이 동시에 X)

 

1-1. I2C 통신 특징

  • 8bit씩 주고 받음
  • 7bit의 주소 공간 사용 => I2C에 최대 연결할 수 있는 장치가 128개 
  • 400Khz의 전송속도
  • Sleep 모드 일 때, 주소 인식으로 일어남
  • 동기 방식(클럭 베이스)
  • 선이 두가닥 필요
  • 클럭과 데이터는 기본으로 High 상태 

1-2. I2C 데이터 송신 (SDA, SCL은 모두 마스터의 데이터와 클럭선)

  • 클럭을 발생하는 주체는 마스터 
  • START
    : SCL(클럭) 선은 High 상태로 있다가 데이터를 보내고 싶을 때 SDA(마스터의 데이터)선이 High -> Low로 떨어짐
  • 데이터 변화 구간1
    : SCL(클럭) 선을 Low로 떨어트리고 그 위에 SDA에서 데이터 세팅하고 나면 SCL은 다시 High로 올려줌
  • SDA 신호 읽는 구간
    : SCL이 High로 올려진 구간에서 Slave는 SDA를 읽음
  • 데이터 변화 구간2
    : 또 데이터를 보내고 싶은 경우엔 다시 SCL을 Low로 내리고 0을 보내고 싶다면 SDA를 Low로 내림
  • 데이터 세팅했으니 SCL은 다시 High로 올리고 이 구간에서 Slave는 SDA를 읽음 
  • 이와 같은 동작을 8번 반복하여 8bit를 전송 
  • ...
  • 더이상 보내지 않고 싶을 땐, SDA를 Low로 떨어트리고 SCL은 계속 High로 유지 
  • STOP
    : SCL이 계속 High 상태인 걸 확인하고 "이제 끝내고 싶구나"라고 판단하여 SDA도 High로 
  • 둘 다 High인 상태이므로 더이상 데이터 보내지 않는다는 걸 알림 

 

1-3. I2C의 전체적인 통신흐름

 

(1) Master가 보내는 구간

  • 아래 사진처럼 Slave의 주소 7bit를 클럭마다 1bit씩 전송 (<=> 이름 호명)
  • Master는 1bit를 설정
    : 이때, Master는 1bit를 LOW로 떨어트려서 Slave에게 "나 지금 너에게 데이터 쓸 거야"라고 보냄
    => 8bit = Slave의 주소 + Master의 Write or Read 신호 

(2) Slave가 보내는 구간

  • Slave는 Low로 떨어트려서 하나의 bit를 보내줌 (ACK : 잘 들었다는 응답)

(3) Master가 보내는 구간

  • 보내고 싶은 데이터 8bit 단위로 전송

(4) Slave가 보내는 구간

  • Slave는 Low로 떨어트려서 9번째 bit에 잘 받았다는 응답을 함

(5) 끝

  • 끝내고 싶은 경우엔 SDA가 Low인 상태에서 SCL이 High로 바꾸고 계속 유지하면 끝났다는 걸 Slave가 

* 사진2는 읽는 상황으로 Master가 Write하는 경우와 비슷 

 

2. I2C 설정방법

  • 직접 GPIO 제어하면서 통신
  • 칩 자체에서 제공해주는 기능 사용 <- 우리의 pick