跳转至

SPI LCD 显示屏使用指南


1. 概述

本指南描述如何在 iford 平台上配置 WL-28X0002 LCD 显示屏驱动,实现屏幕点亮。

1.1 显示屏参数

  • 驱动 IC: ST7789V
  • 屏幕型号: WL-28X0002-B-A20
  • 分辨率: 240 x 320 像素
  • 颜色格式: RGB565
  • 接口: 4线 SPI (56MHz)

1.2 屏幕接口定义

WL-28X0002-B-A20 屏幕通过 10 针 FPC 接口与 Comake D2 开发板连接,接口引脚定义如下:

引脚序号 信号名称 功能描述 连接到开发板
1 GND 地线,提供参考电位 GND
2 RS / DCX 寄存器选择(数据/命令选择) PAD_MSPI_CK
3 /CS 片选信号(低电平有效) PAD_SPI0_CZ
4 SCL / SCLK 串行时钟输入 PAD_SPI0_CK
5 SDA / MOSI 串行数据输入 PAD_SPI0_DI
6 RESET 复位信号(低电平有效) PAD_MSPI_CK
7 VCC 逻辑电源(1.8V 或 3.3V) 3.3V_STD
8 GND 地线 GND
9 A LED 背光阳极(正极) 3.3V_STD
10 K LED 背光阴极(负极) 3.3V_STD

信号说明

  • RS/DCX: 高电平时传输显示数据,低电平时传输命令
  • /CS: 低电平时使能屏幕通信,高电平时屏幕忽略输入信号
  • SCL/SCLK: SPI 时钟信号,用于同步数据传输
  • SDA/MOSI: SPI 主机输出数据线
  • RESET: 低电平时复位屏幕寄存器,恢复默认状态
  • VCC: 为屏幕逻辑电路供电(电压根据屏幕型号可能为 1.8V 或 3.3V)
  • A/K: LED 背光电源引脚,用于控制屏幕背光

2. 驱动配置

2.1 内核配置

FBTFT 驱动位于 kernel/drivers/staging/fbtft/ 目录下。要启用 ST7789V LCD 支持,需要在内核 defconfig 中添加以下配置(例如 arch/arm/configs/iford_ssc029d_s01a_d2_full_defconfig):

# FBTFT 框架(编译进内核)
CONFIG_FB_TFT=y

# ST7789V 驱动(编译进内核)
CONFIG_FB_TFT_ST7789V=y

2.2 设备树配置

2.2.1 ST7789V 设备节点

arch/arm/boot/dts/iford.dtsi 中添加:

#if IS_ENABLED(CONFIG_SSTAR_QSPI)
        qspi: spi@0x1f201A00 {
            compatible = "sstar,qspi";
            reg = <0x1F201A00 0x200>, <0x1F201C00 0x200>;
            clocks = <&CLK_fsp_qspi>, <&CLK_spi_nonpm>, <&CLK_spi_synth_pll>;
            qspi-group = <3>;
            #address-cells = <1>;
            #size-cells = <0>;
            dma-write-en;
            #dma-read-en;
            width_ctrl = <0>;
            cs-mode = <2>;
            cs-num = <1>;
            // cs-ext = <PAD_FUART_TX>; 
            status = "ok";
            spi-cpol;

            wl28x0002@0 {
                compatible = "sitronix,st7789v";
                reg = <0>;
                status = "ok";
                spi-max-frequency = <54000000>;
                rotate = <0>;
                fps = <20>;
                buswidth = <8>;
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <1>;
                dc-gpios = <&gpio PAD_MSPI_CK 0>;
                reset-gpios = <&gpio PAD_MSPI_DI 1>;
                txbuflen = <4096>;
                debug = <1>;
            };

        };
#endif

2.3 引脚配置

使用QSPI时,引脚默认开启,不需要配置padmux。


3. 系统架构

SPI LCD 系统架构图

图:SPI LCD 系统架构,显示从用户应用到LCD硬件的数据流和连接关系


4. 硬件连接示例

以下示例展示了 WL-28X0002-B-A20 屏幕与 Comake D2 开发板的实际连接关系:

SPI LCD 硬件连接示例

图:WL-28X0002-B-A20 屏幕与 SSC035A-S01A-S 开发板的硬件连接示例

以下为 WL-28X0002-B-A20 屏幕 10 针 SPI 接口的引脚定义图:

SPI LCD 接口引脚定义

图:WL-28X0002-B-A20 屏幕 10 针 SPI 接口引脚定义图

连接要点

  1. 屏幕通过 10 针 FPC 接口连接到开发板
  2. SPI 信号(SCL、SDA、/CS)连接如图示例
  3. 控制信号(RS、RESET)通过 GPIO 引脚控制
  4. 电源和背光信号通过相应的电源网络供电

5. 初始化序列

驱动使用以下序列初始化 ST7789V(来自 fb_st7789v.c:init_display()):

  1. 硬件复位
  2. 初始化 tearing effect line(如果配置了的话)
  3. 退出睡眠模式 (0x11) - 120ms 延时
  4. 设置像素格式为 RGB565 (0x3A, 0x05)
  5. 设置 porch control (0xB2):

    • HSD20_IPS 屏幕:0x05, 0x05, 0x00, 0x33, 0x33
    • 其他屏幕:0x08, 0x08, 0x00, 0x22, 0x22
  6. 门控 (0xB7):

    • HSD20_IPS 屏幕:0x75 (VGH=13.26V, VGL=-10.43V)
    • 其他屏幕:0x35
  7. 使能 VDV 和 VRH 命令 (0xC2):0x01, 0xFF

  8. 设置 VRH (0xC3):

    • HSD20_IPS 屏幕:0x13
    • 其他屏幕:0x0B
  9. 设置 VDV (0xC4):0x20 (VDV=0V)

  10. 设置 VCOM (0xBB):

    • HSD20_IPS 屏幕:0x22 (VCOM=0.9V)
    • 其他屏幕:0x20
  11. 设置 VCOM offset (0xC5):0x20 (VCOM offset=0V)

  12. 电源控制 (0xD0):0xA4, 0xA1

    • AVDD = 6.8V
    • AVCL = -4.8V
    • VDS = 2.3V
  13. TE line 输出(如果配置了):0x35, 0x00(关闭)

  14. 打开显示 (0x29)
  15. 使能显示反转 (0x21) 对于 HSD20_IPS 屏幕

5.1 关键命令

命令 十六进制 描述
0x11 SLPOUT 退出睡眠模式
0x29 DISPON 打开显示
0x21 INVON 使能显示反转
0x2C RAMWR 内存写入
0x35 TEEON Tearing effect line 开
0x3A COLMOD 像素格式设置(16位 RGB565)
0x36 MADCTL 内存访问控制(在 set_var() 中设置)
0xB2 PORCTRL Porch 设置
0xB7 GCTRL 门控
0xBB VCOMS VCOM 设置
0xC2 VDVVRHEN 使能 VDV 和 VRH 命令
0xC3 VRHS VRH 设置
0xC4 VDVS VDV 设置
0xC5 VCMOFSET VCOM offset 设置
0xD0 PWCTRL1 电源控制 1
0xE0 PVGAMCTRL 正电压 gamma 控制
0xE1 NVGAMCTRL 负电压 gamma 控制

6. 编译和加载

6.1 编译内核

# 进入内核目录
cd kernel

# 选择 defconfig
make iford_ssc029d_s01a_d2_full_defconfig

# 编译内核
make -j8

6.2 加载驱动模块

编进内核后,启动自动加载

6.3 验证驱动加载

# 检查帧缓冲设备
ls -l /dev/fb*

# 查看驱动信息
cat /sys/class/graphics/fb0/name
cat /sys/class/graphics/fb0/modes

7. 测试屏幕

sample code代码中包含 ST7789V LCD 的帧缓冲测试程序:

源代码sdk/verify/sample_code/source/iford/disp/spi_demo/spi_demo.c

编译

cd sdk/verify/sample_code/
make clean && make source/iford/disp/spi_demo
生成目标在./out路径下

在目标设备上运行

# 运行测试程序
./prog_disp_spi_demo

测试程序将执行以下操作:

在SPI屏幕上循环显示红绿蓝彩条图案

程序正常运行后,SPI屏幕会循环显示彩条图案:

  • 屏幕分为三等分,分别显示不同颜色

  • buffer 0:左侧红色、中间绿色、右侧蓝色

  • buffer 1:左侧蓝色、中间红色、右侧绿色

  • 每3秒在两种图案间切换


8. 调试信息

8.1 检查内核日志

# 查看驱动初始化
dmesg | grep -i st7789v

# 查看 FBTFT 日志
dmesg | grep -i fbtft

8.2 常见问题

屏幕不显示:

  1. 检查设备树配置是否正确
  2. 验证 DC 和 RESET 引脚配置
  3. 确认 SPI 时钟频率(尝试 16MHz)
  4. 检查内核错误日志

颜色异常:

  1. 确认 BGR 模式配置
  2. 检查像素格式设置