驱动芯片初始化:ST7735/ILI9341初始化序列、寄存器配置、上下电时序

好,咱们今天聊点实在的。驱动芯片初始化,说白了就是让屏幕“醒过来”并进入工作状态。很多新手朋友一上来就急着刷像素,结果屏幕一片漆黑,或者花屏。嗯,我当年也干过这事儿。

我个人习惯,拿到一块新屏,第一件事不是看数据手册里的像素格式,而是先翻到“初始化序列”那一章。为什么?因为芯片上电后,默认状态可能连振荡器都没开,你发啥命令它都不理你。

ST7735 初始化:小尺寸屏的典型代表

ST7735 常见于 1.8 寸、1.44 寸的小屏。它的初始化流程,我总结为三步走:

  1. 软件复位:发 0x01 命令,让芯片内部状态机归零。
  2. 睡眠模式退出:发 0x11 命令,唤醒振荡器和 DC-DC 转换器。
  3. 显示开:发 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);
}
注意: 我曾经在 ST7735 上踩过一个坑——复位后立刻发命令,芯片没响应。后来发现是延时不够。数据手册说 120ms,我建议你给到 150ms,留点余量。

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)
小技巧: 你想想看,ILI9341 的初始化代码动辄上百行。我建议你把它封装成一个函数,放在单独的文件里。这样主程序看起来清爽,调试也方便。

上下电时序:最容易忽略的坑

上下电时序,说白了就是给屏幕供电和断电时,信号线的先后顺序。这个搞不好,轻则花屏,重则烧芯片。

我遇到过最离谱的一次,是客户反馈屏幕偶尔不亮。查了三天,最后发现是上电时 VCC 还没稳定,MCU 就已经发了 SPI 时钟。芯片内部逻辑混乱了。

正确的上电时序应该是:

  1. 先给 VCC 和 VDDI 供电(3.3V)
  2. 等待 10ms,让电源稳定
  3. 拉高复位引脚(RST),释放复位
  4. 等待 120ms,等芯片内部振荡器起振
  5. 再发初始化命令

下电时序反过来:

  1. 先发 0x28(显示关)
  2. 再发 0x10(进入睡眠)
  3. 等待 120ms
  4. 拉低复位引脚
  5. 最后切断电源

核心要点: 电源稳定之前,绝对不要操作 SPI 总线。我曾经在 STM32 上用 GPIO 模拟 SPI,上电时 GPIO 默认输出低电平,结果屏幕直接罢工。后来我在初始化代码开头加了 50ms 的延时,问题就解决了。

寄存器配置的通用思路

说实话,不同厂家的屏幕,寄存器地址可能不一样。但配置思路是相通的:

  • 电源相关寄存器:先配,保证芯片能正常工作
  • 时序相关寄存器:再配,决定扫描速度和帧率
  • 显示参数寄存器:最后配,包括像素格式、伽马曲线、窗口设置

你想想看,如果电源都没稳定,你配啥显示参数都没用。这个顺序不能乱。

嗯,这里要注意一点:很多数据手册里的初始化序列,是厂家给的“推荐值”。但实际项目中,你可能需要微调。比如帧率寄存器,默认值可能让屏幕闪烁,你得根据你的 MCU 主频和 SPI 速度来调整。

我个人习惯,拿到一块新屏,先用厂家给的序列点亮它。点亮之后,再一个一个寄存器去调,看效果。这样心里有底。

避坑指南: 我曾经在 ILI9341 上把伽马曲线配错了,结果屏幕颜色偏蓝。折腾了两天,最后发现是伽马寄存器的高 4 位和低 4 位写反了。所以,配置寄存器时,一定要仔细核对数据手册的位定义

好了,关于 ST7735 和 ILI9341 的初始化,今天就聊这么多。下一节咱们讲帧率优化,到时候会用到今天配的这些寄存器。你先把初始化跑通,后面的事就好办了。