본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 34강. I2C로 OLED를 제어해보자.

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

1. I2C 옵션

: Master와 Slave 부분이 있다

 

(1) Master부분

  • Standard/Fast Mode가 있는데 각각 Max 100KHz, 400KHz 제공
  • Fast Mode Duty Cycle => 고속모드인 경우 2가지의 duty cycle 존재 (사진2)
    : SM(Standard Mode)에서는 High, Low Edge가 모두 1:1 비율로 사이클 구성 
    : FM(Fast Mode)에서는  High, Low Edge가 1:2 / 1:1.7 비율로 사이클 구성 
  • 400kHz : 1초에 400만 주기 (= 0.0000025 초) <=> 1사이클에 0.0000025초가 되어야 400kHz를 만들 수 있다 
    ex) sin파 한주기가 1초 걸리면 그게 1Hz이므로 sin파 한주기가 2.5 μs 걸리면 400kHz
  • 이때, 이 2.5는 한 주기가 상승과 하강으로 이루어져있기에 각각 1.25 μs 이어야함 
  • But, 하강부분이 1.3 μs 이상이어야 한다고 정의되어있음 
  • 따라서 비율이 1:2, 1:1.7 비율이 생겨남

(2) Slave부분

  • Primary Address Length Selection (기본 주소 길이 선택)
    : 슬레이브가 7비트 주소를 사용할지, 10비트 주소를 사용할지 결정
  • Dual Address Acknowledged (이중 주소 인식)
    : 두 개의 다른 마스터가 같은 슬레이브에 접근 가능하거나, 특정 용도로 보조 주소를 활용
  • Primary Slave Address (기본 슬레이브 주소)
    : 마스터가 데이터를 전송할 때 슬레이브를 식별하는 역할
  • General Call Address (일반 호출 주소)
    : 모든 슬레이브가 응답할 수 있는 브로드캐스트 주소(0x00) 사용할지 말지
  • Clock No Stretch Mode  (클럭 스트레칭 비활성화 모드)
    => Stretch Mode : Slave/Master든 뭔갈 해서 바쁜 상황이라 "잠깐 멈춰줘"라고 해서 클럭을 Low로 유지하여 클럭을 멈추는 것 (시간을 멈추는 것)
    => case 1) Master가 Slave에게 데이터를 읽으려 하는데 Slave는 데이터 준비하는데 시간이 필요한 경우 
    ex) 온도 센서 : Slave는 온도를 알아내기 위해 연산하는 시간이 필요한데 Master가 지금 당장 달라하는 경우 Slave가 클럭을 Low로 떨어트려서 "나 잠깐 시간이 필요해"라고 시간을 멈추는 것 
    => case2 ) Master의 버퍼에 데이터가 오고 아직 그 데이터를 읽지 못한 경우 
    ex) Master가 데이터를 읽어오는데 Master의 버퍼에 데이터가 왔지만 그 데이터로 아직 연산을 안끝낸 경우 또 Slave에서 데이터를 보내서 버퍼를 뒤집어 씌우는 걸 방지하기 위해 Slave에게 "더이상 데이터 보내지마!"라고 시간을 멈춤 
    <=> 다음 행동을 안하게끔 한다
    => Clock No Stretch Mode : Disabled 는 "Stretch Mode를 사용하겠다"

 

2. OLED 제어 

: 제공 소스코드로 OLED 제어해보기

 

2-1. 파일들 불러오기

  • 강의에서 제공한 소스코드 내의 헤더파일들을 사진1/2처럼 STM내 코드에 추가
  • 사진3처럼 STM 내 Lib-Inc에 넣기 (fonts.h, ssd1306.h, test.h : Inc 폴더에서, bitmap.h, horse_anim.h : Src 폴더에서)
    + STM내 Lib-Src에 넣기(fonts.c, ssd1306.c, test.c)

 

2-2. 함수들 STM내에 수정하면서 추가하기

  • 이때, 소스코드를 분석해보면 한줄에 128Byte가 있고 세로로 8줄이 있어서 1byte마다 OLED의 8개의 픽셀을 ON/OFF하는 형식일 것

 

2-3. (실습) "HELLO WORLD" 출력해보기 

 

(1) 오류 잡기 

  • 기존 STM내 소스코드(hi2c2)와 달리 hi2c1으로 정의되어있음 
  • ssd1306.h에 사진2/3처럼 작성
  • ssd1306.c 내에서 모든 hi2c1을 H_I2C로 바꾸기

 


 

(2) 회로도 구성 

  • 흰색 수컷-암컷 점퍼선으로 OLED의 GND와 빵판의 - 연결 
  • 주황 수컷-암컷 점퍼선으로 OLED의 VCC와 빵판의 + 연결
  • 파랑, 초록 수컷-암컷 점퍼선으로 OLED의 SCL, SDA와 빵판의 j50/49에 연결
  • 다시 파랑, 초록 수컷-암컷 점퍼선으로 빵판의 i50/49와 stm PCB의 PB10/PB11에 연결 
  • 제공 소스코드의 main함수 내 코드들 다 stm내 main 코드에 붙여넣고 실행
  • 결과가 아래 사진처럼 나옴 

 


=> 원인 ? 전송 속도가 Master가 아닌 Fast 모드로 해야 동작함