Edit online

SPI 屏幕显示

ArtInChip 平台支持使用下列方式点亮 SPI 屏幕:
  • 使用 LCD 接口,通过 DE 自动刷新屏幕。

    推荐的首选方式。此方式使用更简单,刷新帧率有保障,但 LCD 接口无法满足所有使用场景。比如,同时驱动多个 SPI 屏幕时,部分型号 SPI 屏幕不支持 LCD 接口。

  • 使用标准 SPI 控制器,手动刷新屏幕。

本章节介绍如何使用 SPI 控制器替换 LCD 接口进行刷屏以及 SPI 双屏异显的配置方式。

SPI 控制器刷屏

Luban-Lite SDK 提供的 LVGL 支持使用 SPI 控制器替换 LCD 接口进行刷屏,通过 menuconfig 配置可以让数据流从 DE 切换到 SPI。

  1. 在 menuconfig 配置中,按照如下步骤使能 panel 驱动:
    1. select Display interface 中选择 MIPI-DBI interface

    2. 如果内存资源充足,可选择 argb8888 格式的 Framebuffer,以便获得更好的显示效果。

    3. ArtInChip Panel Drivers 中选择 ArtInChip SPI General panel

    4. 配置 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
  2. 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)  --->
  3. 使能 SPI 控制器并配置 SPI 工作模式。

    配置示例如下:

    Board options  --->
        [*] Using SPI2
            SPI3 Parameter  --->
                Set SPI3 bus width (Standard)  --->
                 [*] Work in SPI BUS Mode
  4. 参考 packages\artinchip\lvgl-ui\aic_widgets\aic_spi\lv_gc9d01n.c 中的模版,适配 SPI 屏幕。

    详细步骤流程如下:

    1. 新建一个 SPI LCD 驱动文件。

    2. 根据资料修改初始化命令和 reset 引脚。

    3. 修改同级目录下的 SConscript 文件,编译 LCD 驱动。

    4. 修改 application\Kconfig 文件,让驱动文件在 menuconfig 中可选。

  5. 配置 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);
  6. 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_NAMESPI 控制器 id,默认 spi2
    SPI_MODESPI 模式,默认 mode0 MSB
    SPI_MAX_HZSPI 工作频率,默认 70 MHz
    RS_PIN用于区分 data 和 command,又称 D/C pin,默认 PB.11
    BL_PIN背光引脚,默认 PC.0 低电平有效 BL_LOW_ACTIVE
  7. 修改当前工程的 pinmux.c 文件,添加如下 pinmux 配置。

    pinmux.c 路径位于 target\<IC>\<project>\pinmux.c

    1. 将 SPI 的 CS/ SCL/ SDA 引脚配置为 SPI func。

    2. 将 SPI 的 RS 引脚,LCD 的 reset 和 backlight 引脚均配置成 func 1,即通用 GPIO。

SPI 双屏异显

Luban-Lite SDK 提供 LVGL 双 SPI 屏异显 demo,即一个主屏和一个副屏的双屏显示。其中,主屏内容由 DE 合成,使用 LCD 接口的 SPI 模式刷新。副屏由一个标准的 SPI 控制器刷新。两个屏幕的最高性可同时达到 60 fps 刷新。

  1. 在 Luban-Lite 根目录下执行 scons --menuconfig,进入工程选项配置界面。

  2. 在如下选项中,使能 LVGL SPI extend demo

    Application options  --->
        [*] ArtInChip LVGL demo  --->
            select LVGL demo (LVGL spi extend demo)  --->
  3. LVGL SPI extend demo 中,选择 SPI 副屏驱动。

    Luban-Lite SDK 集成的 SPI 屏幕型号包括 ST77916ST7789ST77912

    Application options  --->
        [*] ArtInChip LVGL demo  --->
            select LVGL demo (LVGL spi extend demo)  --->
            extend spi controller driver (ST77916)  --->
  4. 在 Luban-Lite 根目录下,执行 scons --menuconfig,进入工程选项配置界面。

  5. 在如下选项中,使能 SPI 控制器并执行下列操作:
    1. bus width 设置为 Standard

    2. 使能 Work in SPI BUS Mode

    以使能 SPI2 控制器为例:
     Board options  --->
    [*] Using SPI2
            SPI2 Parameter  --->
    Set SPI2 bus width (Standard)  --->
    [*] Work in SPI BUS Mode
  6. 修改当前工程的 pinmux.c 文件,添加如下 pinmux 配置。
    pinmux.c 路径位于 target\<IC>\<project>\pinmux.c
    1. 将主屏配置为 LCD 功能(func 2),并将 reset 引脚配置为通用 GPIO(func 1)。

    2. 将副屏配置为 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
  7. 在 Luban-Lite 根目录下,执行 scons --menuconfig,进入工程选项配置界面。

  8. ArtInChip LVGL demo 中选择 demo 色深:
    1. 配置 LVGL color depth,示例如下:
      Application options  --->
          [*] ArtInChip LVGL demo  --->
              (32)  LVGL color depth(32/16)
    2. 配置 Framebuffer format,示例如下:
      Board options  --->
          [*] Using Display Engine (DE)
          Display Parameter  --->
              select framebuffer format (argb8888)  --->
    提示:

    推荐使用 32 位色深,虽然会增加内存开销,但能获得更好的显示效果。在 32 位色深的场景下,主屏通过 DE 进行 dither,副屏通过 GE 进行 dither,可以极大改善 SPI RGB565 屏幕的色阶现象,从而显著提升显示效果。

  9. 修改主/ 副屏的 UI 控件。
    1. 在创建 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()
    2. 为了适配 SPI 副屏,在 LVGL demo 中新建一个 lv_display_t 显示器。

      创建的显示器默认加进显示器列表的头部。

      lv_spi_display_init();
  10. 参考屏适配指南章节,适配 SPI 主屏驱动。

    主屏由 DE 刷新,经过显示子系统(DSS),需要适配一份 Panel DBI 驱动。

  11. 按如下步骤,适配 SPI 副屏驱动。

    副屏由 SPI 控制器刷新,驱动文件路径为 packages/artinchip/lvgl-ui/aic_widgets/aic_spi/,其中默认集成 lv_st7789.clv_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);
    
        ...
    }

    新建一个副屏驱动的详细步骤如下:

    1. 根据屏驱 IC 型号,新建一个驱动文件 lv_xxx.c

    2. 在驱动文件中实现一个 lv_spi_panel_enable() 接口,并将 LCD 的初始化操作放置在接口中。

    3. 在驱动目录下的 SConscript 文件中,添加驱动文件编译支持:
      if GetDepend('LV_SPI_XXX'):
          src += Glob('lv_xxx.c')
    4. application/Kconfig 文件中,添加编译选项:

      choice prompt "extend spi controller driver"        default LV_SPI_ST77916
          ...
          config LV_SPI_XXX
              bool "XXX"endchoice
    5. 修改下列副屏 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_NAMESPI 控制器 id,默认 spi2
      SPI_MODESPI 模式,默认 mode0 MSB
      SPI_MAX_HZSPI 工作频率,默认 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

屏幕初始化失败

  1. 检查 pinmux 设置,副屏 pin 需要配置成 SPI 功能,RS (D/C) 引脚需要配置成通用 GPIO,func 1。

  2. 检查 SPI 控制器 RS 引脚设置是否正确。

  3. 检查 LCD reset 引脚是否在 pinmux 配置为 func 1,LCD SPI 驱动中是否指定正确。