乐鑫技术交流
直播中

李明聪

7年用户 1146经验值
私信 关注
[问答]

SSD1306 oled屏驱动失败,程序跑飞怎么处理?

程序在进入lcd初始化阶段就跑飞,仔细阅读的源代码发现一个问题,

  • scr_interface_create(SCREEN_IFACE_I2C , &iface_cfg, &iface_drv);


在这个函数内部

  •         interface_i2c->interface_drv.type        = type;
  •         interface_i2c->interface_drv.write_cmd   = i2c_lcd_write_cmd;
  •         interface_i2c->interface_drv.write_data  = i2c_lcd_write_data;
  •         interface_i2c->interface_drv.write       = i2c_lcd_write;
  •         interface_i2c->interface_drv.read        = i2c_lcd_read;
  •         interface_i2c->interface_drv.bus_acquire = i2c_lcd_acquire;
  •         interface_i2c->interface_drv.bus_release = i2c_lcd_release;


给出了interface_i2c的处理函数地址
配置lcd初始化参数时

  • lcd_cfg.interface_drv = iface_drv


使用这个参数对lcd进行初始化

  • esp_err_t lcd_ssd1306_init(const scr_controller_config_t *lcd_conf)
  • {

  • //////////////////////////////////////////////
  •     g_lcd_handle.interface_drv = lcd_conf->interface_drv; //这个时候传递给了 g_lcd_handle

  • ///////////////////////////////////////////////////

  •     LCD_WRITE_CMD(0xAE); //--turn off oled panel

  • ////////////////////////////////////////////////



#define LCD_WRITE_COMMAND(data, length) g_lcd_handle.interface_drv->write_command(g_lcd_handle.interface_drv, (data), (length))

static inline esp_err_t LCD_WRITE_CMD(uint8_t cmd)
{
    return LCD_WRITE_COMMAND((uint8_t*)&cmd, 1);
}

在interface_drv_def.h文件中,把LCD_WRITE_CMD指向了LCD_WRITE_COMMAND

而LCD_WRITE_COMMAND 指向的是 g_lcd_handle.interface_drv->write_command
根据前面的参数我认为,LCD_WRITE_COMMAND 应该指向。 g_lcd_handle.interface_drv->write_cmd  
write_command 前面根本就没有赋值,所以一调用就跑飞。(这个地方解释起来真是自己都觉得很绕,不知道是否说清楚了)
不知道我的理解是否正确。还是我理解存在问题,还请大家指点
                                                                                                                                                                    

回帖(1)

niu!kf

2024-6-27 17:04:24
以下是一些建议和解决方案:

1. 检查硬件连接:确保SSD1306 OLED屏与微控制器之间的连接正确。检查数据线、时钟线和电源线是否连接正确,以及是否有任何损坏或接触不良的地方。

2. 检查电源:确保SSD1306 OLED屏的电源电压在规定的范围内。过低或过高的电压可能导致驱动失败。

3. 检查I2C通信:SSD1306 OLED屏使用I2C通信协议与微控制器进行通信。确保I2C通信正常,包括I2C时钟速率、地址等。

4. 检查初始化代码:仔细检查您的初始化代码,确保所有必要的初始化步骤都已正确执行。例如,设置正确的I2C地址、初始化显示参数等。

5. 检查源代码问题:从您提供的代码片段来看,可能存在一些问题。请检查以下方面:
   a. 确保`type`变量的值是正确的,它应该与SSD1306 OLED屏的类型相匹配。
   b. 确保`i2c_lcd_write_cmd`函数已正确实现,并且能够正确发送命令到SSD1306 OLED屏。
   c. 检查`interface_i2c`和`interface_drv`结构体是否已正确初始化。

6. 使用调试工具:如果可能的话,使用调试工具(如调试器或逻辑分析仪)来检查程序在运行过程中的行为。这可以帮助您找到导致程序跑飞的具体原因。

7. 查阅文档和示例代码:查阅SSD1306 OLED屏的数据手册和示例代码,以确保您的实现与官方推荐的实现一致。

8. 更新驱动库:如果您使用的是第三方库来驱动SSD1306 OLED屏,请确保您使用的是最新版本的库。有时候,旧版本的库可能存在一些已知的问题或不兼容的问题。


举报

更多回帖

×
20
完善资料,
赚取积分