银川品牌网站建设公司,自己做的手工在哪个网站卖会更好,内容展示型网站特点,电话网络营销是什么目录 一、简介
二、硬件原理
编辑1、CT_INT
2、I2C2_SCL和I2C2_SDA
3、RESET复位引脚
三、FT54x6/FT52x6电容触摸芯片
四、代码编写 1、编写ft5426.h
2、编写ft5426.c
3、main函数 一、简介
电容屏只需要手指轻触即可#xff0c;而电阻屏是需要手指给予一定的压力才…目录 一、简介
二、硬件原理
编辑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_TXDI2C2_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();
#endif2、编写ft5426.c
#include bsp_ft5426.hstruct 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 status0;unsigned char writedatadata;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))status1;return status;
}
/*从FT5426读数据*/
unsigned char ft5426_readonebyte(unsigned char addr,unsigned char reg)
{unsigned char val0;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],i0,type0;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(i0;ift5426_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_fail1) //判断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*)MY4384); 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卡插到开发版上后就触摸就会显示多少个触摸点和相关触摸点的坐标