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 모드로 해야 동작함
'임베디드' 카테고리의 다른 글
| [오제이 튜브의 임베디드 강의] 36강. 전부 합체! 완전체 보드 만들기! (0) | 2025.02.19 |
|---|---|
| [오제이 튜브의 임베디드 강의] 35강. 내 로고는 내가 만든다! (0) | 2025.02.14 |
| [오제이 튜브의 임베디드 강의] 33강. 이제는 쉬워진 I2C 통신 (0) | 2025.02.14 |
| [오제이 튜브의 임베디드 강의] 31강. 흉내낸 쓰레드 크리티컬 섹션 문제 해결! (0) | 2025.02.12 |
| [오제이 튜브의 임베디드 강의] 30강. 쓰레드 흉내내기! (0) | 2025.02.12 |