第 5 篇:I2C 设备驱动编写------AT24C02 EEPROM + SSD1306 OLED
1. AT24C02 EEPROM 驱动
c
#define EEPROM_ADDR 0x50 // 7 位地址
void eeprom_write_byte(uint8_t addr, uint8_t data) {
uint8_t buf[2] = {addr, data};
i2c_write_bytes(EEPROM_ADDR, buf, 2);
delay_ms(5); // 等待内部写入完成(最大 5ms)
}
uint8_t eeprom_read_byte(uint8_t addr) {
i2c_write_byte(EEPROM_ADDR, addr); // 先写地址指针
return i2c_read_byte(EEPROM_ADDR); // 再读数据
}
AT24C02 的页大小是 8 字节,跨页写入需要分两笔------先写第一页的剩余部分,再写第二页。超过 8 字节的单次写入会回卷覆盖本页开头。
2. SSD1306 OLED 驱动
c
#define OLED_ADDR 0x3C
void oled_write_cmd(uint8_t cmd) {
uint8_t buf[2] = {0x00, cmd}; // 0x00 = 命令模式
i2c_write_bytes(OLED_ADDR, buf, 2);
}
void oled_write_data(uint8_t data) {
uint8_t buf[2] = {0x40, data}; // 0x40 = 数据模式
i2c_write_bytes(OLED_ADDR, buf, 2);
}
void oled_init(void) {
oled_write_cmd(0xAE); // 关闭显示
oled_write_cmd(0xD5); oled_write_cmd(0x80); // 时钟
oled_write_cmd(0xA8); oled_write_cmd(0x3F); // 多路复用
oled_write_cmd(0x8D); oled_write_cmd(0x14); // 电荷泵
oled_write_cmd(0xAF); // 开启显示
}
下一篇:SPI------高速全双工通信