ESP32调用SD.begin等外部函数后TFT-LCD指令无响应问题咨询
ESP32 ILI9341屏SD初始化后显示失效问题
项目基础配置
- 主控:ESP32
- 外设:搭载ILI9341控制器的2.8英寸SPI接口TFT-LCD(板载SD卡插槽)、配套采集传感器
- 开发环境:Arduino IDE,可直接调用开源驱动库与官方文档资源
- 开发目标:实现数据记录仪功能
故障现象
- SD卡初始化执行前,TFT显示功能完全正常
- 执行
SD.begin()完成SD卡启动(或调用其他外部库函数)后,所有发送给TFT的控制指令均无响应,屏幕无对应输出
复现代码
// 引入依赖库 #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> #include <SD.h> // ESP32引脚定义 #define TFT_CS 15 #define TFT_RST 0 #define TFT_DC 2 #define TFT_MOSI 23 #define TFT_CLK 18 #define TFT_MISO 19 // 初始化TFT驱动实例 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); void setup() { Serial.begin(115200); tft.begin(); tft.fillScreen(ILI9341_BLACK); // 此处屏幕正常显示蓝色圆形 tft.drawCircle(100,100, 20, ILI9341_BLUE); // 启动SD卡,初始化成功后绘制红色圆形 if(SD.begin()){ tft.drawCircle(100,200, 20, ILI9341_RED); Serial.print("red circle"); // 串口可正常打印red circle日志,但屏幕无红色圆形,仅保留之前的蓝色圆形 } } void loop() { }
实际运行验证结果
- SD初始化前,屏幕正常显示绘制的蓝色圆形
SD.begin()执行成功后,串口可正常输出打印日志,但屏幕未绘制预期的红色圆形,仅保留之前的蓝色圆形- 对照测试:手动设置标志位执行绘图逻辑功能正常,仅调用
SD.begin()这类外部库函数时会出现TFT指令无响应的问题
问题根因
故障本质是共享SPI总线的片选管理与配置冲突:
- TFT与板载SD卡共用同一组SPI硬件总线,SPI协议要求同一时间只能选中一个从设备(对应设备的CS片选引脚拉低),其余从设备CS引脚必须保持高电平,否则会出现总线数据冲突,从设备无法正确接收指令。
- 代码中调用
SD.begin()时未传入SD卡对应的CS引脚参数,Arduino ESP32核心的SD库会自动使用默认CS引脚配置,初始化过程中会修改SPI总线的时钟、传输模式参数,同时可能错误配置片选引脚电平状态,导致后续TFT通信时CS引脚未被正确拉低,TFT控制器无法接收总线上的指令。 - SD库初始化完成后不会主动恢复SPI总线为TFT适配的配置参数,Adafruit_ILI9341库如果没有开启每次传输前自动重配SPI的选项,就会出现指令发送无效的问题。
修复方案
- 先核对硬件连线,确认板载SD卡插槽的CS引脚实际连接的ESP32 GPIO编号(常见集成SD卡槽的ILI9341模块SD_CS默认接GPIO4,注意不要和TFT的CS、DC、RST引脚复用)
- 调用
SD.begin()时显式传入SD卡的CS引脚号,例如SD_CS接GPIO4时写为SD.begin(4),禁止使用无参的SD.begin() - 若上述修改后仍存在冲突,可在每次操作SD卡结束、需要操作TFT前调用
tft.startWrite()显式选中TFT、重载SPI配置,TFT操作完成后调用tft.endWrite()释放SPI总线控制权,避免总线冲突。
内容的提问来源于stack exchange,提问作者Elchnasensteak
相关产品推荐
相关产品推荐

