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
- > 예제를 가져올때 게시자의 메뉴얼을 잘 읽어보자,,,