[活动] 【APM32F411V Tiny Board测评】驱动 SPI LCD

[复制链接]
 楼主| [鑫森淼焱垚] 发表于 2024-5-22 12:42 | 显示全部楼层 |阅读模式
本帖最后由 [鑫森淼焱垚] 于 2024-5-22 12:41 编辑

【APM32F411V Tiny Board测评】驱动 SPI LCD

屏幕介绍
    屏幕参数
    屏幕靓照
    屏的原理图
    屏幕连线
移植LCD驱动
    新建工程
        芯片类型选择:APM32F411VE
        编译器选择:AC5
        编译选项添加宏定义: APM32F411, APM32F411_TINY
        调试器选择:CMSIS-DAP Debugger
        源文件
        头文件路径
    移植 ST7789 驱动
    前言
    管脚配置
    初始化管脚
        软件SPI初始化
        硬件SPI初始化
    发送一个字节到LCD Driver IC
    踩坑
    移植结果
        添加测试代码
        移植结果

屏幕介绍


在某宝购买的一块 TFT LCD,2.4寸液晶屏,SPI串口,带字库。其型号为 ZJY240S10Z0TG11,显示屏驱动IC为 ST7789。

屏幕参数

显示模式:TFT
分辨率:240x320
接口类型:SPI-4线
驱动IC: ST7789


屏的原理图

0933118e09251445ee5d1822ef1d008b

9a121519124d79ce2f1371d76487ee88

f6f7739f2a9e660e1c4feee988ec20bc

66084393c89b0755788c403bfd0c85de

屏幕连线

分析了LCD屏幕的通信接口之后,找到了开发板上的SPI1管脚作为 SPI ,其他几个管脚用作控制线,如下表所示

显示屏管脚
开发板管脚
说明
GND
  电源地
VCC
  3.3V
CLK
PA5 -- SPI1 SCLK
SPI CLK
MOSI
PA7 -- SPI1 MOSI
SPI MOSI,MCU向屏幕发送数据
RES
PB5
屏幕驱动IC复位信号,低电平有效。
DC
PB6
Data/Command 控制信号:
高电平表示MCU向屏幕传输显示数据;低电平表示MCU向屏幕传输命令。
BLK
PB7
背光控制。
高电平表示打开背光;低电平表示关闭背光。
MISO
PA6 -- SPI1 MISO
SPI MISO,屏幕向MCU发送的数据。
CS1
PB8
显示屏的片选信号:
低电平有效;高电平失效。
CS2
PB9
字库芯片的片选信号:
低电平有效;高电平失效。


移植LCD驱动

新建工程


芯片类型选择:APM32F411VE

4314e01ef6b148294f8bf0ca3c4d1ae8


编译器选择:AC5

d1ea7fde54eddda1fab3bd7701ca1547


编译选项添加宏定义: APM32F411, APM32F411_TINY

48d33d5296cd0897c86406f66cb65bfb


调试器选择:CMSIS-DAP Debugger

6cb35f935adb78ee15611607911dde9c


在 Flash Download 标签页中勾选 Reset and Run,下载就自动运行程序。

af5679844c0a1756b5b9bfa844a86f27


源文件

添加如下几个分组:
  • Applications,添加 main.c 和 apm32f4xx_int.c 两个源文件
  • Boards/LCD,添加 LCD 驱动相关的文件,这里 lcd.c 实现画点、画线、显示字符的函数;而 lcd_init.c 才是 LCD 硬件驱动实现,移植驱动主要修改这个文件;zk.c 是字库驱动,如果不使用字库可以不添加;
  • Boards,是 APM32F4xx_SDK_V1.4 自带的 BSP 驱动,全都添加进来;
  • CMSIS,只添加 system_apm32f4xx.c 和startup_apm32f4xx.s 文件,只负责启动和时钟配置;
  • APM32_StdDriver,是 SDK 中的标准库,全都添加进来;


3210f2b024f7b615f8d52c0993a2dbf8


头文件路径

按照需要添加头文件路径,如下所示
042273327fd38e9e891b9a59de7e7899


移植 ST7789 驱动

根据前文屏幕连线设置,选用 SPI1 来驱动LCD,片选信号都是用软件片选,其他几个控制信号也都是GPIO来驱动。


前言

卖家提供的示例工程都是 GPIO 模拟 SPI 驱动。考虑到这种方式驱动屏幕比较慢,所以我一开始就上硬件SPI。没想到初始化失败了,退而求其次,用软件SPI。所以下面的管脚配置有两套代码,一套硬件SPI、一套软件SPI。


管脚配置

SPI1 的SCLK/MOSI/MISO 分别映射到 PA5/PA6/PA7 上。
这里使用宏定义,方便后期更换管脚尽可能地少修改代码。

4f57d75a563daa6544c1325959a032de
其他5个控制信号配置如下:

d46a7e7bccb8af33dfe5132c396c6cdb
a2edeed977d0d77ce762f6b3e90cc903


初始化管脚

LCD 初始化流程如下:
LCD_Init() --> LCD_GPIO_Init() --> 下发屏的初始化命令。
在 LCD_GPIO_Init() 中初始化管脚和SPI。下面的代码已经支持硬件SPI和软件SPI,所以用宏定义区分开来。


软件SPI初始化

所有管脚都是GPIO方式,如下代码所示:
c46cb90a1d2c389e35a5cb60c6086d9c
03d33de83bf47e7d3c88e28b43c5cbdc


硬件SPI初始化

ad978f1486d99ac98ab7435a73f55abf
7c9b36a215719fafb6b9d8bcce8ad1f4


发送一个字节到LCD Driver IC

函数 LCD_Write_Bus() 负责发送一个字节到LCD Driver,实现如下:

软件实现很简单,移位、发送最高比特即可。
硬件实现,发送时先等待 SPI_FLAG_TXBE 置位;接收时需要先判断 SPI_FLAG_RXBNE 置位。

03a3ceddafe6bc70d6e4a17997e6f8b9


初始化 LCD Driver IC

在初始化 LCD 管脚之后,需要发送屏初始化命令、设置参数。这个没什么好说的,按照厂商提供的示例即可。
一般在初始化的最后一步才打开屏幕显示。例如 ST7789 命令 0x29 是 Display On 命令,所以在初始化的最后一步是 LCD_WR_REG(0x29)


踩坑

  • 管脚配错,换了几块开发板,都没能点亮屏幕。后来使用 APM32F411 Tiny Board,一个管脚一个管脚配置输入、输出模式,验证每个管脚功能正常后,才把软件SPI方式驱动ST7789跑通。最后再上硬件SPI,也顺利跑通。
  • 硬件SPI收发时,需要先等待SPI发送缓冲区为空才能发送,而且发送完必须接收一个字节,否则出错。

移植结果

添加测试代码

ad430c36a547f1d8880f23c75d60acea


移植结果

81d28ede7c1497deb22d529b95345f9c
0134811097054c961dd4ce54c2942728


硬件 SPI 效果:


软件 SPI 效果:





szt1993 发表于 2024-5-23 16:49 | 显示全部楼层
SPI通信稳定性怎样?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

127

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部