事情的主角是ESP32-S3与一块3.5寸的320*480使用ILI9488驱动的屏.

ESP32-S3与屏的接口为8bit的8080接口.

ESP32-S3上使用LCD外设去驱动屏幕,首先先用的ESP-IDF里的LVGL例程稍作修改.

因为ST7789与ILI9488比较接近,ESP-IDF里又有ST7789的驱动(esp_lcd_panel_st7789.c)于是复制一份到项目目录后稍作修改(主要是把初始化代码替换成屏厂提供的),烧录程序点屏后发现如下显示:

测试程序是使用指定颜色填充了(0,0)到(100,100)的一个方块,但屏上实际显示的则是黑色或者白色的条状.并且尝试过换不同颜色也始终只显示黑色或者白色的内容,而且指定坐标的命令似乎无效了,看上去单纯的只是把ESP32-S3写入的颜色数据按屏幕像素点顺序依次填充.

后面又尝试将ESP32-S3一次性写入的颜色数据里用不用的颜色数据填充,发现屏幕确实可以显示不同的颜色(虽然感觉显示的颜色与实际发送的颜色不对,但是看上去也能找到规律),因为可以显示不同颜色,所以尝试在初始化的时候增加颜色翻转命令发现屏幕是可以正常生效颜色翻转命令的.也就是说ESP32-S3与屏的基本的通讯是OK的.

经过上述实验,我开始怀疑是不是屏厂提供的初始化代码有问题,因为屏厂给的初始化代码是针对16bit的8080接口的,而我使用的是8 bit,虽然我有设置成8bit 8080的IM引脚状态.但是不确定是否需要修改初始化代码,所以又问屏厂要了一套初始化代码.使用后发现问题并没有改善.

后面又怀疑是否是因为8080接口上的时序不对或者信号质量太差,就用示波器挂了通讯波形,主要是挂了控制信号WR与一个数据信号DB0的波形,发现WR波形正常,但是DB0的波形有些高电平拉不高,正常3.3V高电平的情况下信号会出现1.6V的稳定电平,但是拔掉屏单独测ESP32-S3的输出波形又是正常的.

后来一个偶然的机会,在调试过程中发现用手触摸屏幕所在的FPC座子的时候有可能导致屏幕可以正常显示,发现这个现象后,我理解可以认定初始化代码是没有问题的,故开始重新看8080接口协议,发现了一个可能性,就是我板子上的RD引脚是接出来到一个TP点的,处于悬空的状态,如下图:

还好有个TP点引出,随即把这个TP点连接到3.3V以后,(o゜▽゜)o☆[BINGO!],问题解决!下面是正常的样子.

事后总结,确实如果RD电平不对的话会导致屏幕不能正确识别ESP32-S3写入的数据与命令,也就可能导致屏幕显示的颜色不对,以及设置坐标的命令无效的情况,而且看到的DB0信号有中间电平,也正是屏幕接收到错误RD电平后对外输出数据时,DB0引脚的输出信号与ESP32-S3的输出信号冲突的结果,这样就都说得通了.

事情就到这里.单纯记录一下,因为也耗了差不多3个晚上才搞定.