跳转到内容

MIPI SPI 显示驱动

此驱动适用于使用通过 SPI 实现的 MIPI DBI 接口的显示。这是许多 显示的常见接口,并在许多基于 ESP32 的显示板卡中使用。驱动设计灵活,支持广泛的 显示,并通过 SPI、Quad SPI 和 8 位并行接口驱动显示。

MIPI(Mobile Industry Processor Interface)联盟发布各种硬件和软件接口规范 包括显示总线接口(DBI),它定义了串行和并行硬件接口,以及显示命令 集(DCS),它定义了一组用于控制显示的命令。这些标准用于许多旨在 用于嵌入式系统的显示,此驱动针对这些显示类型。

驱动控制的显示面板可以是各种类型,包括 TFT、IPS、AMOLED 等。每个驱动 芯片和面板组合需要一组特定的初始化命令,并为许多常见 板卡和芯片提供了标准的初始化序列,但驱动也设计为可通过 YAML 自定义其他显示。

驱动支持许多显示驱动芯片,并可配置为自定义显示。除了支持 驱动芯片外,还有针对几款带集成显示的 ESP32 板卡的特定配置。对于这些板卡 预定义配置将为显示设置正确的引脚和尺寸。

对于自定义显示,驱动可以用正确的引脚和尺寸配置,并指定驱动芯片, 或提供自定义的初始化序列。具有 8 位并行接口的显示通过 使用八位 SPI 总线支持,因此这里对并行和八位 SPI 的引用是等价的。

驱动芯片典型尺寸
AXS15231320x240
GC9A01A240x240
GC9D01N240x240
GC9107128x128
CO5300466x466
ILI9341320x240
ILI9342240x320
ILI9481320x480
ILI9486320x480
ILI9488320x480
ILI9488_A320x480
RM690B0320x240
ST7796320x480
ST7789P240x320
ST7789V240x320
ST7735128x160
CUSTOM可自定义

这些模型代表具有已知尺寸的显示面板,但没有微控制器。配置需要 指定与显示接口通信所用的引脚。

面板制造商产品描述
WAVESHARE-1.83-V2Wavesharehttps://www.waveshare.com/1.83inch-LCD-Module.htm
型号制造商产品描述
ADAFRUIT-FUNHOUSEAdafruithttps://www.adafruit.com/product/4985
ADAFRUIT-S2-TFT-FEATHERAdafruithttps://www.adafruit.com/product/6312
ESP32-2424S012Sunton1.28” 圆形 CYD,带 GC9A01A 控制器。
ESP32-2432S028Sunton2.8” CYD。原始 micro-USB 版本,带 ILI9341 控制器。
ESP32-2432S028-7789Sunton双 USB 版本,带 ST7789V。
ESP32-2432S028-9342Sunton双 USB 版本,带 ILI9342。
GEEKMAGIC-SMALLTVGeekMagichttps://geekmagic.com/products/geekmagic-ultra-4
GEEKMAGIC-SMALLTV-PROGeekMagichttps://geekmagic.com/products/geekmagic-ultra
JC3248W535Guitionhttps://www.aliexpress.com/item/1005007566332450.html
JC3636W518Guitionhttps://www.aliexpress.com/item/1005007890666293.html
JC3636W518V2Guitionhttps://www.aliexpress.com/item/1005007890666293.html
JC4827W543Guitionhttps://www.aliexpress.com/item/1005006729377800.html
LANBON-L8Lanbonhttps://www.lanbon.cn/product/lanbon-l8
M5COREM5Stackhttps://docs.m5stack.com/en/core/BASIC%20v2.6
M5CORE2M5Stackhttps://docs.m5stack.com/en/core/core2
M5STACK-ATOMS3R-GC9107M5Stackhttps://shop.m5stack.com/products/atoms3r-dev-kit
PICO-RESTOUCH-LCD-3.5Wavesharehttps://www.waveshare.com/pico-restouch-lcd-3.5.htm
S3BOXEspressifhttps://www.espressif.com/en/products/devkits/esp32-s3-box
S3BOXLITEEspressifhttps://www.espressif.com/en/products/devkits/esp32-s3-box-lite
T-DISPLAYLilygohttps://www.lilygo.cc/products/t-display
T-DISPLAY-S3Lilygohttps://www.lilygo.cc/products/t-display-s3
T-DISPLAY-S3-AMOLEDLilygohttps://www.lilygo.cc/products/t-display-s3-amoled
T-DISPLAY-S3-AMOLED-PLUSLilygohttps://www.lilygo.cc/products/t-display-s3-amoled-plus
T-DISPLAY-S3-PROLilygohttps://www.lilygo.cc/products/t-display-s3-pro
T-EMBEDLilygohttps://www.lilygo.cc/products/t-embed
T4-S3Lilygohttps://www.lilygo.cc/products/t4-s3
WAVESHARE-4-TFTWavesharehttps://www.waveshare.com/4inch-tft-touch-shield.htm
WAVESHARE-ESP32-C6-LCD-1.47Wavesharehttps://www.waveshare.com/wiki/ESP32-C6-LCD-1.47
WAVESHARE-ESP32-S3-GEEKWavesharehttps://www.waveshare.com/esp32-s3-geek.htm
WAVESHARE-ESP32-S3-TOUCH-AMOLED-1.64Wavesharehttps://www.waveshare.com/ESP32-S3-Touch-AMOLED-1.64.htm
WAVESHARE-ESP32-S3-TOUCH-AMOLED-1.75Wavesharehttps://www.waveshare.com/esp32-s3-touch-amoled-1.75.htm
WAVESHARE-ESP32-S3-TOUCH-AMOLED-2.16Wavesharehttps://www.waveshare.com/esp32-s3-touch-amoled-2.16.htm
WAVESHARE-ESP32-S3-TOUCH-LCD-3.49Wavesharehttps://www.waveshare.com/esp32-s3-touch-lcd-3.49.htm
WT32-SC01-PLUSWireless-Taghttps://www.wireless-tag.com/portfolio/wt32-sc01-plus/

使用 Spi 与显示驱动芯片通信。驱动支持单比特 SPI、四比特 SPI 和八比特 SPI。SPI 总线必须单独配置,并且必须与显示驱动芯片类型匹配。

# 示例最小配置条目
display:
- platform: mipi_spi
model: T_EMBED

所有 图形显示配置 选项均可用,此外还有以下选项。对于集成显示板 大部分配置将默认设置,如有需要可以覆盖。

  • model (必需): 从上面支持的芯片和型号列表中选择,或 CUSTOM 用于自定义显示。
  • bus_mode (可选): 选择显示驱动的 SPI 总线模式。可选值为 single(默认)、quad 和 octal。
  • dc_pin (必需, Pin Schema): DC 引脚。四比特 SPI 不需要也不允许。
  • reset_pin (可选, Pin Schema): RESET 引脚。
  • cs_pin (可选, Pin Schema): CS 引脚。

NOTE

单比特 SPI 和 8 位并行需要 DC 引脚,CS 引脚和 RESET 引脚只有在特定板卡将 引脚连接到 GPIO 时才需要。使用带集成显示的板卡时,引脚将默认设置 为正确的值,但如有需要可以在配置中覆盖。

  • enable_pin (可选, Pin Schema): 一个可选的使能引脚,如果 需要的话。可以提供引脚列表用于需要多个使能引脚的显示。可以提供完整的引脚配置 来设置引脚模式和反转属性。默认引脚将被驱动为高电平以启用显示。

  • brightness (可选, int): 显示的初始亮度,仅适用于 AMOLED 显示。这应该是 0 到 255 之间的值,默认为 0xD0。

  • color_order (可选): 应为 bgr(默认)或 rgb 之一。这指定了显示面板中颜色通道的顺序。大多数显示默认为 bgr,但有些显示可能需要 rgb。它不影响显示缓冲区的颜色顺序,后者始终为 RGB。

  • dimensions (可选): 屏幕尺寸,可以 width x height(例如 320x240 )或分别用配置键指定。如果不提供,尺寸将由所选型号确定。CUSTOM 型号需要此选项,其他型号可选。尺寸以像素为单位,宽度且高度必须大于 0。以下键可用:

    • height (必需, int): 以像素指定显示的高度。
    • width (必需, int): 指定显示的宽度。
    • offset_width (可选, int): 指定显示的 x 方向偏移量,通常用于 LCD 小于驱动芯片最大支持尺寸时。默认为 0
    • offset_height (可选, int): 指定显示的 y 方向偏移量。默认为 0。
    • pad_width (可选, int): 指定在偏移量和宽度之后控制器识别的额外像素。这代表显示右侧可寻址但不可见的像素。默认为 0。用于计算原生尺寸和支持硬件旋转。
    • pad_height (可选, int): 指定在偏移量和高度之后控制器识别的额外像素。这代表显示底部可寻址但不可见的像素。默认为 0。用于计算原生尺寸和支持硬件旋转。
  • invert_colors (可选, boolean): 指定显示颜色是否应反转。可选值为 true 或 false。默认为 false。

  • rotation (可选): 旋转显示。可选值为 0°、90°、180° 或 270°。如果驱动芯片支持给定方向的硬件旋转,这将转换为适当的硬件命令。如果不支持硬件旋转,将在软件中旋转显示。

  • color_depth (可选): 显示缓冲区的颜色深度,以位为单位。可选值为 16(默认)和 8。8 位深度将导致只有 256 种可能的颜色,仅当微控制器内存有限时才应使用。驱动会将 8 位颜色转换为显示芯片所需的格式。

  • buffer_size (可选): 分配的缓冲区内存占屏幕大小的百分比。默认值为 100%(当配置了 PSRAM 时),否则将计算 以实现小于 20K 字节的缓冲区大小。有关缓冲区大小的讨论请参见下文。

  • init_sequence (可选): 允许添加自定义初始化序列。有关更多信息,请参见下文。

  • pixel_mode (可选): 选择显示驱动的接口模式。可选值为 16bit(默认)和 18bit。大多数显示需要 16 位模式,除非显示需要 18 位模式,否则首选 16 位。

  • spi_16 (可选): 在单比特 SPI 使用但通过 16 位移位寄存器并行驱动显示的板卡上设置为 true。

  • data_rate (可选): SPI 数据速率。默认为 10MHz,但板卡预设可能会覆盖此设置。 最大可实现的数据速率将取决于芯片类型(例如 ESP32 与 ESP32-S3)、使用的引脚(在 ESP32 上使用默认 SPI 引脚允许更高的速率), 和连接类型(板载连接将比长电缆或杜邦线支持更高的速率)。如果不确定,请从低速开始 并测试更高的速率以找到可用的速率。

  • spi_mode (可选): SPI 模式。可选值为 MODE0、MODE1、MODE2 和 MODE3。默认为 MODE3(八比特 SPI 且单比特 SPI 无 CS 引脚),或 MODE0(其他情况)。

  • draw_rounding (可选): 绘制操作的舍入因子。默认为 2。某些芯片需要更高的值以避免显示伪影。必须是 2 的幂。

  • byte_order (可选): 显示缓冲区的字节顺序。可选值为 big_endian(默认)和 little_endian。这会影响使用 16 位颜色深度时的字节顺序。默认适用于大多数显示。

  • transform (可选): 可用于镜像和/或交换 x 和 y 轴。除非使用 CUSTOM 型号,否则不应需要。 选择预定义型号时,只需使用 rotation 即可定向显示,例如从纵向切换到横向。 如果指定此选项,则必须同时提供 dimensions 选项。 值可以是字符串 disabled 以禁用硬件转换,或一个字典。 对于 CUSTOM 型号,如果显示不支持轴交换,使用 transform: disabled,这将防止 rotation 被转换为硬件转换。

    • swap_xy (必需, boolean): 如果为 true,则交换 x 和 y 轴。
    • mirror_x (必需, boolean): 如果为 true,则镜像 x 轴。
    • mirror_y (必需, boolean): 如果为 true,则镜像 y 轴。
  • use_axis_flips (可选): 如果为 true,驱动将使用 MADCTL 寄存器中的替代位来实现 x 和 y 镜像。默认为 false。

显示驱动从缓冲区向显示芯片写入数据。使用 Lvgl 时,显示驱动本身不需要缓冲区,因为 LVGL 将 分配并使用自己的缓冲区。 如果改为使用 lambda 函数更新显示(而不是 LVGL),则需要显示驱动分配缓冲区。 此缓冲区的大小由 buffer_size 选项决定。默认值为 100%(当配置了 PSRAM 时),否则将计算 以实现小于 20K 字节的缓冲区大小。例如,一个 320x240 的显示,缓冲区大小为 320 * 240 * 2 字节(对于 RGB565)= 153600 字节。 如果缓冲区大小设置为 50%,则缓冲区将占用 76800 字节。如果使用 8 位颜色深度,则每个像素只占用 1 字节。

缓冲区大小是缓冲区大小与显示驱动性能之间的权衡。更大的缓冲区大小将提供更好的性能, 但在内存有限的板卡上,可能需要较小的缓冲区大小以避免内存不足。使用小于 100% 的缓冲区时,驱动将 多次调用绘制 lambda 来绘制显示的每个块。例如,使用 25% 的缓冲区大小,驱动将调用绘制 lambda 四次来绘制显示。 这会影响性能,在设置缓冲区大小时应予以考虑,但绘制 lambda 不应有 副作用这一点也很重要 —— 无论如何都应避免这种情况,但在使用小于 100% 的缓冲区时变得更为关键。

init_sequence 选项允许对驱动芯片进行附加配置。提供的命令将在选定型号的预定义命令之后发送到驱动芯片。它需要一个字节序列列表:

init_sequence:
- [ 0xD0, 0x07, 0x42, 0x18]
- delay 10ms
- [ 0xD1, 0x00, 0x07, 0x10]

每个条目代表一个单字节命令,后跟零个或多个数据字节。可以使用 delay 关键字后跟毫秒数来插入延迟。延迟不精确,但至少是指定时间。 如果从其他代码转换,请确保(如果存在)长度字节没有被复制,因为每个命令序列的长度由列表中的字节数确定。

CUSTOM 型号选择用于其他不受支持的显示,需要同时指定 dimensions: 和 init_sequence:。没有预定义的初始化序列。

在大多数情况下,rotation 选项足以正确定向显示。然而,一些自定义显示可能需要额外的转换,例如纠正镜像图像。transform 选项允许以 8 种不同 组合中的任何一种应用这些转换。可能需要尝试不同的组合以获得期望的结果。使用 transform 选项时,除非显示不支持轴交换,否则不应设置 rotation 选项。 如果设置了 swap_xy 选项,则需要 dimensions 选项,并且 width 和 height 值应反映旋转后的最终屏幕尺寸。

transform:
swap_xy: true
mirror_x: true
mirror_y: false
dimensions:
height: 480
width: 320

当与 CUSTOM 型号一起使用旋转时,如果芯片不支持硬件转换,使用 transform: disabled 禁用硬件转换并确保软件旋转。

许多显示器有集成背光,可能需要打开背光才能显示。此背光不由驱动控制, 但可以通过单独的 GPIO 引脚控制。根据显示器不同,背光可能是高电平有效或低电平有效,并且可能 能够使用 单色 配合 Ledc 调光。AMOLED 显示器没有背光,但 可以通过 brightness 选项设置其亮度。这也可以通过 lambda API 调用控制。

如果存在触摸屏,必须单独配置。更多信息请参见 触摸屏 文档。