SPI 屏幕显示
- 使用 LCD 接口,通过 DE 自动刷新屏幕。
推荐的首选方式。此方式使用更简单,刷新帧率有保障,但 LCD 接口无法满足所有使用场景。比如,同时驱动多个 SPI 屏幕时,部分型号 SPI 屏幕不支持 LCD 接口。
- 使用标准 SPI 控制器,手动刷新屏幕。
本章节介绍如何使用 SPI 控制器替换 LCD 接口进行刷屏以及 SPI 双屏异显的配置方式。
SPI 控制器刷屏
Luban-Lite SDK 提供的 LVGL 支持使用 SPI 控制器替换 LCD 接口进行刷屏,通过 menuconfig 配置可以让数据流从 DE 切换到 SPI。
- 在 menuconfig 配置中,按照如下步骤使能 panel 驱动:
-
在
select Display interface中选择MIPI-DBI interface。 -
如果内存资源充足,可选择
argb8888格式的 Framebuffer,以便获得更好的显示效果。 -
在
ArtInChip Panel Drivers中选择ArtInChip SPI General panel。 -
配置 SPI LCD 屏幕的宽高。
由于 Framebuffer 大小通过 panel 驱动的分辨率指定,必须正确配置分辨率的宽高。
详细配置示例如下:
Board options ---> Display Parameter ---> select Display interface (Display MIPI-DBI interface) ---> select framebuffer format (argb8888) ---> Display Panels ---> ArtInChip Panel Drivers (ArtInChip SPI General panel) ---> (160) SPI LCD Width (160) SPI LCD Height -
- 在
ArtInChip LVGL demo中使能 SPI Replaces LCD 并选择对应的 SPI 驱动。配置示例如下:
Application options ---> [*] ArtInChip LVGL demo ---> [*] LVGL replaces MIPI-DBI-SPI Driver with SPI Controller extend spi controller driver (GC9D01N) ---> - 使能 SPI 控制器并配置 SPI
工作模式。
配置示例如下:
Board options ---> [*] Using SPI2 SPI3 Parameter ---> Set SPI3 bus width (Standard) ---> [*] Work in SPI BUS Mode - 参考
packages\artinchip\lvgl-ui\aic_widgets\aic_spi\lv_gc9d01n.c
中的模版,适配 SPI 屏幕。
详细步骤流程如下:
-
新建一个 SPI LCD 驱动文件。
-
根据资料修改初始化命令和 reset 引脚。
-
修改同级目录下的 SConscript 文件,编译 LCD 驱动。
-
修改 application\Kconfig 文件,让驱动文件在 menuconfig 中可选。
-
- 配置 SPI 初始化命令。初始化命令由屏厂提供,根据屏厂资料进行修改。
以 GC0D01N 模版文件中的初始化命令为例,其使用
lv_spi_write_seq()API 发送命令:packages\artinchip\lvgl-ui\aic_widgets\aic_spi\lv_gc9d01n.c lv_spi_write_seq(dev, 0x81, 0xFF); lv_spi_write_seq(dev, 0x82, 0xFF); - 在
packages\artinchip\lvgl-ui\aic_widgets\aic_spi\lv_aic_spi.c
文件中配置 SPI
控制器初始化:根据项目实际情况,修改以下参数:
#define SPI_BUF_NAME "spi2" #define SPI_MODE (RT_SPI_MODE_0 | RT_SPI_MSB) #define SPI_MAX_HZ 70000000 #define RS_PIN "PB.11" #define BL_PIN "PC.0" #define BL_LOW_ACTIVE 1表 1. SPI 控制器初始化参数配置示例 参数名 配置说明 SPI_BUF_NAME SPI 控制器 id,默认 spi2 SPI_MODE SPI 模式,默认 mode0 MSB SPI_MAX_HZ SPI 工作频率,默认 70 MHz RS_PIN 用于区分 data 和 command,又称 D/C pin,默认 PB.11 BL_PIN 背光引脚,默认 PC.0 低电平有效 BL_LOW_ACTIVE - 修改当前工程的 pinmux.c 文件,添加如下 pinmux
配置。
pinmux.c 路径位于 target\<IC>\<project>\pinmux.c。
-
将 SPI 的 CS/ SCL/ SDA 引脚配置为 SPI func。
-
将 SPI 的 RS 引脚,LCD 的 reset 和 backlight 引脚均配置成 func 1,即通用 GPIO。
-
SPI 双屏异显
Luban-Lite SDK 提供 LVGL 双 SPI 屏异显 demo,即一个主屏和一个副屏的双屏显示。其中,主屏内容由 DE 合成,使用 LCD 接口的 SPI 模式刷新。副屏由一个标准的 SPI 控制器刷新。两个屏幕的最高性可同时达到 60 fps 刷新。
-
在 Luban-Lite 根目录下执行
scons --menuconfig,进入工程选项配置界面。 -
在如下选项中,使能
LVGL SPI extend demo。Application options ---> [*] ArtInChip LVGL demo ---> select LVGL demo (LVGL spi extend demo) ---> - 在
LVGL SPI extend demo中,选择 SPI 副屏驱动。Luban-Lite SDK 集成的 SPI 屏幕型号包括
ST77916、ST7789和ST77912。Application options ---> [*] ArtInChip LVGL demo ---> select LVGL demo (LVGL spi extend demo) ---> extend spi controller driver (ST77916) ---> -
在 Luban-Lite 根目录下,执行
scons --menuconfig,进入工程选项配置界面。 -
在如下选项中,使能 SPI 控制器并执行下列操作:
-
将
bus width设置为Standard。 -
使能
Work in SPI BUS Mode
以使能 SPI2 控制器为例:Board options ---> [*] Using SPI2 SPI2 Parameter ---> Set SPI2 bus width (Standard) ---> [*] Work in SPI BUS Mode -
- 修改当前工程的 pinmux.c 文件,添加如下 pinmux
配置。pinmux.c 路径位于 target\<IC>\<project>\pinmux.c。
-
将主屏配置为 LCD 功能(func 2),并将 reset 引脚配置为通用 GPIO(func 1)。
-
将副屏配置为 SPI 功能(func 功能由引脚复用决定),并将 RS 和 reset 引脚配置成通用 GPIO(func 1)。
以下是一个双 SPI 屏 pinmux 配置示例:// 主屏配置,LCD 功能 {2, PIN_PULL_DIS, 3, "PD.21"}, {2, PIN_PULL_DIS, 3, "PD.24"}, {2, PIN_PULL_DIS, 3, "PD.26"}, {2, PIN_PULL_DIS, 3, "PD.27"}, {1, PIN_PULL_DIS, 3, "PD.23"}, // reset // 副屏配置,SPI 功能 {3, PIN_PULL_DIS, 3, "PB.6"}, {3, PIN_PULL_DIS, 3, "PB.8"}, {3, PIN_PULL_DIS, 3, "PB.9"}, {1, PIN_PULL_DIS, 3, "PB.10"}, // te {1, PIN_PULL_DIS, 3, "PB.11"}, // reset {1, PIN_PULL_DIS, 3, "PC.0"}, // backlight -
-
在 Luban-Lite 根目录下,执行
scons --menuconfig,进入工程选项配置界面。 - 在
ArtInChip LVGL demo中选择 demo 色深:-
配置
LVGL color depth,示例如下:Application options ---> [*] ArtInChip LVGL demo ---> (32) LVGL color depth(32/16) -
配置
Framebuffer format,示例如下:Board options ---> [*] Using Display Engine (DE) Display Parameter ---> select framebuffer format (argb8888) --->
提示:推荐使用 32 位色深,虽然会增加内存开销,但能获得更好的显示效果。在 32 位色深的场景下,主屏通过 DE 进行 dither,副屏通过 GE 进行 dither,可以极大改善 SPI RGB565 屏幕的色阶现象,从而显著提升显示效果。
-
- 修改主/ 副屏的 UI 控件。
- 在创建 UI 控件前,调用
lv_disp_set_default(disp),来控制和确定 UI 绘制所在的屏幕。UI 控件绘制的代码路径为 packages/artinchip/lvgl-ui/aic_demo/spi_extend_demo/spi_extend_demo.c。
主副屏的 UI 控件绘制入口分别为:
- 主屏:
create_de_disp_obj() - 副屏:
create_spi_disp_obj()
- 主屏:
- 为了适配 SPI 副屏,在 LVGL demo 中新建一个
lv_display_t显示器。创建的显示器默认加进显示器列表的头部。
lv_spi_display_init();
- 在创建 UI 控件前,调用
- 参考屏适配指南章节,适配 SPI 主屏驱动。
主屏由 DE 刷新,经过显示子系统(DSS),需要适配一份 Panel DBI 驱动。
- 按如下步骤,适配 SPI 副屏驱动。
副屏由 SPI 控制器刷新,驱动文件路径为 packages/artinchip/lvgl-ui/aic_widgets/aic_spi/,其中默认集成
lv_st7789.c和lv_st7789.c驱动文件。如需实现副屏驱动,仅需在驱动文件中实现一个lv_spi_panel_enable()接口,并在接口中实现初始化操作即可。以lv_st77916.c为例:#include <rtdevice.h> #include "lv_aic_spi.h" #define ST77916_RST_PIN "PE.11" void lv_spi_panel_enable(struct lv_spi_dev *dev) { u32 rst_pin; rst_pin = rt_pin_get(ST77916_RST_PIN); // 获取 reset 引脚 rt_pin_mode(rst_pin, PIN_MODE_OUTPUT); rt_pin_write(rst_pin, 1); // 控制 reset 引脚 rt_thread_mdelay(120); lv_spi_write_seq(dev, 0xf0, 0x28); // 发送初始化命令 lv_spi_write_seq(dev, 0xf2, 0x28); lv_spi_write_seq(dev, 0x73, 0xF0); ... }新建一个副屏驱动的详细步骤如下:
-
根据屏驱 IC 型号,新建一个驱动文件 lv_xxx.c。
-
在驱动文件中实现一个
lv_spi_panel_enable()接口,并将 LCD 的初始化操作放置在接口中。 -
在驱动目录下的
SConscript文件中,添加驱动文件编译支持:if GetDepend('LV_SPI_XXX'): src += Glob('lv_xxx.c') -
在
application/Kconfig文件中,添加编译选项:choice prompt "extend spi controller driver" default LV_SPI_ST77916 ... config LV_SPI_XXX bool "XXX"endchoice -
修改下列副屏 SPI 的配置参数。
// packages/artinchip/lvgl-ui/aic_widgets/aic_spi/lv_aic_spi.c #define SPI_BUF_NAME "spi2" // SPI 控制器 #define SPI_MODE (RT_SPI_MODE_0 | RT_SPI_MSB) // SPI 工作模式 #define SPI_MAX_HZ 70000000 // SPI 工作频率 #define RS_PIN "PB.11" // SPI RS 引脚 #define BL_PIN "PC.0" // 副屏背光引脚表 2. SPI 控制器初始化参数配置示例 参数名 配置说明 SPI_BUF_NAME SPI 控制器 id,默认 spi2 SPI_MODE SPI 模式,默认 mode0 MSB SPI_MAX_HZ SPI 工作频率,默认 70 MHz RS_PIN 用于区分 data 和 command,又称 D/C pin,默认 PB.11 BL_PIN 背光引脚,默认 PC.0 低电平有效 BL_LOW_ACTIVE
-
SPI 显示常见问题
屏幕黑屏
// packages/artinchip/lvgl-ui/aic_widgets/aic_spi/lv_aic_spi.c
#define BL_LOW_ACTIVE 1 // 默认低电平有效
#if BL_LOW_ACTIVE
#define BL_ACTIVE_LEVEL PIN_LOW
#else
#define BL_ACTIVE_LEVEL PIN_HIGH
#endif屏幕初始化失败
-
检查 pinmux 设置,副屏 pin 需要配置成 SPI 功能,RS (D/C) 引脚需要配置成通用 GPIO,func 1。
-
检查 SPI 控制器 RS 引脚设置是否正确。
-
检查 LCD reset 引脚是否在 pinmux 配置为 func 1,LCD SPI 驱动中是否指定正确。
