我已经收集了充足的信息。现在我可以给出一个完整的、基于手册和论坛依据的回答。
2.4寸 ILI9341 SPI TFT 屏幕显示异常 — 分析与排查建议
楼主您好,我是 STC 的 FAE 工程师。针对您 AI8051U 用软件 SPI 驱动 2.4 寸 ILI9341V 屏幕"只显示几行、其余花屏" 的问题,结合 Ai8051U 手册及 STC 论坛同类案例,为您做如下系统分析。
一、先说明一个关键点:您用的是"软件 SPI + ILI9341",与手册 TFT 彩屏接口是两回事
需要澄清:Ai8051U 手册「33 TFT彩屏接口接口(8/16位i8080/M6800接口)」章节介绍的是片内集成的 LCM 硬件接口控制器,用于驱动 i8080/M6800 并口彩屏(数据脚 P2[7:0]/P0[7:0],控制脚 RS/RD/WR 等),并不包含 SPI 接口的 ILI9341 驱动方法。您用的是软件模拟 SPI(P1.0~P1.5 逐位翻转),这不是走片内 LCM 硬件接口,而是纯 I/O 模拟时序——因此手册 TFT 章节对您的场景不直接适用,您的驱动逻辑需要靠自己保证 SPI 时序正确。
这一点可从手册 TFT 章节确认:Ai8051U 的 LCM 接口支持 i8080 和 M6800,数据宽度 8/16 位,控制脚可按 LCMIFCPS[1:0] 选择 P4.x 或 P3.x——没有提供 SPI 模式。您走软件 SPI 是正确的做法,但需要自己确保时序。
二、"只显示几行、其余花屏"的常见原因分析
这种现象在 ILI9341 驱动中,通常指向初始化序列不完整或显示区域/像素格式配置错误。结合您贴出的初始化代码(被截断),重点排查以下几处:
原因 1:初始化命令序列不完整(最可能)
ILI9341 初始化有严格的命令顺序,遗漏关键命令会导致花屏或局部显示。您贴出的代码已包含:
- 软件复位 0x01
- 电源控制 C0/C1/C5/C7
- 帧率/时序控制 B1/B6
- (后续 0x3A、0x36、0x29 等命令被截断)
最关键的几处容易遗漏:
- 0x3A(像素格式 Pixel Format Set):必须设置为 0x55(16位色)。若未设置或设为其他值(如 12/18 位),颜色数据解析错乱会导致花屏。
- 0x20(Display Inversion OFF)/ 0x21(ON):ILI9341 部分屏默认反白,需正确设置反色指令。
- 0x29(Display ON,开显示):初始化末尾必须开显示,否则只显示空白。
- 0x11(Sleep Out,退出睡眠):软件复位后必须发 0x11 并延时,再继续后续初始化。
- 0x2A / 0x2B(Column/Page Address Set):设置显示窗口范围。
建议:对照 STC 官方 ILI9341 例程的完整初始化序列逐条核对。Ai8051U DEMO-CODE 中有「37.1-2.4寸ILI9341驱动TFT显示屏实验程序」(见 F2T33 相关,论坛 Thread-21691),是官方实屏验证过的。先用官方例程把屏点亮,再做您自己的软件 SPI 改造,是最稳妥的路径。
辩证提醒:您的初始化序列可能是从网上通用代码抄的,但不同批次/厂家的 ILI9341 屏对命令敏感度略有差异。务必以官方例程为准。
原因 2:显示窗口(Column/Page Address)范围设置不当
"只显示局部几行"常见于 0x2A/0x2B 的窗口坐标范围设置错误或扫描方向不对。ILI9341 是 240×320,需确认:
- 0x2A 设为 X=0~239(0x00,0x00,0x00,0xEF)
- 0x2B 设为 Y=0~319(0x00,0x00,0x01,0x3F)
若起始偏移不对,就会出现只有部分区域显示、其余花屏/空白。
原因 3:扫描方向 MADCTL(0x36)配置
论坛 Thread-86「ILI9341_扫描顺序」正是讨论 0x36(Memory Access Control)对显示方向的影响。0x36 的 MY/MX/MV/ML/BGR 位设置错误会导致显示错位、颠倒、局部正常。
原因 4:软件 SPI 时序问题(需检查)
您的软件 SPI 是高位在前(for(j=0x80; j; j>>=1)),逻辑正确。但要注意:
- SCLK 空闲电平与采样边沿:ILI9341 通常要求 **CPOL=0(空闲低)、CPHA=0(第一个边沿采样)**。您的代码 SCLK 空闲为 0,先设 MOSI 再拉高 SCLK,符合模式 0,基本正确。
- CS(片选)时序:注意
Lcd_Cmd/Lcd_Data 中 CS 每次拉低又拉高。若在"命令+数据"连续传输中 CS 被拉高,会打断传输。ILI9341 的命令写通常要求 CS 全程保持低直到命令+参数写完。
- DC(数据/命令)切换时机:DC 必须在数据建立前稳定,且 CS 拉低期间不能切换错。
原因 5:I/O 口模式配置(手册依据)
根据 Ai8051U 手册「14 I/O口」章节,PnM0/PnM1 四种模式中,**推挽输出(PnM0=1, PnM1=0)适合作为 SPI 信号输出,驱动能力强**。您 Gpio_init 里 P1M0=0xff, P1M1=0x00 把 P1 全部配成推挽输出,这是**正确**的(论坛 Thread-11892 也强调硬件 SPI 输出要设推挽)。
不过要留意:P1.2(MISO)若是只读不用的,推挽输出无碍,但若屏的 MISO 是输入到单片机的,应配成高阻输入。您的 SPI 是单向写屏,可不用 MISO。
原因 6:延时函数依赖时钟频率,可能不准确
您的 Delay(unsigned long t) 用 _nop_ 空循环,强烈依赖 CPU 主频。ILI9341 初始化里有多处对时序敏感的延时(复位后延时、0x11 后延时等)。若主频与网上样例不一致,延时不足会导致某些屏初始化失败、花屏。建议改用定时器做精确延时,或先确认主频与样例一致。
三、给楼主的落地排查步骤
| 步骤 |
操作 |
针对问题 |
| 1 |
先用官方 AI8051U ILI9341 例程把屏点亮(确认硬件接线正确) |
隔离"屏/接线"问题 |
| 2 |
核对初始化序列,补全 0x11、0x3A(0x55)、0x20/0x21、0x29 |
花屏主因 |
| 3 |
核对0x2A/0x2B 窗口范围=240×320 及起始偏移 |
只显示局部 |
| 4 |
核对0x36 MADCTL 扫描方向 |
显示错位 |
| 5 |
检查CS 时序:命令+数据全程保持 CS 拉低 |
传输中断 |
| 6 |
确认P1 推挽输出已配置(您已做对) |
信号驱动 |
| 7 |
用定时器精确延时替代 _nop_ 粗略延时 |
时序敏感 |
四、信息来源说明
- 帖子内容:STC 论坛 Thread-25338(楼主 1324***),描述"只显示几行、其余花屏"并附视频;当前帖子内容因过长被截断,我只读到初始化序列的前半部分(复位、电源控制、帧率控制)。
- 手册依据:
- Ai8051U 手册「33 TFT彩屏接口接口(8/16位i8080/M6800接口)」——确认 Ai8051U 片内 LCM 接口为 i8080/M6800 并口,无 SPI 模式;
- Ai8051U 手册「14 I/O口」——PnM0/PnM1 四种模式配置,推挽输出适用于 SPI 信号。
- 论坛参考(据论坛用户反馈):
- Thread-21691「AI8051U 试验箱 2.4寸ILI9341 例程点不亮」——官方例程路径及供电排查;
- Thread-11936「320×240 ILI9341 屏驱动不成功」——并口移植需按手册切换功能脚、不能随意改引脚;
- Thread-11892「ST7735S 软件SPI正常、硬件SPI花屏」——SPI 输出设推挽、速度过快等因素。
- 需说明:关于"0x3A 像素格式、0x36 扫描方向、0x11/0x29 等具体初始化命令及 CS 时序"的分析,是基于 ILI9341 驱动芯片通用初始化规范及论坛同类案例的通用排查方向;Ai8051U 手册中并未列出 ILI9341 的每一条初始化命令细节(手册 TFT 章节只介绍 i8080/M6800 并口硬件接口)。具体初始化序列请以 **STC 官方 ILI9341 例程(AI8051U DEMO-CODE)**或 ILI9341 芯片 datasheet 为准。
如果您愿意把完整的 Lcd_Init 函数贴出来(当前帖子内容被截断,我看不到 0xB6 之后到结尾的全部命令),或者告诉我您用的是官方例程还是完全自写的初始化序列,我可以帮您逐条核对,判断具体是哪一条命令缺失或错误导致花屏。需要的话请补充完整代码。
🔍 搜索 "https://www.stcaimcu.com/thread-25338-1-1.html"
⏱️ 查找用时 22.2s | 总回答用时 42.1s