今天我们在昨天的基础上测试下硬件SPI驱动LCD~
由于昨天的连下,我们考虑到硬件SPI,连线就连得LSPI对于的引脚~
今天直接用就行了~
/****************************************
* SPI-TFT LCD For W806 BOARD(LSPI)
* GND -------------- GND
* VCC -------------- 3.3V
* SCL -------------- PB1
* SDA -------------- PA7
* RES -------------- PB27
* DC -------------- PB3
* BLC -------------- PB2
* ***************************************/
我们开始配置SPI相关:
- SPI_HandleTypeDef hspi;
- static void LSPI_Init(void)
- {
- hspi.Instance = SPI;
- hspi.Init.Mode = SPI_MODE_MASTER; //设置为SPI主机模式
- hspi.Init.CLKPolarity = SPI_POLARITY_HIGH; //设置为CLK空闲时高电平
- hspi.Init.CLKPhase = SPI_PHASE_2EDGE; //设置为第二个时钟沿捕获
- hspi.Init.NSS = SPI_NSS_SOFT; //设置为软件CS 实际上CS压根就没用到
- //hspi.Init.NSS =SPI_NSS_HARD;
- hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; //设置SPI分频速率,最快2分频 20M,详见wm_spi.h
- hspi.Init.FirstByte = SPI_LITTLEENDIAN;
-
- if (HAL_SPI_Init(&hspi) != HAL_OK)
- {
- Error_Handler();
- }
- }
- static void Lspi_WriteOneData(u8 data)
- {
- HAL_SPI_Transmit(&hspi, &data, 1, 100);
- }
- static void Lspi_WriteMoreData(u8* data,u32 len)
- {
- HAL_SPI_Transmit(&hspi, data, len, 1000);
- }
然后我们把SPI的引脚复用一下并把SPI初始化函数放到之前的LCD初始化里面:
- void LCD_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
-
- __HAL_RCC_GPIO_CLK_ENABLE();
- GPIO_InitStruct.Pin =/* GPIO_PIN_1 |*/ GPIO_PIN_2 | GPIO_PIN_3|GPIO_PIN_27;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
- //GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3|GPIO_PIN_27, GPIO_PIN_SET);
- /*
- GPIO_InitStruct.Pin = GPIO_PIN_7;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);*/
- //LSPI初始化
- __HAL_RCC_SPI_CLK_ENABLE();
- __HAL_AFIO_REMAP_SPI_CS(GPIOB, GPIO_PIN_4);
- __HAL_AFIO_REMAP_SPI_CLK(GPIOB, GPIO_PIN_1);
- __HAL_AFIO_REMAP_SPI_MOSI(GPIOA, GPIO_PIN_7);
- LSPI_Init();
- }
把LCD最基本的读写,由原来的模拟,改成SPI读写:
- /******************************************************************************
- 函数说明:LCD串行数据写入函数
- 入口数据:dat 要写入的串行数据
- 返回值: 无
- ******************************************************************************/
- void LCD_Writ_Bus(u8 dat)
- {
- Lspi_WriteOneData(dat);
- }
- /******************************************************************************
- 函数说明:LCD串行多个数据写入函数
- 入口数据:dat 要写入的串行数据
- 返回值: 无
- ******************************************************************************/
- void LCD_Writ_BusMore(u8* data,u32 len)
- {
- Lspi_WriteMoreData(data,len);
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA8(u8 dat)
- {
- LCD_CS_LOW();
- LCD_Writ_Bus(dat);
- LCD_CS_HIGH() ;
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA(u16 dat)
- {
- u8 temp[2];
-
- temp[0] = dat >> 8;
- temp[1] = dat;
-
- LCD_CS_LOW();
- LCD_Writ_BusMore(temp, 2);
- LCD_CS_HIGH();
- }
- /******************************************************************************
- 函数说明:LCD写入命令
- 入口数据:dat 写入的命令
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_REG(u8 dat)
- {
- LCD_DC_Clr();//写命令
- LCD_CS_LOW();
- LCD_Writ_Bus(dat);
- LCD_CS_HIGH();
- LCD_DC_Set();//写数据
- }
其他的不做变化,我们编译下载后,查看,速度确实比 模拟SPI快了许多~