打印
[应用相关]

STM32基础--I2C与触摸屏驱动

[复制链接]
857|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【海东青电子原创**,转载请注明出处: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引脚),硬件连接很简单:



作者:海东青电子
链接: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头文件:


使用特权

评论回复
板凳
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 | 只看该作者
配置外部时钟:

使用特权

评论回复
5
manufact|  楼主 | 2020-6-26 16:00 | 只看该作者
HCLK==216MHz:

使用特权

评论回复
6
manufact|  楼主 | 2020-6-26 16:00 | 只看该作者
调试器:

使用特权

评论回复
7
manufact|  楼主 | 2020-6-26 16:01 | 只看该作者
配置I2C,3#:

使用特权

评论回复
8
manufact|  楼主 | 2020-6-26 16:02 | 只看该作者
注意,需要调整pin的映射关系:

使用特权

评论回复
9
manufact|  楼主 | 2020-6-26 16:03 | 只看该作者
将用户LED管脚配置成输出,便于观察实验结果:

使用特权

评论回复
10
manufact|  楼主 | 2020-6-26 16:03 | 只看该作者
配置完毕,生成KEIL代码,main.c 如下:

使用特权

评论回复
11
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 。

使用特权

评论回复
12
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即可:

使用特权

评论回复
13
manufact|  楼主 | 2020-6-26 16:05 | 只看该作者
全速运行debug,通过ITM跟踪方式输出触屏坐标:

使用特权

评论回复
14
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)

使用特权

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

使用特权

评论回复
16
manufact|  楼主 | 2020-6-26 16:07 | 只看该作者
作者:海东青电子
链接:https://www.jianshu.com/p/721d0ccd7b30
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

303

帖子

0

粉丝