第四章 SPI驱动TFT 本章节主要进行SPI的体验,包括FSP的配置和TFT驱动的配合设计。 一、了解SPI SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是一种高速全双工的 通信总线。 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向数据传输时)。这四根线分别是MISO、MOSI、SCLK、CS,具体的描述见下表: MISO– Master Input Slave Output,主设备数据输入,从设备数据输出; MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入; SCLK – Serial Clock,时钟信号,由主设备产生; CS – Chip Select,从设备使能信号,由主设备控制。 注意:CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(一般默认为低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能,通过多个CS来控制。 二、TFT的硬件需求 本次体验的TFT液晶屏为1.54吋,IPS高清显示,分辨率240*240,驱动芯片为ST7789,支持MCU和SPI两种通信方式,这一次是需要体验SPI,故在设计时M0~M2做出的相对应的选择,同时根据厂家的介绍,SPI通信时只能作为从机接收数据,所以只用到了CS、MOSI和SCK。液晶屏接口如下图: 除了SPI接口,还需要背光控制、液晶屏复位、命令/数据接口,这三个控制都是通过GPIO输出控制的。 三、SPI输出体验 1、硬件设计 TFT | TFT | WR | SCK | CS | RST | MOSI | | P114 | P105 | SCK0(P412) | P106 | P107 | TXD0(P411) |
2、软件设计
在之前工程基础上,打开FSP配置界面。在FSP 配置界面里面点开“Stacks→Connec tivity→SPI(r_spi)”,如下图: 在进行引脚配置时出现了问题,如下图: 引脚无法配置导致SPI的配置是失败的,一直提示红色:
引脚都不能配置,难道这个芯片不能用SPI吗?显然是不是的,开发板有外引出两个SCI接口,其中包含SPI,IIC,串口等等,接下来我们就建立一个SCI-SPI,如下图:
SPI的配置如下: 接下来是引脚配置,在Pins-Peripherals-Connectivity:SCI-SCI0中配置引脚,注意对应关系,满足第三章第一节的对应.生成代码就可以. 3、工程函数编写 那需要如何使用生成的函数呢? 首先需要在需要在 "hal_entry.c"中重新定义sci0_spi0_callback(spi_callback_args_t * p_args),注意这个回调函数是和配置中的回调函数名是一致的;
- oid sci0_spi0_callback (spi_callback_args_t * p_args)
- {
- if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
- {
- g_transfer_complete = true;
- }
- }
- 接着是打开SPI;
- //******************************************************************************
- //* 函数名称 : Tmr0_GPT_init
- //* 函数描述 : 开启定时器
- //* 输入参数 :
- //* 参数描述 : 对应 ms
- //* 输出参数 : 无
- //* 返回值 : 无
- //******************************************************************************
- void SPI0_init(void)
- {
- fsp_err_t err = FSP_SUCCESS;
- /* Initialize the SPI module. */
- err = R_SCI_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg);
- /* Handle any errors. This function should be defined by the user. */
- assert(FSP_SUCCESS == err);
- }
复制代码
接下来就是向LCD通过SPI发送数据的控制:
- ///************************************宏定义************************************/
- #define TFT_RS_set R_BSP_PinWrite (BSP_IO_PORT_01_PIN_05, BSP_IO_LEVEL_HIGH)
- #define TFT_RS_reset R_BSP_PinWrite (BSP_IO_PORT_01_PIN_05, BSP_IO_LEVEL_LOW)
- #define TFT_CS_set R_BSP_PinWrite (BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_LOW)
- #define TFT_CS_reset R_BSP_PinWrite (BSP_IO_PORT_01_PIN_06, BSP_IO_LEVEL_HIGH)
- #define TFT_BL_SET R_BSP_PinWrite (BSP_IO_PORT_01_PIN_14, BSP_IO_LEVEL_HIGH)
- #define TFT_BL_RESET R_BSP_PinWrite (BSP_IO_PORT_01_PIN_14, BSP_IO_LEVEL_LOW)
- #define TFT_RESET_set R_BSP_PinWrite (BSP_IO_PORT_01_PIN_07, BSP_IO_LEVEL_HIGH)
- #define TFT_RESET_reset R_BSP_PinWrite (BSP_IO_PORT_01_PIN_07, BSP_IO_LEVEL_LOW
- /***********************************变量声明***********************************/
- bool g_transfer_complete = false;
- /***********************************函数声明***********************************/
- void delay_ms(uint32_t nms);
- void SPI0_SendData(uint8_t Data);
- void LCD_WR_COMM(uint8_t COMM);
- void LCD_WR_DATA(uint8_t DATA);
- //******************************************************************************
- //* 函数名称 : TFT_WR_COMM(uint8_tCOMM)
- //* 函数描述 : 发送指令
- //* 输入参数 : COMM
- //* 参数描述 : 具体的指令代码
- //* 输出参数 : 无
- //* 返回值 : 无
- //******************************************************************************
- void delay_ms(uint32_t nms)
- {
- R_BSP_SoftwareDelay(nms, BSP_DELAY_UNITS_MICROSECONDS);
- }
- //******************************************************************************
- //* 函数名称 : TFT_WR_COMM(uint8_tCOMM)
- //* 函数描述 : 发送指令
- //* 输入参数 : COMM
- //* 参数描述 : 具体的指令代码
- //* 输出参数 : 无
- //* 返回值 : 无
- //******************************************************************************
- void SPI0_SendData(uint8_t Data)
- {
-
- fsp_err_t err = FSP_SUCCESS;
- TFT_CS_set;
- /* Start a write/read transfer */
- g_transfer_complete = false;
-
- err = R_SCI_SPI_Write (&g_spi0_ctrl,&Data,1, SPI_BIT_WIDTH_8_BITS);
- assert(FSP_SUCCESS == err);
- /* Wait for SPI_EVENT_TRANSFER_COMPLETE callback event. */
- while (false == g_transfer_complete)
- {
- ;
- }
- TFT_CS_reset;
- /* Wait for minimum time required between transfers. */
- R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_MICROSECONDS);
-
- }
- //******************************************************************************
- //* 函数名称 : TFT_WR_COMM(uint8_tCOMM)
- //* 函数描述 : 发送指令
- //* 输入参数 : COMM
- //* 参数描述 : 具体的指令代码
- //* 输出参数 : 无
- //* 返回值 : 无
- //******************************************************************************
- void LCD_WR_COMM(uint8_t COMM)
- {
- TFT_RS_reset;
- SPI0_SendData(COMM);
-
- }
- //******************************************************************************
- //* 函数名称 : TFT_WR_DATA(uint8_t DATA)
- //* 函数描述 : 发送数据
- //* 输入参数 : DATA
- //* 参数描述 : 发送的具体的数据代码
- //* 输出参数 : 无
- //* 返回值 : 无
- //******************************************************************************
- void LCD_WR_DATA(uint8_t DATA)
- {
- TFT_RS_set;
- SPI0_SendData(DATA);
复制代码
TFT驱动成功!
|