驱动芯片初始化:ST7735/ILI9341初始化序列、寄存器配置、上下电时序
好,咱们今天聊点实在的。驱动芯片初始化,说白了就是让屏幕“醒过来”并进入工作状态。很多新手朋友一上来就急着刷像素,结果屏幕一片漆黑,或者花屏。嗯,我当年也干过这事儿。
我个人习惯,拿到一块新屏,第一件事不是看数据手册里的像素格式,而是先翻到“初始化序列”那一章。为什么?因为芯片上电后,默认状态可能连振荡器都没开,你发啥命令它都不理你。
ST7735 初始化:小尺寸屏的典型代表
ST7735 常见于 1.8 寸、1.44 寸的小屏。它的初始化流程,我总结为三步走:
- 软件复位:发 0x01 命令,让芯片内部状态机归零。
- 睡眠模式退出:发 0x11 命令,唤醒振荡器和 DC-DC 转换器。
- 显示开:发 0x29 命令,打开显示。
但光这三步不够。中间还得配置一堆寄存器,比如帧率、伽马曲线、像素格式。我贴一段我项目里用过的初始化序列,你感受一下:
// ST7735 初始化序列(部分关键命令)
void ST7735_Init(void) {
ST7735_WriteCmd(0x01); // 软件复位
delay_ms(120); // 等待复位完成,这个延时不能省
ST7735_WriteCmd(0x11); // 退出睡眠模式
delay_ms(120);
ST7735_WriteCmd(0xB1); // 帧率控制
ST7735_WriteData(0x05);
ST7735_WriteData(0x3C);
ST7735_WriteData(0x3C);
ST7735_WriteCmd(0xB4); // 列反转控制
ST7735_WriteData(0x03);
ST7735_WriteCmd(0xC0); // 电源控制
ST7735_WriteData(0x62);
ST7735_WriteData(0x02);
ST7735_WriteData(0x04);
ST7735_WriteCmd(0x3A); // 像素格式设置
ST7735_WriteData(0x05); // 16位色(RGB565)
ST7735_WriteCmd(0x29); // 打开显示
delay_ms(10);
}
ILI9341 初始化:大屏的复杂之处
ILI9341 常用于 2.8 寸、3.2 寸的屏,寄存器比 ST7735 多得多。它的初始化序列,说白了就是一套“组合拳”。
我记得第一次调 ILI9341,看着数据手册里 30 多条命令,头都大了。后来我总结出一个规律:先配电源,再配时序,最后配显示参数。
下面这个表格,是我从多个项目中提炼出来的关键寄存器配置:
| 命令 | 功能 | 典型值 | 说明 |
|---|---|---|---|
| 0xCF | 电源控制 B | 0x00, 0x83, 0x30 | 内部参考电压设置 |
| 0xED | 电源控制 A | 0x64, 0x03, 0x12, 0x81 | 正负电压驱动能力 |
| 0xE8 | 驱动时序控制 A | 0x85, 0x01, 0x79 | 栅极驱动时序 |
| 0xCB | 驱动时序控制 B | 0x39, 0x2C, 0x00, 0x34, 0x02 | 源极驱动时序 |
| 0xF7 | 调整控制 | 0x20 | 内部时钟分频 |
| 0x3A | 像素格式 | 0x55 | 16位色(RGB565) |
上下电时序:最容易忽略的坑
上下电时序,说白了就是给屏幕供电和断电时,信号线的先后顺序。这个搞不好,轻则花屏,重则烧芯片。
我遇到过最离谱的一次,是客户反馈屏幕偶尔不亮。查了三天,最后发现是上电时 VCC 还没稳定,MCU 就已经发了 SPI 时钟。芯片内部逻辑混乱了。
正确的上电时序应该是:
- 先给 VCC 和 VDDI 供电(3.3V)
- 等待 10ms,让电源稳定
- 拉高复位引脚(RST),释放复位
- 等待 120ms,等芯片内部振荡器起振
- 再发初始化命令
下电时序反过来:
- 先发 0x28(显示关)
- 再发 0x10(进入睡眠)
- 等待 120ms
- 拉低复位引脚
- 最后切断电源
核心要点: 电源稳定之前,绝对不要操作 SPI 总线。我曾经在 STM32 上用 GPIO 模拟 SPI,上电时 GPIO 默认输出低电平,结果屏幕直接罢工。后来我在初始化代码开头加了 50ms 的延时,问题就解决了。
寄存器配置的通用思路
说实话,不同厂家的屏幕,寄存器地址可能不一样。但配置思路是相通的:
- 电源相关寄存器:先配,保证芯片能正常工作
- 时序相关寄存器:再配,决定扫描速度和帧率
- 显示参数寄存器:最后配,包括像素格式、伽马曲线、窗口设置
你想想看,如果电源都没稳定,你配啥显示参数都没用。这个顺序不能乱。
嗯,这里要注意一点:很多数据手册里的初始化序列,是厂家给的“推荐值”。但实际项目中,你可能需要微调。比如帧率寄存器,默认值可能让屏幕闪烁,你得根据你的 MCU 主频和 SPI 速度来调整。
我个人习惯,拿到一块新屏,先用厂家给的序列点亮它。点亮之后,再一个一个寄存器去调,看效果。这样心里有底。
好了,关于 ST7735 和 ILI9341 的初始化,今天就聊这么多。下一节咱们讲帧率优化,到时候会用到今天配的这些寄存器。你先把初始化跑通,后面的事就好办了。