跳转到内容

MIPI SPI 显示驱动

此驱动程序适用于使用 MIPI DBI 接口的显示屏,通过 SPI 实现。这是许多显示屏的常见接口,用于许多基于 ESP32 的显示开发板。该驱动程序设计灵活,支持广泛的显示屏,可以通过 SPI、四线 SPI 和 8 位并行接口驱动显示屏。

MIPI(移动产业处理器接口)联盟发布各种硬件和软件接口规范,包括显示总线接口(DBI),定义了串行和并行硬件接口,以及显示命令集(DCS),定义了一组用于控制显示屏的命令。这些标准用于许多嵌入式系统的显示屏,此驱动程序针对这些显示类型。

驱动程序控制的显示面板可能是各种类型,包括 TFT、IPS、AMOLED 等。每个驱动芯片和面板组合需要特定的初始化命令集,为许多常见的开发板和芯片提供标准初始化序列,但该驱动程序也设计为可在 YAML 中针对其他显示屏进行自定义。

该驱动程序支持多种显示驱动芯片,并且可以为自定义显示屏进行配置。除了支持驱动芯片外,还有几个带有集成显示屏的 ESP32 开发板的特定配置。对于这些开发板,预定义的配置将设置正确的引脚和显示屏尺寸。

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

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

这些型号代表具有已知尺寸但没有微控制器的显示屏面板。配置需要指定用于连接显示屏的引脚。

面板制造商产品描述
WAVESHARE-1.83-V2Wavesharehttps://www.waveshare.com/1.83inch-LCD-Module.htm
型号制造商产品描述
ADAFRUIT-S2-TFT-FEATHERAdafruithttps://www.adafruit.com/product/6312
ADAFRUIT-FUNHOUSEAdafruithttps://www.adafruit.com/product/4985
M5COREM5Stackhttps://docs.m5stack.com/en/core/BASIC%20v2.6
M5CORE2M5Stackhttps://docs.m5stack.com/en/core/core2
S3BOXEspressifhttps://www.espressif.com/en/products/devkits/esp32-s3-box
S3BOXLITEEspressifhttps://www.espressif.com/en/products/devkits/esp32-s3-box-lite
WAVESHARE-4-TFTWavesharehttps://www.waveshare.com/4inch-tft-touch-shield.htm
PICO-RESTOUCH-LCD-3.5Wavesharehttps://www.waveshare.com/pico-restouch-lcd-3.5.htm
WAVESHARE-ESP32-S3-TOUCH-AMOLED-1.75Wavesharehttps://www.waveshare.com/esp32-s3-touch-amoled-1.75.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/
ESP32-2432S028Sunton2.8” CYD。带 ILI9341 控制器的原始 micro-USB 版本。
ESP32-2432S028-7789Sunton带 ST7789V 的双 USB 版本。
ESP32-2432S028-9342Sunton带 ILI9342 的双 USB 版本。
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
T4-S3Lilygohttps://www.lilygo.cc/products/t4-s3
T-EMBEDLilygohttps://www.lilygo.cc/products/t-embed
T-DISPLAYLilygohttps://www.lilygo.cc/products/t-display
T-DISPLAY-S3Lilygohttps://www.lilygo.cc/products/t-display-s3
T-DISPLAY-S3-PROLilygohttps://www.lilygo.cc/products/t-display-s3-pro
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

使用 Spi 与显示驱动芯片通信。驱动程序支持单线 SPI、四线 SPI 和八线 SPI。SPI 总线必须单独配置,并且必须是显示驱动芯片正确的类型。

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

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

  • model (必填):从上方支持的芯片和型号列表中选择,或 CUSTOM 用于自定义显示屏。
  • bus_mode (可选):选择显示驱动程序的 SPI 总线模式。选项有 single(默认)、quadoctal
  • dc_pin (必填, 引脚模式):DC 引脚。四线 SPI 不需要或不允许。
  • reset_pin (可选, 引脚模式):RESET 引脚。
  • cs_pin (可选, 引脚模式):CS 引脚。

NOTE

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

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

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

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

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

    • height (必填, int):指定显示屏高度(像素)。
    • width (**必填”, int):指定显示屏宽度。
    • offset_width (可选, int):指定显示屏 x 方向的偏移量,通常用于 LCD 小于驱动芯片支持的最大尺寸时。默认为 0。
    • offset_height (可选, int):指定显示屏 y 方向的偏移量。默认为 0。
  • invert_colors (可选, 布尔值):指定是否反转显示屏颜色。选项为 truefalse。默认为 false

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

  • transform (可选):如果 rotation 不够用,使用此选项变换显示屏。如果指定了此选项,则还必须提供 dimensions 选项。值可以是字符串 disabled 以禁用硬件变换,或一个字典。 对于 CUSTOM 型号,如果显示屏不支持变换,请使用 transform: disabled,这将防止 rotation 被转换为硬件变换,否则使用以下选项:

    • swap_xy (*必填, 布尔值):如果为 true,交换 x 和 y 轴。
    • mirror_x (*必填, 布尔值):如果为 true,镜像 x 轴。
    • mirror_y (*必填, 布尔值):如果为 true,镜像 y 轴。
  • color_depth (可选):显示缓冲区的颜色深度,以位表示。选项有 16(默认)和 8。8 位深度只会产生 256 种可能的颜色,只有在微控制器内存有限时才应使用。驱动程序会将 8 位颜色转换为显示芯片所需的格式。

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

  • init_sequence (可选):允许添加自定义初始化序列。详见下文。
  • pixel_mode (可选):选择显示驱动程序的接口模式。选项有 16bit(默认)和 18bit。大多数显示屏需要 16 位模式,除非显示屏需要 18 位模式,否则首选 16 位模式。
  • spi_16 (可选):在使用单线 SPI 但通过 16 位移位寄存器并行驱动显示屏的开发板上设置为 true
  • data_rate (可选):SPI 数据速率。默认为 10MHz,但开发板预设可能会覆盖此值。
  • spi_mode (可选):SPI 模式。选项有 MODE0MODE1MODE2MODE3。单线 SPI 默认为 MODE0,八线 SPI(并行总线)默认为 MODE3
  • draw_rounding (可选):绘图操作的四舍五入因子。默认为 2。某些芯片需要更高的值以避免显示伪影。必须是 2 的幂。
  • use_axis_flips (可选):如果为 true,驱动程序将使用 MADCTL 寄存器中的替代位来实现 x 和 y 镜像。默认为 false。
  • byte_order (可选):显示缓冲区的字节顺序。选项有 big_endian(默认)和 little_endian。这影响使用 16 位颜色深度时缓冲区的字节顺序。默认值适用于大多数显示屏。

注意: 可实现的最大数据速率取决于芯片类型(如 ESP32 与 ESP32-S3)、使用的引脚(在 ESP32 上使用默认 SPI 引脚可以实现更高速率)和连接类型(板载连接比长电缆或杜邦线支持更高速率。)如果不确定,请从低速开始测试更高速率以找到可行方案。最好不要指定 MISO 引脚,因为在某些情况下这会限制最大速率,而且如果 SPI 总线仅用于显示屏,则不需要 MISO 引脚。

显示驱动程序将数据从缓冲区写入显示芯片。当使用 Lvgl 时,显示驱动程序本身不需要缓冲区,因为 LVGL 将分配并使用自己的缓冲区。 当改为使用 lambda 函数更新显示屏(而不是 LVGL)时,需要由显示驱动程序分配缓冲区。 此缓冲区的大小由 buffer_size 选项确定。当配置了 PSRAM 时默认为 100%,否则将计算为缓冲区大小小于 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 选项,并且 widthheight 值应设置为反映旋转后的最终屏幕尺寸。

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

当使用带有旋转的 CUSTOM 型号时,如果芯片不支持硬件变换,请使用 transform: disabled 禁用硬件变换并确保软件旋转。

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

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