ESP32用U8G2驱动I2C OLED报i2c clock choice invalid错误如何解决
问题原因
你遇到的重启报错核心是U8G2库默认的I2C时钟配置不合法,触发了ESP-IDF的I2C参数校验断言:
- 从报错日志可以看到,U8G2的硬件抽象层默认使用了
1000000(1MHz)的I2C时钟频率,普通SSD1306 OLED的I2C接口最高仅支持400kHz,同时ESP-IDF的I2C驱动会校验时钟参数和硬件匹配度,非法的时钟参数直接触发断言导致设备重启。 - 你之前的I2C扫描功能使用的
100000(100kHz)是I2C标准速率,所有I2C设备都能兼容,所以可以正常识别到地址为0x3c的OLED设备。
修复方法
在初始化U8G2硬件抽象层时手动指定合法的I2C时钟频率即可,修改task_test_SSD1306i2c函数中的初始化代码:
// 修改前 u8g2_esp32_hal_t u8g2_esp32_hal = U8G2_ESP32_HAL_DEFAULT; u8g2_esp32_hal.sda = SDA_PIN; u8g2_esp32_hal.scl = SCL_PIN; u8g2_esp32_hal_init(u8g2_esp32_hal); // 修改后 u8g2_esp32_hal_t u8g2_esp32_hal = U8G2_ESP32_HAL_DEFAULT; u8g2_esp32_hal.sda = SDA_PIN; u8g2_esp32_hal.scl = SCL_PIN; u8g2_esp32_hal.clk_speed = 100000; // 新增此行,设置I2C时钟为兼容的100kHz u8g2_esp32_hal_init(u8g2_esp32_hal);
如果你的OLED硬件支持高速I2C,也可以将时钟值设置为400000(400kHz)提升屏幕刷新速度。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

