跳到主要内容

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 协议不同,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 模式:使用 CSSCLKMOSID/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 组件进行开发。软件可以分为以下三层:

  1. SDK 层:ESP-IDF 提供 SPI 主机和 DMA 驱动,并通过 esp_lcd 提供统一 API,用于发送 LCD 命令、参数和色彩数据。
  2. Driver 层:LCD 驱动组件根据具体控制器型号完成复位、初始化命令和显示参数配置,并创建 esp_lcd_panel_handle_t 类型的 LCD 设备句柄。SPI 接口设备通常使用 esp_lcd_panel_io_handle_t 类型的句柄。
  3. APP 层:应用通过 LCD 通用 API 或 LVGL 等 GUI 框架完成图像、文字、动画和触摸交互功能。

SPI LCD 驱动流程

SPI LCD 的驱动流程通常包括以下阶段:

  1. 初始化 SPI 总线,配置 SCLKMOSIMISO 和 DMA 传输参数。
  2. 创建 SPI LCD 接口设备,配置 CSD/C、SPI 时钟、SPI 模式、命令位宽、参数位宽和传输队列深度。
  3. 移植或选择目标 LCD 控制器的驱动组件,确认初始化命令和参数与目标屏幕匹配。
  4. 创建 LCD 设备句柄,执行硬件复位、初始化、镜像、反色、偏移和显示开关等操作。
  5. 通过 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 驱动,常见控制器包括:

  • ST7789
  • GC9A01
  • GC9D01
  • ILI9341
  • ST7796
  • ST77916
  • GC9B71
  • SH8601
  • SPD2010

即使使用相同的 LCD 驱动芯片,不同屏幕也可能需要不同的初始化命令、分辨率、偏移、像素格式和时序参数。移植驱动时,应以目标屏幕的硬件资料和初始化参数为准。

参考资料

SPI LCD 的接口模式、驱动流程和 esp_lcd 软件框架可参考 乐鑫 SPI LCD 详解乐鑫 LCD 开发指南