驱动芯片选型:ILI9341、ST7789、SSD1306 怎么挑?

做 LCD 驱动,第一步就是选芯片。市面上常见的驱动 IC 就那么几款,但每款的脾气都不一样。我最早做项目时,觉得随便选一个能点亮屏幕就行,结果后来刷新率上不去,查了半天才发现是驱动 IC 的接口带宽卡了脖子。所以这一节,咱们把三款主流芯片掰开揉碎了聊。

三款芯片的定位差异

先看一张对比表,心里有个底:

芯片型号 分辨率上限 接口类型 典型应用 我个人的偏好场景
ILI9341 320×240 (QVGA) SPI / 8/16-bit 并口 2.8~3.5寸 TFT 彩屏 需要高刷新率动画时,我必用并口
ST7789 240×240 / 320×320 SPI / 并口 1.3~1.8寸小圆屏、方形屏 做智能手表表盘时,它很省引脚
SSD1306 128×64 / 128×32 I²C / SPI 0.96寸 OLED 单色屏 低功耗待机界面,我首选它

说白了,ILI9341 是“全能型选手”,ST7789 是“小尺寸高颜值”,SSD1306 则是“省电小钢炮”。选型时先看你的屏幕尺寸和颜色需求,再看 MCU 还剩多少引脚。

数据手册怎么看?我教你抓重点

很多新手拿到几百页的 datasheet 就懵了。其实不用全看,抓住这几个章节就行:

  • Chapter 1: Features & Block Diagram —— 先看芯片支持什么接口、最大分辨率、GRAM 大小。我习惯把 Block Diagram 截下来,画清楚 MCU 到 GRAM 再到 LCD 面板的数据流。
  • Chapter 2: Pin Description —— 重点关注电源引脚(VCC、IOVCC)、复位引脚(RESX)、数据/命令选择脚(DC/RS)。有一次我忘了给 IOVCC 供电,屏幕死活不亮,查了半小时才发现。
  • Chapter 8: Command Table —— 这是核心。所有初始化序列都从这里来。比如 ILI9341 的 0x36(Memory Access Control)、0x3A(Pixel Format Set)。
  • Chapter 9: Timing Characteristics —— 刷新率优化的关键。看 SPI 最高能跑多少 MHz,并口的最小读写周期是多少。
我的小技巧: 拿到 datasheet 后,先把 Command Table 那几页打印出来贴在工位上。写驱动时翻来翻去,比盯着屏幕效率高多了。

关键寄存器配置:以 ILI9341 为例

配置驱动 IC,说白了就是往寄存器里写值。但每个寄存器都有坑。我挑几个最关键的说说:

1. Memory Access Control (0x36)

这个寄存器控制屏幕的扫描方向、RGB/BGR 顺序。你写出来的字是正的还是倒的,全看它。我遇到过客户说“屏幕显示镜像了”,其实就是这里没配对。

// ILI9341 初始化片段:设置扫描方向为横屏
void ILI9341_Init(void) {
    // 0x36: MY=0, MX=1, MV=1, ML=0, BGR=1
    // 二进制: 0110 1000 -> 0x68
    WriteCmd(0x36);
    WriteData(0x68);
    
    // 0x3A: 16位色 (RGB565)
    WriteCmd(0x3A);
    WriteData(0x55);
}

2. Pixel Format Set (0x3A)

设置颜色深度。常用的是 0x55(16位色,RGB565)和 0x66(18位色,RGB666)。注意:如果你用 16 位色,MCU 每次传 2 个字节;用 18 位色,每次要传 3 个字节。带宽占用差 50%。

3. Frame Rate Control (0xB1)

这个寄存器直接决定刷新率。ILI9341 内部有一个振荡器,通过分频设置帧率。我一般设成 0xB1 = 0x00 0x1B,对应约 60Hz。设太高了屏幕会闪烁,设太低了拖影严重。

注意: 有些便宜的屏幕模组,厂家已经把 Frame Rate 写死在初始化序列里了。你改寄存器可能没用。这时候只能从 MCU 端优化 SPI 时钟或使用并口。

ST7789 与 SSD1306 的特殊之处

ST7789 的寄存器基本和 ILI9341 兼容,但多了几个针对小尺寸屏的优化。比如 0x21(Inversion On)可以让颜色更鲜艳。我做圆形表盘时,发现它的 0x36 寄存器里有一个 MADCTL 位专门控制“部分显示模式”,用来实现圆形裁剪效果。

SSD1306 就简单多了。它只有 128×64 像素,每个像素只有 1 bit(亮或不亮)。它的关键寄存器是 0x81(对比度设置)和 0x8D(电荷泵使能)。我踩过一个坑:0x8D 如果不写 0x14,屏幕就是黑的,因为内部升压电路没启动。

// SSD1306 初始化:开启电荷泵
WriteCmd(0x8D);
WriteData(0x14);  // 使能内部 DC-DC 转换器
WriteCmd(0xAF);   // 开启显示

一张图看懂选型逻辑

下面这张 SVG 图,是我自己总结的选型决策流程。每次做新项目,我都会走一遍这个流程:

LCD 驱动 IC 选型决策流程 项目需求分析 需要彩色还是单色? 单色 SSD1306 彩色 TFT 彩屏 分辨率 > 240×240? 是 ILI9341 否 ST7789 提示:如果 MCU 引脚紧张,优先选 SPI 接口;如果追求刷新率,选并口 + ILI9341 SSD1306 的 I²C 模式最省引脚,但刷新率只有约 10fps

避坑指南:我踩过的三个雷

  • 寄存器地址不通用: 不同厂家(比如 ILI9341 和 ST7789)虽然命令码很像,但个别寄存器地址不同。我曾经直接把 ILI9341 的初始化代码搬到 ST7789 上,结果屏幕花屏。后来老老实实对着 datasheet 逐条核对。
  • 复位时序: 很多驱动 IC 要求 RESX 引脚拉低至少 10μs 再拉高。我见过有人用 GPIO 直接拉低后立刻拉高,芯片根本没复位成功。建议在复位后加一个 5ms 的延时。
  • GRAM 写入方向: 默认的写入方向是从左上角到右下角。如果你用 DMA 刷屏,一定要确认 0x36 寄存器里的扫描方向和你期望的一致,否则图像是反的。

核心总结:

  • ILI9341 适合大屏、高刷新率场景,并口是性能首选
  • ST7789 适合小尺寸、圆形屏,SPI 模式省引脚
  • SSD1306 适合低功耗、单色显示,I²C 模式最省资源
  • 数据手册重点看 Command Table 和 Timing Characteristics
  • 关键寄存器:0x36(方向)、0x3A(色深)、0xB1(帧率)