SPI 接口
SPI(Serial Peripheral Interface,串行外设接口)是一种常用的同步串行通信接口,广泛应用于微控制器(MCU)与小尺寸显示屏之间的数据传输。 其主要特点如下:
- 接口简单,占用资源少,通常仅需少量 IO 引脚(如 SCLK、MOSI、CS、DC),适合 IO 资源受限的系统
- 实现成本低,硬件连接简单,无需复杂接口电路,适用于成本敏感型应用
- 易于驱动和控制,支持 MCU 直接控制显示内容,便于自定义界面开发
- 适用于小尺寸显示,常见于低分辨率、小尺寸屏幕(如 1~4 英寸)
SPI 通信协议
SPI LCD 通常仅支持主机向从机的数据写入,不提供从机返回数据(无 MISO 线),通信为单向(Master → Slave)。
常用接口信号如下:
- RESX:复位信号,上电时拉低复位,正常工作保持高电平
- CSX:片选信号,低电平时芯片被选中
- D/CX:数据/命令控制(0:命令,1:数据)
- SDA:数据输入(MOSI)
- SCL:时钟信号
SPI 时序由 CPOL 与 CPHA 决定。本类设备通常工作在 SPI Mode 0(CPOL = 0,CPHA = 0),即时钟空闲为低电平,在第一个时钟跳变沿采样数据。

与传统 SPI 协议不同,SPI LCD 仅用于显示数据输出,因此省略了从机到主机的数据通路(MISO)。详细说明可参考对应 Datasheet。
数据按位传输,每个时钟周期传输 1 bit,每 8 bit 构成 1 Byte,采用高位在前(MSB First)的传输方式。 根据 D/CX 电平不同,传输内容分为:
- 命令(D/CX = 0):用于寄存器配置与初始化
- 数据(D/CX = 1):用于写入显示内容(如 RGB 像素数据)
接口模式
不同 LCD 驱动芯片对 SPI 接口的定义可能不同,常见差异包括 Interface I/II 和 3-wire/4-wire 模式。具体模式通常由驱动芯片的硬件配置引脚或初始化命令决定。
- 4-wire 模式:使用
CS、SCLK、MOSI和D/C信号,ESP 的 SPI 外设可以直接支持。 - 3-wire 模式:通常将命令和数据控制信息复用到同一条数据线上,也称为 3-wire 或 9-bit 模式。ESP 的 SPI 外设通常不直接支持该模式,需要通过软件扩展或其他接口方案实现。
- Interface I/II:部分驱动芯片通过接口配置选择数据线方向。若 LCD 只接收显示数据,可不连接
MISO;如果需要读取显示控制器寄存器或显存,则需要根据芯片数据手册连接并配置MISO。
因此,SPI LCD 的信号名称相同并不代表接口时序完全一致。初始化前应确认驱动芯片支持的接口模式、SPI 模式(Mode 0–3)、命令位宽、参数位宽和最大时钟频率。
硬件驱动框架
大多数 SPI LCD 的驱动芯片内置 GRAM(Graphics RAM,图形 RAM)。主控通过 SPI 发送初始化命令和局部色彩数据,驱动芯片将数据写入内部 GRAM,再按照面板刷新时序将 GRAM 内容显示到屏幕上。
这种工作方式使命令传输和面板刷新相互独立。主控通常只需要在画面发生变化时发送对应区域的像素数据,不需要持续输出完整帧的 RGB 数据。实际刷新能力仍取决于 SPI 时钟频率、像素格式、刷新区域大小、DMA 配置和 LCD 驱动芯片的处理能力。
ESP-IDF 软件框架
在 ESP-IDF 中,SPI LCD 通常通过 esp_lcd 组件进行开发。软件可以分为以下三层:
- SDK 层:ESP-IDF 提供 SPI 主机和 DMA 驱动,并通过
esp_lcd提供统一 API,用于发送 LCD 命令、参数和色彩数据。 - Driver 层:LCD 驱动组件根据具体控制器型号完成复位、初始化命令和显示参数配置,并创建
esp_lcd_panel_handle_t类型的 LCD 设备句柄。SPI 接口设备通常使用esp_lcd_panel_io_handle_t类型的句柄。 - APP 层:应用通过 LCD 通用 API 或 LVGL 等 GUI 框架完成图像、文字、动画和触摸交互功能。
SPI LCD 驱动流程
SPI LCD 的驱动流程通常包括以下阶段:
- 初始化 SPI 总线,配置
SCLK、MOSI、MISO和 DMA 传输参数。 - 创建 SPI LCD 接口设备,配置
CS、D/C、SPI 时钟、SPI 模式、命令位宽、参数位宽和传输队列深度。 - 移植或选择目标 LCD 控制器的驱动组件,确认初始化命令和参数与目标屏幕匹配。
- 创建 LCD 设备句柄,执行硬件复位、初始化、镜像、反色、偏移和显示开关等操作。
- 通过
esp_lcd_panel_draw_bitmap()刷新指定区域,或将 LCD 设备接入 LVGL 等 GUI 框架。
单次 DMA 传输的最大数据量同时受 max_transfer_sz 和芯片 SPI 外设限制。esp_lcd 会对较大的图像数据进行分包处理,但应用仍需保证传输缓存的生命周期覆盖整个 DMA 传输过程。传输完成前修改同一缓存区域,可能导致显示数据错乱。
如果图像缓存位于 PSRAM,SPI DMA 可能需要先将数据复制到内部 SRAM 再传输。对于较大的刷新区域,建议根据目标芯片的 SRAM、PSRAM 和 DMA 能力合理配置图像缓存,避免因内部 SRAM 不足导致刷新失败。
常见 SPI LCD 驱动组件
乐鑫 esp_lcd 及相关 ESP 组件中已提供多种 SPI LCD 驱动,常见控制器包括:
ST7789GC9A01GC9D01ILI9341ST7796ST77916GC9B71SH8601SPD2010
即使使用相同的 LCD 驱动芯片,不同屏幕也可能需要不同的初始化命令、分辨率、偏移、像素格式和时序参数。移植驱动时,应以目标屏幕的硬件资料和初始化参数为准。
参考资料
SPI LCD 的接口模式、驱动流程和 esp_lcd 软件框架可参考 乐鑫 SPI LCD 详解 和 乐鑫 LCD 开发指南。