MIPI SPI 显示驱动
此驱动适用于使用通过 SPI 实现的 MIPI DBI 接口的显示。这是许多 显示的常见接口,并在许多基于 ESP32 的显示板卡中使用。驱动设计灵活,支持广泛的 显示,并通过 SPI、Quad SPI 和 8 位并行接口驱动显示。
MIPI(Mobile Industry Processor Interface)联盟发布各种硬件和软件接口规范 包括显示总线接口(DBI),它定义了串行和并行硬件接口,以及显示命令 集(DCS),它定义了一组用于控制显示的命令。这些标准用于许多旨在 用于嵌入式系统的显示,此驱动针对这些显示类型。
驱动控制的显示面板可以是各种类型,包括 TFT、IPS、AMOLED 等。每个驱动 芯片和面板组合需要一组特定的初始化命令,并为许多常见 板卡和芯片提供了标准的初始化序列,但驱动也设计为可通过 YAML 自定义其他显示。
支持的板卡和驱动芯片
Section titled “支持的板卡和驱动芯片”驱动支持许多显示驱动芯片,并可配置为自定义显示。除了支持 驱动芯片外,还有针对几款带集成显示的 ESP32 板卡的特定配置。对于这些板卡 预定义配置将为显示设置正确的引脚和尺寸。
对于自定义显示,驱动可以用正确的引脚和尺寸配置,并指定驱动芯片, 或提供自定义的初始化序列。具有 8 位并行接口的显示通过 使用八位 SPI 总线支持,因此这里对并行和八位 SPI 的引用是等价的。
| 驱动芯片 | 典型尺寸 |
|---|---|
| AXS15231 | 320x240 |
| GC9A01A | 240x240 |
| GC9D01N | 240x240 |
| GC9107 | 128x128 |
| CO5300 | 466x466 |
| ILI9341 | 320x240 |
| ILI9342 | 240x320 |
| ILI9481 | 320x480 |
| ILI9486 | 320x480 |
| ILI9488 | 320x480 |
| ILI9488_A | 320x480 |
| RM690B0 | 320x240 |
| ST7796 | 320x480 |
| ST7789P | 240x320 |
| ST7789V | 240x320 |
| ST7735 | 128x160 |
| CUSTOM | 可自定义 |
这些模型代表具有已知尺寸的显示面板,但没有微控制器。配置需要 指定与显示接口通信所用的引脚。
| 面板 | 制造商 | 产品描述 |
|---|---|---|
| WAVESHARE-1.83-V2 | Waveshare | https://www.waveshare.com/1.83inch-LCD-Module.htm |
带集成显示的板卡
Section titled “带集成显示的板卡”SPI 总线
Section titled “SPI 总线”使用 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 字节。
对绘制性能的影响
Section titled “对绘制性能的影响”缓冲区大小是缓冲区大小与显示驱动性能之间的权衡。更大的缓冲区大小将提供更好的性能, 但在内存有限的板卡上,可能需要较小的缓冲区大小以避免内存不足。使用小于 100% 的缓冲区时,驱动将 多次调用绘制 lambda 来绘制显示的每个块。例如,使用 25% 的缓冲区大小,驱动将调用绘制 lambda 四次来绘制显示。 这会影响性能,在设置缓冲区大小时应予以考虑,但绘制 lambda 不应有 副作用这一点也很重要 —— 无论如何都应避免这种情况,但在使用小于 100% 的缓冲区时变得更为关键。
附加初始化序列
Section titled “附加初始化序列”init_sequence 选项允许对驱动芯片进行附加配置。提供的命令将在选定型号的预定义命令之后发送到驱动芯片。它需要一个字节序列列表:
init_sequence: - [ 0xD0, 0x07, 0x42, 0x18] - delay 10ms - [ 0xD1, 0x00, 0x07, 0x10]每个条目代表一个单字节命令,后跟零个或多个数据字节。可以使用 delay 关键字后跟毫秒数来插入延迟。延迟不精确,但至少是指定时间。
如果从其他代码转换,请确保(如果存在)长度字节没有被复制,因为每个命令序列的长度由列表中的字节数确定。
CUSTOM 型号
Section titled “CUSTOM 型号”CUSTOM 型号选择用于其他不受支持的显示,需要同时指定 dimensions: 和 init_sequence:。没有预定义的初始化序列。
使用 transform 选项
Section titled “使用 transform 选项”在大多数情况下,rotation 选项足以正确定向显示。然而,一些自定义显示可能需要额外的转换,例如纠正镜像图像。transform 选项允许以 8 种不同
组合中的任何一种应用这些转换。可能需要尝试不同的组合以获得期望的结果。使用 transform 选项时,除非显示不支持轴交换,否则不应设置 rotation 选项。
如果设置了 swap_xy 选项,则需要 dimensions 选项,并且 width 和 height 值应反映旋转后的最终屏幕尺寸。
transform: swap_xy: true mirror_x: true mirror_y: falsedimensions: height: 480 width: 320当与 CUSTOM 型号一起使用旋转时,如果芯片不支持硬件转换,使用 transform: disabled 禁用硬件转换并确保软件旋转。
LCD 背光
Section titled “LCD 背光”许多显示器有集成背光,可能需要打开背光才能显示。此背光不由驱动控制,
但可以通过单独的 GPIO 引脚控制。根据显示器不同,背光可能是高电平有效或低电平有效,并且可能
能够使用 单色 配合 Ledc 调光。AMOLED 显示器没有背光,但
可以通过 brightness 选项设置其亮度。这也可以通过 lambda API 调用控制。
如果存在触摸屏,必须单独配置。更多信息请参见 触摸屏 文档。