SPI 驱动 ST7789V 1.3 寸 LCD
提示
备注
提示
备注
SPI 接口协议与 DBI 的 L4I1 和 L4I2 四线模式时序一样,完全兼容,区别是 DBI 下 DC 脚的控制是硬件自动化控制,而 SPI 模式下需要 CPU 软件控制 DC 脚,由于是非硬件操作,所以刷图性能平均较低。一般 SPI 屏幕配置 DBI L4I1 模式即可。由硬件控制 DC 脚即可。
:::
此次适配的SPI屏为 ZJY130S0800TG01,使用的是 SPI 进行驱动。

引脚配置如下:
| V861 | TFT 模块 |
|---|---|
| PD1 | CS |
| PD2 | SCL |
| PD3 | SDA |
| 3V3 | BLK |
| PD4 | RES |
| PD5 | DC |
| 3V3 | VCC |
| GND | GND |
驱动配置
设置 SPI 驱动
勾选以下驱动:
Allwinner BSP --->
Device Drivers --->
SPI NG Drivers --->
<*> SPI NG Driver Support for Allwinner SoCs
[*] Support driver bit-aligned feature
[*] Support driver dbi feature
[*] Support driver camera feature
[*] Support atomic xfer function

编写 SPI LCD 显示屏驱动
获取屏幕初始化序列
首先询问屏厂提供驱动源码

找到 LCD 的初始化序列代码

找到屏幕初始化的源码

整理后的初始化代码如下:
LCD_WR_REG(0x11); // Sleep out
delay_ms(120); // Delay 120ms
//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x20); // 2b
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x18); // VDV, 0x20:0v
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x13); // 0x13:60Hz
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xD6);
LCD_WR_DATA8(0xA1); // sleep in后,gate输出为GND
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x30);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x21);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x32);
LCD_WR_DATA8(0x3B);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x31);
LCD_WR_REG(0xE4);
LCD_WR_DATA8(0x1D); // 使用240根gate (N+1)*8
LCD_WR_DATA8(0x00); // 设定gate起点位置
LCD_WR_DATA8(0x00); // 当gate没有用完时,bit4(TMG)设为0
LCD_WR_REG(0x21);
LCD_WR_REG(0x29);