瑞昱rtl8762芯片通过SPI控制st7789,从而实现LCD显示
本人还在学习、摸索这款芯片,如有错误之处,欢迎指出。
1、引脚分布
引脚名称 | 引脚编号 |
---|---|
SCK | P2_6 |
MOSI | P0_4 |
RESET | P0_0 |
D\C | P0_1 |
EN(未使用) | P4_1 |
2、代码添加
1)引脚宏定义
#define LCD_SPI SPI0
#define LCD_SCK_PIN P2_6 //< lcd 时钟线
#define LCD_MOSI_PIN P0_4 //< lcd 数据线(单向传输)
#define LCD_DC_PIN P0_1 //< lcd 数据\命令控制线
#define LCD_RESET_PIN P0_0 //< lcd 复位
#define LCD_EN_PIN P4_1 //< lcd 使能
2)初始化GPIO
初始化GPIO分为两组,1组为spi的引脚初始化,1组为普通IO的引脚初始化。
/**
* @brief :引脚初始化
* @param :NULL
* @retval :NULL
*/
void st7789_gpio_init(void)
{
//spi
Pad_Config(LCD_SCK_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE,
PAD_OUT_HIGH);
Pad_Config(LCD_MOSI_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE,
PAD_OUT_HIGH);
Pinmux_Deinit(LCD_SCK_PIN);
Pinmux_Deinit(LCD_MOSI_PIN);
Pinmux_Config(LCD_SCK_PIN, SPI0_CLK_MASTER);
Pinmux_Config(LCD_MOSI_PIN, SPI0_MO_MASTER);
//gpio
Pad_Config(LCD_DC_PIN, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
PAD_OUT_LOW);
Pad_Config(LCD_RESET_PIN, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
PAD_OUT_LOW);
Pad_Config(LCD_EN_PIN, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
PAD_OUT_LOW);
Pinmux_Config(LCD_DC_PIN, DWGPIO);
Pinmux_Config(LCD_RESET_PIN, DWGPIO);
Pinmux_Config(LCD_EN_PIN, DWGPIO);
}
3)配置SPI结构体
此处无需配置GPIO的结构体。
void driver_lcd_init(void)
{
//spi
RCC_PeriphClockCmd(APBPeriph_SPI0, APBPeriph_SPI0_CLOCK, ENABLE);
SPI_InitTypeDef SPI_InitStruct;
SPI_StructInit(&SPI_InitStruct);
SPI_InitStruct.SPI_Direction = SPI_Direction_TxOnly; //< 仅MOSI,从机不发送数据
SPI_InitStruct.SPI_Mode = SPI_Mode_Master; //< 主机模式
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; //< 数据长度为8位
SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; //< 时钟空闲时的电平
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; //< 捕获第2个时钟沿(既下升沿)
SPI_InitStruct.SPI_BaudRatePrescaler = 8;
SPI_Init(SPI0, &SPI_InitStruct);
SPI_Cmd(SPI0, ENABLE);
}
4)初始化st7789
根据不同的驱动芯片进行初始化,该代码段以st7789为例。
值得注意的是:使用以下函数无法正常控制IO口,所以换成配置的方式来控制。
GPIO_WriteBit(GPIO_PIN_OUTPUT, (BitAction)(1));
这里操作IO口的方式为配置成IO的方式,即以下代码:
#define GPIO_WRITE_BIT(PINx,level) Pad_Config(PINx, PAD_SW_MODE, PAD_IS_PWRON, \
PAD_PULL_NONE, PAD_OUT_ENABLE, level);
以下为st7789初始化代码:
driver_lcd.c
#include <