目录
一、简介
二、硬件原理
编辑1、CT_INT
2、I2C2_SCL和I2C2_SDA
3、RESET复位引脚
三、FT54x6/FT52x6电容触摸芯片
四、代码编写
1、编写ft5426.h
2、编写ft5426.c
3、main函数
一、简介
电容屏只需要手指轻触即可,而电阻屏是需要手指给予一定的压力才有反应,而且电容触摸芯片输出的触摸点坐标信息为对应的屏幕像素点信息,因此不需要校准,电阻屏需要校准。如今多点电容触摸屏已经得到了广泛的应用,手机、平板、电脑、广告机等等,如果要做人机交互设备的开发,多点电容触摸屏基本是不可能绕过去的
电容触摸屏需要一个IC驱动控制的,一般是I2C接口,多点触摸屏驱动最终就是一个I2C外设驱动
二、硬件原理
找到RGB的原理图
1、CT_INT
触摸中断线
连接到了GPIO1_IO09,查数据手册
可以复用为GPIO1_IO09
2、I2C2_SCL和I2C2_SDA
I2C2_SCL:连接到了UART5_TXD;I2C2_SDA:连接到了UART5_RXD,查数据手册
都可以复用
3、RESET复位引脚
连接到了SNVS_TAMPER9,查数据手册
可以看到就复位为GPIO5_IO09
三、FT54x6/FT52x6电容触摸芯片
使用到的部分寄存器如下
寄存器地址 | 位 | 寄存器功能 | 描述 |
0X00 | [6:4] | 模式寄存器 | 设置 FT5426 的工作模式: 000:正常模式。001:系统信息模式100:测试模式。 |
0X02 | [3:0] | 触摸状态寄存器 | 记录有多少个触摸点,有效值为 1~5。 |
0X03 | [7:6] | 第一个触摸点 X 坐标高位数据 | 事件标志: 00:按下。01:抬起10:接触11:保留 |
[3:0] | X 轴坐标值高 4 位。 |
0X04 | [7:0] | 第一个触摸点 X 坐标低位数据 | X 轴坐标值低 8 位 |
0X05 | [7:4] | 第一个触摸点 Y 坐标高位数据 | 触摸点的 ID。 |
[3:0] | Y 轴坐标高 4 位 | ||
0X06 | [7:0] | 第一个触摸点 Y 坐标低位数据 | Y 轴坐标低 8 位 |
0X09 | [7:6] | 第二个触摸点 X 坐标高位数据 | 与寄存器 0X03 含义相同。 |
[3:0] | |||
0X0A | [7:0] | 第二个触摸点 X 坐标低位数据 | 与寄存器 0X04 含义相同。 |
0X0B | [7:4] | 第二个触摸点 Y 坐标高位数据 | 与寄存器 0X05 含义相同。 |
[3:0] | |||
0X0C | [7:0] | 第二个触摸点 Y 坐标低位数据 | 与寄存器 0X06 含义相同 |
0X0F | [7:6] | 第三个触摸点 X 坐标高位数据 | 与寄存器 0X03 含义相同。 |
[3:0] | |||
0X10 | [7:0] | 第三个触摸点 X 坐标低位数据 | 与寄存器 0X04 含义相同。 |
0X11 | [7:4] | 第三个触摸点 Y 坐标高位数据 | 与寄存器 0X05 含义相同。 |
[3:0] | |||
0X12 | [7:0] | 第三个触摸点 Y 坐标低位数据 | 与寄存器 0X06 含义相同 |
0X15 | [7:6] | 第四个触摸点 X 坐标高位数据 | 与寄存器 0X03 含义相同。 |
[3:0] | |||
0X16 | [7:0] | 第四个触摸点 X 坐标低位数据 | 与寄存器 0X04 含义相同。 |
0X17 | [7:4] | 第四个触摸点 Y 坐标高位数据 | 与寄存器 0X05 含义相同。 |
[3:0] | |||
0X18 | [7:0] | 第四个触摸点 Y 坐标低位数据 | 与寄存器 0X06 含义相同 |
0X1B | [7:6] | 第五个触摸点 X 坐标高位数据 | 与寄存器 0X03 含义相同。 |
[3:0] | |||
0X1C | [7:0] | 第五个触摸点 X 坐标低位数据 | 与寄存器 0X04 含义相同。 |
0X1D | [7:4] | 第五个触摸点 Y 坐标高位数据 | 与寄存器 0X05 含义相同。 |
[3:0] | |||
0X1E | [7:0] | 第五个触摸点 Y 坐标低位数据 | 与寄存器 0X06 含义相同 |
0XA1 | [7:0] | 版本寄存器 | 版本高字节 |
0XA2 | [7:0] | 版本低字节 | |
0XA4 | [7:0] | 中断模式寄存器 | 用于设置中断模式: 0:轮询模式1:触发模式 |
这里使用设备的IIC地址为0X38
四、代码编写
创建文件
1、编写ft5426.h
#ifndef __BSP_FT5426_H
#define __BSP_FT5426_H
#include "imx6ul.h"
#include "bsp_gpio.h"
#include "bsp_int.h"
#include "bsp_delay.h"
#include "bsp_i2c.h"
#include "stdio.h"
/*寄存器宏*/
#define FT5426_ADDR 0X38 /* FT5426设备地址 */
#define FT5426_DEVICE_MODE 0X00 /* 模式寄存器 */
#define FT5426_IDGLIB_VERSION 0XA1 /* 固件版本寄存器 */
#define FT5426_IDG_MODE 0XA4 /* 中断模式 */
#define FT5426_TD_STATUS 0X02 /* 触摸状态寄存器 */
#define FT5426_TOUCH1_XH 0X03 /* 触摸点坐标寄存器,
* 一个触摸点用4个寄存器存储坐标数据*/
#define FT5426_XYCOORDREG_NUM 30 /* 触摸点坐标寄存器数量 */
#define FT5426_INIT_FINISHED 1 /* 触摸屏初始化完成 */
#define FT5426_INIT_NOTFINISHED 0 /* 触摸屏初始化未完成 */
#define FT5426_TOUCH_EVENT_DOWN 0x00 /* 按下 */
#define FT5426_TOUCH_EVENT_UP 0x01 /* 释放 */
#define FT5426_TOUCH_EVENT_ON 0x02 /* 接触 */
#define FT5426_TOUCH_EVENT_RESERVED 0x03 /* 没有事件 */
/* 触摸屏结构体 */
struct ft5426_dev_struc
{
unsigned char initfalg; /* 触摸屏初始化状态 */
unsigned char intflag; /* 标记中断有没有发生 */
unsigned char point_num; /* 触摸点 */
unsigned short x[5]; /* X轴坐标 */
unsigned short y[5]; /* Y轴坐标 */
};
extern struct ft5426_dev_struc ft5426_dev;
void ft5426_init();
void gpio1_io09_irqhandler(unsigned int gicciar,
void *param);
unsigned char ft5426_writeonebyte(unsigned char addr,
unsigned char reg,
unsigned char data);
unsigned char ft5426_readonebyte(unsigned char addr,
unsigned char reg);
void ft5426_read_len(unsigned char addr,
unsigned char reg,
unsigned char len,
unsigned char *buf);
void ft5426_read_tpcoord();
#endif
2、编写ft5426.c
#include "bsp_ft5426.h"
struct ft5426_dev_struc ft5426_dev;
/*初始化5426*/
void ft5426_init()
{
unsigned char reg_value[2];
/* 1、初始化IIC2 IO
* I2C2_SCL -> UART5_TXD
* I2C2_SDA -> UART5_RXD
*/
IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL,1);/*复用为I2C2_SCL*/
IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA,1);/*复用为I2C2_SDA*/
/* 配置I2C2 IO属性
*bit 16:0 HYS关闭
*bit [15:14]: 1 默认47K上拉
*bit [13]: 1 pull功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 110 驱动能力为R0/6
*bit [0]: 1 高转换率
*/
IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL,0x70b0);
IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA,0x70b0);
/*初始化INT引脚,使能中断*/
gpio_pin_config_t ctint_config;
IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);/*复用为GPIO1_IO09*/
IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xf080);
/* 中断IO初始化 */
ctint_config.direction =kGPIO_IntRisingOrFallingEdge;
gpio_init(GPIO1 , 9 , &ctint_config);
GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);
system_register_irqhandler(GPIO1_Combined_0_15_IRQn,
(system_irq_handler_t)gpio1_io09_irqhandler,
NULL);
gpio_enableint(GPIO1 , 9);
/*复位引脚rst初始化*/
gpio_pin_config_t ctrst_config;
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);/*复用为GPIO5_IO09*/
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0x10b0);
gpio_init(GPIO5 , 9 , &ctrst_config);
gpio_pinwrite(GPIO5 , 9 , 0);/*复位*/
delayms(50);
gpio_pinwrite(GPIO5 , 9 , 1);/*停止复位*/
delayms(50);
/*I2C2初始化*/
i2c_init(I2C2);
/*ft5426初始化*/
ft5426_read_len(FT5426_ADDR,
FT5426_IDGLIB_VERSION,
2,
reg_value);
printf("touch frimware version:%#x\r\n",
((unsigned short)reg_value[0] << 8) | reg_value[1]);
/*设置工作在正常模式*/
ft5426_writeonebyte(FT5426_ADDR,FT5426_DEVICE_MODE,0);
/*设置中断模式*/
ft5426_writeonebyte(FT5426_ADDR,FT5426_IDG_MODE,1);
ft5426_dev.initfalg = FT5426_INIT_FINISHED;
}
/*中断处理函数*/
void gpio1_io09_irqhandler(unsigned int gicciar , void *param)
{
if(ft5426_dev.initfalg == FT5426_INIT_FINISHED)
{
ft5426_read_tpcoord();
}
/*清除中断标志位*/
gpio_clearintflags(GPIO1,9);
}
/*向FT5426写入数据*/
unsigned char ft5426_writeonebyte(unsigned char addr,
unsigned char reg,
unsigned char data)
{
unsigned char status=0;
unsigned char writedata=data;
struct i2c_transfer masterXfer;
/* 配置I2C xfer结构体 */
masterXfer.slaveAddress = addr; /* 设备地址 */
masterXfer.direction = kI2C_Write; /* 写入数据 */
masterXfer.subaddress = reg; /* 要写入的寄存器地址 */
masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
masterXfer.data = &writedata; /* 要写入的数据 */
masterXfer.dataSize = 1; /* 写入数据长度1个字节 */
if(i2c_master_transfer(I2C2, &masterXfer))
status=1;
return status;
}
/*从FT5426读数据*/
unsigned char ft5426_readonebyte(unsigned char addr,
unsigned char reg)
{
unsigned char val=0;
struct i2c_transfer masterXfer;
masterXfer.slaveAddress = addr; /* 设备地址 */
masterXfer.direction = kI2C_Read; /* 读取数据 */
masterXfer.subaddress = reg; /* 要读取的寄存器地址 */
masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
masterXfer.data = &val; /* 接收数据缓冲区 */
masterXfer.dataSize = 1; /* 读取数据长度1个字节 */
i2c_master_transfer(I2C2, &masterXfer);
return val;
}
/*从FT5426读多个寄存器数据*/
void ft5426_read_len(unsigned char addr,
unsigned char reg,
unsigned char len,
unsigned char *buf)
{
struct i2c_transfer masterXfer;
masterXfer.slaveAddress = addr; /* 设备地址 */
masterXfer.direction = kI2C_Read; /* 读取数据 */
masterXfer.subaddress = reg; /* 要读取的寄存器地址 */
masterXfer.subaddressSize = 1; /* 地址长度一个字节 */
masterXfer.data = buf; /* 接收数据缓冲区 */
masterXfer.dataSize = len; /* 读取数据长度1个字节 */
i2c_master_transfer(I2C2, &masterXfer);
}
/*读取触摸坐标信息*/
void ft5426_read_tpcoord()
{
unsigned char pointbuf[FT5426_XYCOORDREG_NUM],i=0,type=0;
ft5426_dev.point_num = ft5426_readonebyte(FT5426_ADDR,FT5426_TD_STATUS);
printf("touch num = %d\r\n",ft5426_dev.point_num);
/*触摸点信息寄存器*/
ft5426_read_len(FT5426_ADDR,
FT5426_TOUCH1_XH,
FT5426_XYCOORDREG_NUM,
pointbuf);
for(i=0;i<ft5426_dev.point_num;i++){
unsigned char *buf = &pointbuf[i*6];
ft5426_dev.y[i] = ((buf[0] << 8) | buf[1]) & 0xfff;
ft5426_dev.x[i] = ((buf[2] << 8) | buf[3]) & 0xfff;
type = buf[0] >> 6;
if(type == FT5426_TOUCH_EVENT_DOWN){
}else if(type == FT5426_TOUCH_EVENT_UP){
}else if(type == FT5426_TOUCH_EVENT_ON){
}else{
}
}
}
3、main函数
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_uart.h"
#include "bsp_lcd.h"
#include "bsp_lcdapi.h"
#include "bsp_rtc.h"
#include "bsp_icm20608.h"
#include "bsp_spi.h"
#include "stdio.h"
#include "bsp_ft5426.h"
#include "bsp_gt9147.h"
/*
* @description : main函数
* @param : 无
* @return : 无
*/
int main(void)
{
unsigned char i = 0;
unsigned char state = OFF;
int_init(); /* 初始化中断(一定要最先调用!) */
imx6u_clkinit(); /* 初始化系统时钟 */
delay_init(); /* 初始化延时 */
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化led */
beep_init(); /* 初始化beep */
uart_init(); /* 初始化串口,波特率115200 */
lcd_init(); /* 初始化LCD */
/* 初始化触摸屏 */
gt9147_init();
if(gt_init_fail==1) //判断gt系列初始化是否失败
{
ft5426_init();
}
tftlcd_dev.forecolor = LCD_RED;
lcd_show_string(50, 10, 400, 24, 24, (char*)"ALPHA-IMX6UL TOUCH TEST"); /* 显示字符串 */
lcd_show_string(50, 40, 200, 16, 16, (char*)"MY@4384");
lcd_show_string(50, 60, 200, 16, 16, (char*)"2023/2/22");
lcd_show_string(50, 110, 400, 16, 16, (char*)"TP Num :");
lcd_show_string(50, 130, 200, 16, 16, (char*)"Point0 X:");
lcd_show_string(50, 150, 200, 16, 16, (char*)"Point0 Y:");
lcd_show_string(50, 170, 200, 16, 16, (char*)"Point1 X:");
lcd_show_string(50, 190, 200, 16, 16, (char*)"Point1 Y:");
lcd_show_string(50, 210, 200, 16, 16, (char*)"Point2 X:");
lcd_show_string(50, 230, 200, 16, 16, (char*)"Point2 Y:");
lcd_show_string(50, 250, 200, 16, 16, (char*)"Point3 X:");
lcd_show_string(50, 270, 200, 16, 16, (char*)"Point3 Y:");
lcd_show_string(50, 290, 200, 16, 16, (char*)"Point4 X:");
lcd_show_string(50, 310, 200, 16, 16, (char*)"Point4 Y:");
while(1)
{
lcd_shownum(50 + 72, 110, ft5426_dev.point_num , 1, 16);
lcd_shownum(50 + 72, 130, ft5426_dev.x[0], 5, 16);
lcd_shownum(50 + 72, 150, ft5426_dev.y[0], 5, 16);
lcd_shownum(50 + 72, 170, ft5426_dev.x[1], 5, 16);
lcd_shownum(50 + 72, 190, ft5426_dev.y[1], 5, 16);
lcd_shownum(50 + 72, 210, ft5426_dev.x[2], 5, 16);
lcd_shownum(50 + 72, 230, ft5426_dev.y[2], 5, 16);
lcd_shownum(50 + 72, 250, ft5426_dev.x[3], 5, 16);
lcd_shownum(50 + 72, 270, ft5426_dev.y[3], 5, 16);
lcd_shownum(50 + 72, 290, ft5426_dev.x[4], 5, 16);
lcd_shownum(50 + 72, 310, ft5426_dev.y[4], 5, 16);
delayms(10);
i++;
if(i == 50)
{
i = 0;
state = !state;
led_switch(LED0,state);
}
}
return 0;
}
烧写到sd卡插到开发版上后就触摸,就会显示多少个触摸点和相关触摸点的坐标