0 前言
本次实验使用的是1.8寸TFT屏幕,分辨率128x160,驱动IC是ST7735。实验的主要目的是根据屏幕的引脚定义来调用FSP库的SPI功能,为之后的项目模块整合打个基础。
1 硬件部分
1.8寸TFT屏幕的引脚定义如下:
引脚名 |
说明 |
---|
GND |
接开发板的GND |
VCC |
接3.3V |
SCL |
时钟 接RSPCK |
SDA |
数据 接MOSI |
RST |
复位脚 使用GPIO控制 |
DC |
数据或命令脚 使用GPIO控制 |
CS |
片选脚 使用GPIO控制 |
BL |
背光控制 直接IO输出高电平 |
观察原理图,在PMOD这块,正好有我们驱动屏幕所需的SPI功能所使用的引脚。接下来在e2s配置里就着重关注相关引脚配置。
2 软件部分
2.1 新建工程
将先前创建的工程模板文件夹复制一份,并将文件夹重命名为03_SPI_TFT
在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。
2.2 配置工程
2.2.1 设置外设对应引脚
引脚名 |
开发板接口 |
---|
GND |
GND |
VCC |
3V3 |
SCL |
(PMOD2)4: P102 |
SDA |
P101 |
RST |
(PMOD1)8: P408 |
DC |
(PMOD1)7: P105 |
CS |
(PMOD1)1: P301 |
BL |
(PMOD1)10: P014 |
先配置SPI相关的。
双击e2s界面左侧的项目资源管理器
当中的configuration.xml
文件,在中间选择Pins--peripherals--Connectivity:SPI--SPI1。
将operation mode 设为enabled,如下图所示:
这里将RST、DC、CS、BL这几个用GPIO进行操作,它们分别对应的开发板接口在先前的表格中已给出。
将P408、P105、P301、P014都设置为类似如下图所示的内容,注意Symbolic name这里,我都用的前面表格内的引脚名,如RST、DC等;Mode 选择 Output Initial Low。
2.2.2 新建并设置模块属性
点击Stacks,New Stack--Connectivity--SPI(r_spi)。点击刚生成的模块-属性,我们只需要改动下图所示的地方。
2.2.3 生成代码
保存配置文件,并点击Generate Project Content让其自动为我们生成代码。
2.3 编写代码
由于代码内容过多,请在附件中下载工程压缩包查看
2.3.1 新建文件夹及源文件
在工程的src文件夹下,新建一个文件夹名为lcd
,以及lcd_driver.h
头文件和lcd_driver.c
源文件,另外再建两个头文件,分别是font.h
和pic.h
。
2.3.2 修改lcd文件夹下的文件
请直接下载附件,查看工程源文件
2.3.3 修改hal_entry.c
在文件开头增加
#include "lcd/lcd_driver.h"
在hal_entry函数前面增加spi_callback,spi回调函数
void spi_callback (spi_callback_args_t * p_args)
{
if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
{
g_transfer_complete = true;
}
}
在hal_entry函数内增加
fsp_err_t err = R_SPI_Open(&g_spi1_ctrl, &g_spi1_cfg);
assert(FSP_SUCCESS == err);
R_IOPORT_PinWrite(&g_ioport_ctrl, RST, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, RST, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(150, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BL, BSP_IO_LEVEL_HIGH);
LCD_Init();
LED_ON();
while(1){
LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
LCD_Fill(0,0,LCD_W,LCD_H,YELLOW);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
LCD_ShowString(32,50,(uint8_t *)"RA4E2",RED,BLACK,24,0);
LCD_ShowString(8,80,(uint8_t *)"SPI-LCD",BLUE,BLACK,32,0);
R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);
}
附注:这里踩了两个坑
- 一定要在使用SPI前开启SPI,即调用R_SPI_Open。因为之前做点亮LED实验时,R_IOPORT_Open是被初始化程序自动调用的,在这里想当然地以为程序也会自动调用,就没加。结果就是屏幕各种点不亮。
- 需要在配置屏幕初始化之前,对屏幕进行reset操作,即拉低RST引脚1ms,拉高后等待120ms以上,再调用
LCD_Init();
3 下载测试
连接好开发板与屏幕,编译项目、烧录程序。
如果成功,将会看到颜色填充刷屏+显示字符串的效果,如结尾视频所示。