本文介绍使用STM32F103单片机,通过IIC接口,驱动触摸芯片FT5316
文章目录
前言
一、FT5316概述
二、触摸测试
1.接口介绍
2.检测触摸
总结
前言
本文介绍使用STM32F103单片机,通过IO口模拟IIC接口,驱动触摸芯片FT5316
一、FT5316概述
FT5316 是互容式电容多点触摸控制芯片,内置 MCU,属于 FT5x16 系列,同系列还有 FT5216,广泛用于 5/7 寸工业屏、工控 HMI、嵌入式 Linux/Android 设备、树莓派配套电容触摸屏。
二、触摸测试
1.接口介绍
测试使用的触摸屏为7寸屏,触摸分辨率为800*480,触摸接口6 pin,分别为 SDA,SCL,RST,INT,VCC,GND。测试时,VCC为3.3V供电。
接口照片
2.检测触摸
配置STM32F103单片机的串口,进行调试输出,通过IIC总线,读取FT5316的0x02寄存器,该寄存器为触摸点数量检测。没有进行触摸时,读取到的寄存器值为0,有触摸时,读取到的数值为非0。本测试进行单点触摸,该寄存器在检测到触摸时,数值为1。
首先通过复位引脚,复位FT5316
void ft5x16_hw_reset(void) { GPIO_InitTypeDef gpio; FT_RST_CLK_ENABLE(); gpio.GPIO_Pin = FT_RST_PIN; gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(FT_RST_PORT, &gpio); GPIO_ResetBits(FT_RST_PORT, FT_RST_PIN); /* 拉低复位 */ ft_delay_ms(10); GPIO_SetBits(FT_RST_PORT, FT_RST_PIN); /* 释放 */ ft_delay_ms(200); /* 固件加载期间不要访问 I2C */ }屏幕点击,读取0x02寄存器代码,FT5316_Init函数代码如下:
uint8_t ft5x16_init(void) { uint8_t b0, b1; Soft_I2C_Start(); if (Soft_I2C_WriteByte(FT5X16_DEV_ADDR<<1) != 0u) { Soft_I2C_Stop(); return 1; } if (Soft_I2C_WriteByte(FT5X16_REG_TD_STATUS) != 0u) { Soft_I2C_Stop(); return 2; } //Soft_I2C_Stop(); /* STOP 沿 = 结束采集、启动转换 */ Soft_I2C_Start(); if (Soft_I2C_WriteByte((FT5X16_DEV_ADDR<<1) | 0x01) != 0u) { Soft_I2C_Stop(); return 3; } b0=Soft_I2C_ReadByte(0x01);//回 NACK Soft_I2C_Stop(); return b0; }主函数中进行触摸检测,没有触摸时,串口显示 NO DW;有触摸时,显示 DOWN。
while(1) { ret=ft5x16_init(); if(ret==0) { Usart_SendString(USART1,"FT5316 NO DW!\r\n",15); } else { Usart_SendString(USART1,"FT5316 DOWN!\r\n",15); } Delay_ms(1000); }程序下载运行后,点击触摸屏,会在串口调试助手上显示触摸状态。
3.触摸坐标计算
单点触摸时,从 0x03 起始连续读取 4 个字节(0x03,0x04,0x05,0x06),对应第 1 个触摸点完整信息:
表格
| 寄存器地址 | 字节 | 名称 | 位定义 |
|---|---|---|---|
| 0x03 | Byte0 | XH(X 高字节) | bit7~6:事件标记;bit5~4:触摸点 ID;bit3~0:X 坐标高 4bit |
| 0x04 | Byte1 | XL(X 低字节) | X 坐标低 8bit |
| 0x05 | Byte2 | YH(Y 高字节) | bit7~6:事件标记;bit5~4:触摸点 ID;bit3~0:Y 坐标高 4bit |
| 0x06 | Byte3 | YL(Y 低字节) | Y 坐标低 8bit |
字段详细解释
- 0x03(XH)
- bit7~6:事件类型:
00=按下,01=抬起,10=保持触摸 - bit5~4:触摸点 ID(单点触摸就是 0)
- bit3~0:X 坐标的高 4bit(X 总共 12bit)
- 0x04(XL):X 坐标低 8bit 拼接公式:
X = ((XH & 0x0F) << 8) | XL; - 0x05(YH)
- bit7~6:事件类型
- bit5~4:触摸点 ID
- bit3~0:Y 坐标高 4bit
- 0x06(YL):Y 坐标低 8bit 拼接公式:
Y = ((YH & 0x0F) << 8) | YL;
通过ft5x16_read_touch函数,读取左上角坐标、中间坐标、右下角坐标触点各一个,每个触点4个字节,一共将获取到12个字节数据
坐标数值,如下图:
左上区域坐标为(0x04D,0x039),转换为10进制,坐标值为(77,57)
中间区域坐标为(0x188,0x0E2),转换为10进制,坐标值为(392,226)
右下区域坐标为(0x2EB,0x199),转换为10进制,坐标值为(747,409)
读取坐标,函数代码
uint8_t ft5x16_read_touch(ft5x16_touch_data_t *data) { uint8_t buf[6 * FT5X16_MAX_TOUCHES]; uint8_t status; uint8_t memaddr; uint8_t i, n, b[4]; memaddr=FT5X16_REG_TOUCH1_XH; Soft_I2C_WriteThenRead(FT5X16_DEV_ADDR,&memaddr,1,b,4); location[0]=b[0]; location[1]=b[1]; location[2]=b[2]; location[3]=b[3]; return 0; }主循环中调用
while(1) { ret=ft5x16_init(); if(ret==0) { //Usart_SendString(USART1,"FT5316 NO DW!\r\n",15); } else { //Usart_SendString(USART1,"FT5316 DOWN!\r\n",15); //调用坐标读取函数 ft5x16_read_touch(&ft5316_location); USART_SendData(USART1,location[0]); Delay_ms(1); USART_SendData(USART1,location[1]); Delay_ms(1); USART_SendData(USART1,location[2]); Delay_ms(1); USART_SendData(USART1,location[3]); Delay_ms(1); } Delay_ms(1000); }修改代码,以10进制坐标输出数据
总结
通过STM32单片机GPIO端口,模拟IIC,检测FT5316触摸屏单点触摸坐标。