【海东青电子原创文章,转载请注明出处: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引脚),硬件连接很简单:
阅读 FT5336手册知,MCU是I2C的Master,触屏是Slave,MCU通过读取触屏的某个8-bit的“寄存器,reg”,就可以获得触屏的有关信息。比如,读地址为0xA8的reg,将返回触屏的 Chip ID(0x51,见图三)。这些reg的地址定义可以参考BSP中的 ft5336.h头文件:
具体而言,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读取函数读数据即可。
配置外部时钟:
HCLK==216MHz:
调试器:
配置I2C,3#:
注意,需要调整pin的映射关系:
将用户LED管脚配置成输出,便于观察实验结果:
配置完毕,生成KEIL代码,main.c 如下:
其中,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 。
下面来实现读取触屏上手指按下的坐标位置。当手指按下触屏时,地址为0x02的reg(FT5336_TD_STAT_REG)将保存 “active touch points”(触点个数,取值0--5,按下时实测为1),代码中不断轮询这个reg,一旦大于0,说明按下屏幕了,而坐标位置保存在地址为 0x03--0x06的4个reg中,读取这些reg即可:
全速运行debug,通过ITM跟踪方式输出触屏坐标:
完整代码见:https://github.com/haidongqing/i2c3test-xy 。
(如何在KEIL中使用ITM功能实时查看变量,见《STM32的ITM跟踪调试功能介绍及实现(一)KEIL篇》、《STM32的ITM跟踪调试功能介绍及实现(四)printf() 篇》)
说明:为了使用 FT5336_CHIP_ID_REG 等reg地址定义,可以include ft5336.h 这个头文件的,但这个文件又include了 ts.h头文件,以及一堆BSP中的数据类型定义,需要向KEIL工程中添加许多c文件,很麻烦,所以直接从 ft5336.h 中 copy了一些要用到的宏定义,反而来的简单。