LCD 开发指南

[English]

本指南主要包含如下内容:

术语表

请参阅 LCD 术语表

支持的接口类型

乐鑫芯⽚已经⽀持了 LCD 概述 - 驱动接口 一节介绍的全部接⼝类型,各系列 ESP 芯⽚的具体⽀持情况如下:

Soc

SPI (QSPI)

I80

RGB

MIPI-DSI

ESP32

supported

supported

ESP32-C3

supported

ESP32-C6

supported

ESP32-S2

supported

supported

ESP32-S3

supported

supported

supported

ESP32-P4

supported

supported

supported

supported

驱动及示例

LCD 外设驱动 位于 ESP-IDF 下的 components/esp_lcd 目录,目前支持 I2CSPI (QSPI)I80 以及 RGB 接口,详细介绍请参考 文档。下表是目前乐鑫官方基于 esp_lcd 移植的 LCD 驱动组件 , 并且 LCD 驱动组件 会持续更新:

接口

LCD 控制器

I2C

ssd1306, sh1107

SPI

axs15231b, st7789, nt35510, gc9b71, nv3022b, sh8601, spd2010, st77916, st77922, gc9a01, ili9341, ssd1681, st7796

QSPI

axs15231b, gc9b71, sh8601, spd2010, st77903, st77916, st77922

I80

axs15231b, st7789, nt35510, ra8875, st7796

MIPI-DSI

ek79007, jd9165, jd9365, st7701, st7703, st77922, ili9881c, hx8399

3-wire SPI + RGB

st7701, st77903_rgb, st77922, gc9503

请注意:

  • st7789nt35510ssd1306 组件保存在 ESP-IDF 中。其余组件可以在 ESP 组件管理器 中搜索使用。

  • 即使 LCD 驱动 IC 的型号相同,不同的屏幕往往需要使用各自厂商提供的初始化命令配置,大部分驱动组件支持在初始化 LCD 设备时传入自定义的初始化命令,若不支持,请参考 方法

LCD 示例 位于 ESP-IDF 下的 examples/peripherals/lcd 目录和 esp-iot-solution 下的 examples/display/lcd 目录,可参考 LCD 驱动组件使用。

备注

  • 推荐基于 ESP-IDF release/v5.1 及以上版本分支进行开发,因为低版本不支持部分重要的新特性,尤其是对于 RGB 接口。

  • 对于使用 3-wire SPI + RGB 接口的 LCD,请参考示例 esp_lcd_st7701 - Example use

开发框架

硬件框架

对于 SPI/I80 LCD,ESP 可以通过单一的外设接口发送 命令 来配置 LCD 以及传输 局部的色彩数据 来刷新屏幕。LCD 的驱动 IC 会将接收到的色彩数据存储在 全屏大小的 GRAM 内,并按照固定的刷新速率把 全屏的色彩数据 显示到面板上,这两个过程是异步进行的。下面是 SPI/I80 LCD 的硬件驱动框架示意图:

硬件驱动框架示意图 - SPI/I80 LCD

硬件驱动框架示意图 - SPI/I80 LCD

对于大多数 RGB LCD,ESP 需要使用两种不同的接口,一方面通过 3-wire SPI 接口发送 命令 来配置 LCD ,另一方面通过 RGB 接口传输 全屏的色彩数据 来刷新屏幕。由于 LCD 的驱动 IC 没有内置的 GRAM,它会将接收到的色彩数据直接显示到面板上,因此这两个过程是同步进行的。下面是 RGB LCD 的硬件驱动框架示意图:

硬件驱动框架示意图 - RGB LCD

硬件驱动框架示意图 - RGB LCD

通过对比这两种框架可以看出,RGB LCD 相较于 SPI/I80 LCD,不仅需要 ESP 使用两种接口来分别实现传输命令和色彩数据,还要求 ESP 提供全屏大小的 GRAM 来实现屏幕刷新(由于芯片内的 SRAM 的空间比较有限,通常将 GRAM 放在 PSRAM 上)。

对于 QSPI LCD,不同型号的驱动 IC 可能需要不同的驱动方式,比如 SPD2010 这款 IC 内置 GRAM,其驱动方式与 SPI/I80 LCD 类似,而 ST77903 这款 IC 内部没有 GRAM,其驱动方式与 RGB LCD 类似,但是它们都是通过用单一的外设接口传输命令和色彩数据,下面是这两种 QSPI LCD 的硬件驱动框架示意图:

硬件驱动框架示意图 - QSPI LCD (有 GRAM)

硬件驱动框架示意图 - QSPI LCD (有 GRAM)

硬件驱动框架示意图 - QSPI LCD (无 GRAM)

硬件驱动框架示意图 - QSPI LCD (无 GRAM)

软件框架

软件开发框架主要由 SDK、Driver 和 APP 三个层次组成:

  1. SDK 层:ESP-IDF 作为框架的基础部分,不仅包含了驱动 LCD 所需的 I2CSPI(QSPI)I80RGB 等多种外设,还通过 esp_lcd 组件提供了统一的 APIs 来操作接口和 LCD,如命令及参数的传输,LCD 的图像刷新、反转、镜像等功能。

  2. Driver 层:基于 SDK 提供的 APIs 可以实现各种设备驱动,并通过初始化接口设备和 LCD 设备实现 LVGL (GUI 框架)的移植。

  3. APP 层:使用 LVGL 提供的 APIs 实现各种 GUI 功能,如显示图片、动画、文字等。

软件开发框架示意图

软件开发框架示意图

开发步骤

初始化接口设备

首先,初始化与 LCD 接口对应的外设。然后,创建接口设备并获取其句柄,该句柄的数据类型应为 esp_lcd_panel_io_handle_t。这样即可使用统一的 接口通用 APIs 进行数据传输。

备注

对于仅采用 RGB 接口的 LCD,不需要创建其接口设备,请直接参考 LCD 初始化

不同类型的 LCD 接口需要使用不同的外设,下面对几种常用接口的设备初始化过程进行说明:

关于这部分更加详细的说明,请参考 ESP-IDF 编程指南

初始化 LCD 设备

由于不同型号的 LCD 驱动 IC 可能具有不同的命令(寄存器)和参数,并且不同的接口类型也可能采用不同的数据格式和驱动方式,首先需要针对特定的接口利用 接口通用 APIs 来移植目标 LCD 驱动,然后创建 LCD 设备并获取数据类型为 esp_lcd_panel_handle_t 的句柄,最终使得应用程序能够通过统一的 LCD 通用 APIs 来操作 LCD 设备。

备注

对于仅采用 RGB 接口的 LCD,不需要移植其驱动组件,请直接参考 LCD 初始化

在移植驱动组件前,请先尝试直接从 LCD 驱动组件 中获取目标 LCD 驱动 IC 的组件。若该组件不存在,那么也可以基于已有的并且接口类型相同的组件进行移植。不同接口类型的 LCD 驱动可能具有不同的移植原理,下面对几种常用接口的 LCD 驱动组件的移植方法进行说明:

然后,利用驱动组件就可以实现 LCD 的初始化,下面对几种常用接口的 LCD 初始化进行说明:

关于这部分更加详细的说明,请参考 ESP-IDF 编程指南

移植 LVGL

(待更新)

设计 GUI

(待更新)

常见问题

下面列举了一些开发 LCD 应用过程中常见的问题,请点击问题跳转查看解决方法。

相关文档