임베디드/고추건조기

I2C hello world :)

twoweeks-within 2024. 12. 17. 01:34


SM (standard mode ) : 비율 1대 1
FM (fast Mode ) 
           a > 1 : 2
           b > 1 : 1.7

 

 

SCL clock frequency

SM : 0~ 100KHZ

FM : 0~ 400KHZ

 

Tlow : FM : 1.3 us ~

     > duty cycle LOW,HIGH 비율 1:2 ,1 : 1.7 // SM : 1대1

 

400kHZ = 2.5us

 1초에 400kHZ , 1주기 ( LOW + HIGH) : 2.5us > 한쪽당 1.25us

>>

NXP I2C 메뉴얼에 .. LOW 를 최소 1.3us 유지해야함

>HIGH : LOW

1 : 2 > 0.8 + 1.7 = 2.5

1 : 1.7 > 0.9 + 1.6 = 2.5

 

strech mode

 ; 클럭 LOW 를 유지해서 클럭 ( 시간 )을 멈추는것

  > master :read 하려는데 slave : 준비중일때 잠깐 멈춤 > 반대의 경우도 가능

____________________________________________

PB10 :  SCL

PB11 :  SDA

 

예제 소스로 코드분석

1. main.c 헤더파일 및 .c 파일 넣기 > lib 

 

HAL_I2C_IsDeviceReady(&hi2c1, SSD1306_I2C_ADDR, 1, 20000

 // SSD1306_I2C_ADDR : 0x78  == 0111 1000

 

      0111 100 까지 하고 끝에 B0 을 write 인지 read인지 결정용으로 따로 뺌 > OR 연산으로 처리할듯

// 0111 1010 = 0x7A

 

#define SSD1306_WRITECOMMAND(command)  ssd1306_I2C_Write(SSD1306_I2C_ADDR, 0x00, (command)) 

  

void ssd1306_I2C_Write(uint8_t address, uint8_t reg, uint8_t data) {

uint8_t dt[2];

dt[0] = reg;

dt[1] = data;

HAL_I2C_Master_Transmit(&hi2c1, address, dt, 2, 10);

}

 

void SSD1306_UpdateScreen(void) {

uint8_t m;

 

for (m = 0; m < 8; m++) {

SSD1306_WRITECOMMAND(0xB0 + m);

SSD1306_WRITECOMMAND(0x00);

SSD1306_WRITECOMMAND(0x10);

 

/* Write multi data */

ssd1306_I2C_WriteMulti(SSD1306_I2C_ADDR, 0x40, &SSD1306_Buffer[SSD1306_WIDTH * m], SSD1306_WIDTH);

}                                                                                              // width = 128

}

static uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];

 

OLED : 128 * 64 픽셀   == 8192 

buffer > 128 * 8 개  배열 > 1024 * 8 == 8192 bit 

>> 1bit 당 1픽셀

  

 

 

  • Set the I2C in the FAST MODE, as it is required for the OLED Display
  •   > 예제를 가져올때 게시자의 메뉴얼을 잘 읽어보자,,,

 

 

'임베디드 > 고추건조기' 카테고리의 다른 글

완성 -1-  (0) 2024.12.18
SSD1306 코드분석  (0) 2024.12.17
I2C 구조  (0) 2024.12.15
코드 분해  (0) 2024.12.14
문제원인  (0) 2024.12.14