[应用相关] STM32基础--I2C与触摸屏驱动

[复制链接]
 楼主| manufact 发表于 2020-6-26 15:54 | 显示全部楼层 |阅读模式
【海东青电子原创**,转载请注明出处:https://www.jianshu.com/p/721d0ccd7b30】
在《使用STM32CubeMX创建TouchGFX应用程序(四)-- 触屏驱动》中,我们使用ST的BSP驱动了STM32F746G-DISCO开发板上的触屏,虽然一切工作正常,但总觉得用了ST现成的东西,并没有搞清楚触屏驱动的细节。下面来初步研究一下这个触屏的硬件结构和软件驱动。板子上显示器、触屏模组型号是 RK043FN48H,触屏IC型号为 FT5336GQQ,其通过MCU的I2C3与MCU通讯,有4根信号线,其中I2C占用了2根,1根是INT中断信号、1根是RESET信号(连接到了MCU的RST引脚),硬件连接很简单:

569725ef5a9a919c0f.png

作者:海东青电子
链接:https://www.jianshu.com/p/721d0ccd7b30
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 楼主| manufact 发表于 2020-6-26 15:58 | 显示全部楼层
阅读 FT5336手册知,MCU是I2C的Master,触屏是Slave,MCU通过读取触屏的某个8-bit的“寄存器,reg”,就可以获得触屏的有关信息。比如,读地址为0xA8的reg,将返回触屏的 Chip ID(0x51,见图三)。这些reg的地址定义可以参考BSP中的 ft5336.h头文件:

11085ef5aaa35ca6e.png
706775ef5aaab92bf5.png
 楼主| manufact 发表于 2020-6-26 15:59 | 显示全部楼层
具体而言,MCU通过I2C读触屏数据时,是将触屏的 reg地址当作I2C协议中的“片内地址”来处理的,而且这个地址位宽是8-bit,I2C总线时序是:MCU发出I2C开始信号,送出7-bit Slave 地址+写命令,送一个8-bit地址(reg地址),然后restart信号,再送7-bit Salve地址+读命令,读1个字节,结束。可见,为了读出触屏信息,需要做2个工作:使用CubeMX正确配置I2C3,然后调用 I2C的HAL读取函数读数据即可。

 楼主| manufact 发表于 2020-6-26 15:59 | 显示全部楼层
配置外部时钟:
589275ef5aae24a4ef.png
 楼主| manufact 发表于 2020-6-26 16:00 | 显示全部楼层
HCLK==216MHz:
185805ef5ab0772294.png
 楼主| manufact 发表于 2020-6-26 16:00 | 显示全部楼层
调试器:
232365ef5ab28edbdc.png
 楼主| manufact 发表于 2020-6-26 16:01 | 显示全部楼层
配置I2C,3#:
744075ef5ab47ab73c.png
 楼主| manufact 发表于 2020-6-26 16:02 | 显示全部楼层
注意,需要调整pin的映射关系:
954535ef5ab6c5272e.png
 楼主| manufact 发表于 2020-6-26 16:03 | 显示全部楼层
将用户LED管脚配置成输出,便于观察实验结果:
758485ef5aba172813.png
 楼主| manufact 发表于 2020-6-26 16:03 | 显示全部楼层
配置完毕,生成KEIL代码,main.c 如下:
543435ef5abcea1383.png
 楼主| manufact 发表于 2020-6-26 16:04 | 显示全部楼层
其中,MX_I2C3_Init() 是CubeMX 对于I2C的初始化函数,它调用了函数 HAL_I2C_Init() ,又调用了 HAL_I2C_MspInit() 配置I2C的管脚、打开外设时钟(APB1总线),配置I2C相关的寄存器,完成初始化。之后,跟I2C HAL有关的功能函数就可以调用了,具体调用哪个,就要看用户的需要了--由I2C设备的功能来决定。本例中,I2C设备是触摸屏,地址为0x07(FT5336_I2C_SLAVE_ADDRESS),读取芯片ID(FT5336_CHIP_ID_REG),所以调用了 HAL_I2C_Mem_Read(),正确读取ID后,LED一秒一次慢闪。如果过程中出错,LED会快闪。完整代码见:https://github.com/haidongqing/i2c3test-readid 。

 楼主| manufact 发表于 2020-6-26 16:04 | 显示全部楼层
下面来实现读取触屏上手指按下的坐标位置。当手指按下触屏时,地址为0x02的reg(FT5336_TD_STAT_REG)将保存 “active touch points”(触点个数,取值0--5,按下时实测为1),代码中不断轮询这个reg,一旦大于0,说明按下屏幕了,而坐标位置保存在地址为 0x03--0x06的4个reg中,读取这些reg即可:

721165ef5ac1d66a59.png
 楼主| manufact 发表于 2020-6-26 16:05 | 显示全部楼层
全速运行debug,通过ITM跟踪方式输出触屏坐标:
189185ef5ac3cdf9e6.png
 楼主| manufact 发表于 2020-6-26 16:06 | 显示全部楼层
完整代码见:https://github.com/haidongqing/i2c3test-xy 。

(如何在KEIL中使用ITM功能实时查看变量,见《STM32的ITM跟踪调试功能介绍及实现(一)KEIL篇》https://www.jianshu.com/p/0255097f594e
《STM32的ITM跟踪调试功能介绍及实现(四)printf() 篇》https://www.jianshu.com/p/3f637df3912f)

 楼主| manufact 发表于 2020-6-26 16:07 | 显示全部楼层
说明:为了使用 FT5336_CHIP_ID_REG 等reg地址定义,可以include ft5336.h 这个头文件的,但这个文件又include了 ts.h头文件,以及一堆BSP中的数据类型定义,需要向KEIL工程中添加许多c文件,很麻烦,所以直接从 ft5336.h 中 copy了一些要用到的宏定义,反而来的简单。

 楼主| manufact 发表于 2020-6-26 16:07 | 显示全部楼层
作者:海东青电子
链接:https://www.jianshu.com/p/721d0ccd7b30
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

303

帖子

0

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