☰
STM32驱动触摸芯片FT5316
2026/10/13 3:08:36 网站建设 项目流程

本文介绍使用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 个触摸点完整信息:

表格

寄存器地址字节名称位定义
0x03Byte0XH(X 高字节)bit7~6:事件标记;bit5~4:触摸点 ID;bit3~0:X 坐标高 4bit
0x04Byte1XL(X 低字节)X 坐标低 8bit
0x05Byte2YH(Y 高字节)bit7~6:事件标记;bit5~4:触摸点 ID;bit3~0:Y 坐标高 4bit
0x06Byte3YL(Y 低字节)Y 坐标低 8bit

字段详细解释

  1. 0x03(XH)
  • bit7~6:事件类型:00=按下,01=抬起,10=保持触摸
  • bit5~4:触摸点 ID(单点触摸就是 0)
  • bit3~0:X 坐标的高 4bit(X 总共 12bit)
  1. 0x04(XL):X 坐标低 8bit 拼接公式:X = ((XH & 0x0F) << 8) | XL;
  2. 0x05(YH)
  • bit7~6:事件类型
  • bit5~4:触摸点 ID
  • bit3~0:Y 坐标高 4bit
  1. 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触摸屏单点触摸坐标。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询