【正点原子Linux连载】第二十八章 多点电容触摸屏实验

您所在的位置:网站首页 多屏幕法实验内容和选题 【正点原子Linux连载】第二十八章 多点电容触摸屏实验

【正点原子Linux连载】第二十八章 多点电容触摸屏实验

2024-07-09 13:40| 来源: 网络整理| 查看: 265

1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 4)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第二十八章 多点电容触摸屏实验

随着智能手机的发展,电容触摸屏也得到了飞速的发展。相比电阻触摸屏,电容触摸屏有很多的优势,比如支持多点触控、不需要按压,只需要轻轻触摸就有反应。ALIENTEK的三款RGB LCD屏幕都支持多点电容触摸,本章就以ATK7016这款RGB LCD屏幕为例讲解一下如何驱动电容触摸屏,并获取对应的触摸坐标值。

28.1 多点电容触摸简介 触摸屏很早就有了,一开始是电阻触摸屏,电阻触摸屏只能单点触摸,在以前的学习机、功能机时代被广泛使用。2007年1月9日苹果发布了划时代的第一代Iphone,也就是Iphone 2G,Iphone 2G上使用了多点电容触摸屏,而当时的手机基本都是使用的电阻触摸屏。电容触摸屏优秀的触摸品质和手感瞬间征服了消费者,带来了手机触摸屏的大变革,后面新出的手机也都采用了多点电容触摸屏。和电阻触摸屏相比,电容触摸屏最大的优点是支持多点触摸(后面的电阻屏也支持多点触摸,但是为时已晚),电容屏只需要手指轻触即可,而电阻屏是需要手指给予一定的压力才有反应,而且电容屏不需要校准。如今多点电容触摸屏已经得到了广泛的应用,手机、平板、电脑、广告机等等,如果要做人机交互设备的开发,多点电容触摸屏基本是不可能绕过去的。所以本章我们就来学习一下如何使用多点触摸屏,如何获取到多点触摸值。关于电容屏的物理原理我们就不去研究了,毕竟我们不是开发电容屏的,而是电容屏的使用者,我们只需要关注如何使用电容屏,如何得到其多点触摸坐标值即可。ALIENTEK的三款RGB LCD屏幕都是支持5点电容触摸屏的,本章我们同样以ATK-7016这款屏幕为例来讲解如何使用多点电容触摸屏。 ATK-7016这款屏幕其实是由TFT LCD+触摸屏组合起来的。底下是LCD面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的LCD屏幕。电容触摸屏也是需要一个驱动IC的,驱动IC一般会提供一个I2C接口给主控制器,主控制器可以通过I2C接口来读取驱动IC里面的触摸坐标数据。ATK-7016、ATK-7084这两款屏幕使用的触摸控制IC是FT5426,ATK-4342使用的驱动IC是GT9147。这三个电容屏触摸IC都是I2C接口的,使用方法基本一样。 FT5426这款驱动IC采用15*28的驱动结构,也就是15个感应通道,28个驱动通道,最多支持5点电容触摸。ATK-7016的电容触摸屏部分有4个IO用于连接主控制器:SCL、SDA、RST和INT,SCL和SDA是I2C引脚,RST是复位引脚,INT是中断引脚。一般通过INT引脚来通知主控制器有触摸点按下,然后在INT中断服务函数中读取触摸数据。也可以不使用中断功能,采用轮询的方式不断查询是否有触摸点按下,本章实验我们使用中断方式来获取触摸数据。 和所有的I2C器件一样,FT5426也是通过读写寄存器来完成初始化和触摸坐标数据读取的,I.MX6U的I2C我们已经在第二十六章做了详细的讲解,所以本章的主要工作就是读写FT5426的寄存器。FT5426的I2C设备地址为0X38,FT5426的寄存器有很多,本章我们只用到了其中的一部分,如表28.1.1.1所示: 寄存器地址 位 寄存器功能 描述 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:触发模式 表28.1.1.1 FT5426使用到的寄存器表 表28.1.1.1中就是本章实验我们会使用到的寄存器。关于触摸屏和FT5426的知识就讲解到这里。 28.2 硬件原理分析 本试验用到的资源如下: ①、指示灯LED0。 ②、 RGB LCD屏幕。 ③、触摸屏 ④、串口 触摸屏是和RGB LCD屏幕做在一起的,所以触摸屏也在RGB LCD接口上,都是连接在I.MX6U-ALPHA开发板底板上,原理图如图28.2.1所示: 在这里插入图片描述

图28.2.1 触摸屏原理图 从图28.2.1可以看出,触摸屏连接着I.MX6U的I2C2,INT引脚连接着I.MX6U的GPIO1_IO9,RST引脚连接着I.MX6U的SNVS_TAMPER9。在本章实验中使用中断方式读取触摸点个数和触摸点坐标数据,并且将其显示在LCD上。 28.3 实验程序编写 本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 19_touchscreen。 本章实验在上一章例程的基础上完成,更改工程名字为“touchscreen”,然后在bsp文件夹下创建名为“touchscreen”的文件。在bsp/ touchscreen中新建bsp_ft5xx6.c和bsp_ft5xx6.h这两个文件,在bsp_ft5xx6.h中输入如下内容:

示例代码28.3.1 bsp_ft5xx6.h文件代码 1 #ifndef _FT5XX6_H 2 #define _FT5XX6_H 3 /*************************************************************** 4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 5 文件名 : bsp_ft5xx6.h 6 作者 : 左忠凯 7 版本 : V1.0 8 描述 : 触摸屏驱动头文件,触摸芯片为FT5xx6, 9 包括FT5426和FT5406。 10 其他 : 无 11 论坛 : www.openedv.com 12 日志 : 初版V1.0 2019/1/21 左忠凯创建 13 ***************************************************************/ 14 #include "imx6ul.h" 15 #include "bsp_gpio.h" 16 17 /* 宏定义 */ 18 #define FT5426_ADDR 0X38 /* FT5426设备地址 */ 19 20 #define FT5426_DEVICE_MODE 0X00 /* 模式寄存器 */ 21 #define FT5426_IDGLIB_VERSION 0XA1 /* 固件版本寄存器 */ 22 #define FT5426_IDG_MODE 0XA4 /* 中断模式 */ 23 #define FT5426_TD_STATUS 0X02 /* 触摸状态寄存器 */ 24 #define FT5426_TOUCH1_XH 0X03 /* 触摸点坐标寄存器, 25 * 一个触摸点用4个寄存器*/ 26 27 #define FT5426_XYCOORDREG_NUM 30 /* 触摸点坐标寄存器数量 */ 28 #define FT5426_INIT_FINISHED 1 /* 触摸屏初始化完成 */ 29 #define FT5426_INIT_NOTFINISHED 0 /* 触摸屏初始化未完成 */ 30 31 #define FT5426_TOUCH_EVENT_DOWN 0x00 /* 按下 */ 32 #define FT5426_TOUCH_EVENT_UP 0x01 /* 释放 */ 33 #define FT5426_TOUCH_EVENT_ON 0x02 /* 接触 */ 34 #define FT5426_TOUCH_EVENT_RESERVED 0x03 /* 没有事件 */ 35 36 /* 触摸屏结构体 */ 37 struct ft5426_dev_struc 38 { 39 unsigned char initfalg; /* 触摸屏初始化状态 */ 40 unsigned char intflag; /* 标记中断有没有发生 */ 41 unsigned char point_num; /* 触摸点 */ 42 unsigned short x[5]; /* X轴坐标 */ 43 unsigned short y[5]; /* Y轴坐标 */ 44 }; 45 46 extern struct ft5426_dev_struc ft5426_dev; 47 48 /* 函数声明 */ 49 void ft5426_init(void); 50 51 void gpio1_io9_irqhandler(void); 52 unsigned char ft5426_write_byte(unsigned char addr, unsigned char reg, unsigned char data); 53 unsigned char ft5426_read_byte(unsigned char addr, unsigned char reg); 54 void ft5426_read_len(unsigned char addr,unsigned char reg, unsigned char len,unsigned char *buf); 55 void ft5426_read_tpnum(void); 56 void ft5426_read_tpcoord(void); 57 #endif 文件bsp_ft5xx6.h文件中先是定义了FT5426的设备地址、寄存器地址和一些触摸点状态宏,然后在第37行定义了一个结构体ft5426_dev_struc,此结构体用来保存触摸信息,最后就是一些函数声明。接下来在bsp_ft5xx6.c中输入如下所示内容:

示例代码28.3.2 bsp_ft5xx6.c文件代码

/*************************************************************** Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 文件名 : bsp_ft5xx6.c 作者 : 左忠凯 版本 : V1.0 描述 : 触摸屏驱动文件,触摸芯片为FT5xx6, 包括FT5426和FT5406。 其他 : 无 论坛 : www.openedv.com 日志 : 初版V1.0 2019/1/21 左忠凯创建 ***************************************************************/ 1 #include "bsp_ft5xx6.h" 2 #include "bsp_i2c.h" 3 #include "bsp_int.h" 4 #include "bsp_delay.h" 5 #include "stdio.h" 6 7 struct ft5426_dev_struc ft5426_dev; 8 9 /* 10 * @description : 初始化触摸屏,其实就是初始化FT5426 11 * @param : 无 12 * @return : 无 13 */ 14 void ft5426_init(void) 15 { 16 unsigned char reg_value[2]; 17 18 ft5426_dev.initfalg = FT5426_INIT_NOTFINISHED; 19 20 /* 1、初始化IIC2 IO 21 * I2C2_SCL -> UART5_TXD 22 * I2C2_SDA -> UART5_RXD 23 */ 24 IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL, 1); 25 IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA, 1); 26 IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL, 0x70B0); 27 IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA, 0X70B0); 28 29 /* 2、初始化触摸屏中断IO和复位IO */ 30 gpio_pin_config_t ctintpin_config; 31 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0); 32 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0); 33 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xF080); 34 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0X10B0); 35 36 /* 中断IO初始化 */ 37 ctintpin_config.direction = kGPIO_DigitalInput; 38 ctintpin_config.interruptMode = kGPIO_IntRisingOrFallingEdge; 39 gpio_init(GPIO1, 9, &ctintpin_config); 40 41 GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn); /* 使能GIC中对应的中断 */ 42 system_register_irqhandler(GPIO1_Combined_0_15_IRQn, (system_irq_handler_t)gpio1_io9_irqhandler, NULL); /* 注册中断服务函数 */ 43 gpio_enableint(GPIO1, 9); /* 使能GPIO1_IO09的中断功能 */ 44 45 /* 复位IO初始化 */ 46 ctintpin_config.direction=kGPIO_DigitalOutput; 47 ctintpin_config.interruptMode=kGPIO_NoIntmode; 48 ctintpin_config.outputLogic=1; 49 gpio_init(GPIO5, 9, &ctintpin_config); 50 51 /* 3、初始化I2C */ 52 i2c_init(I2C2); 53 54 /* 4、初始化FT5426 */ 55 gpio_pinwrite(GPIO5, 9, 0); /* 复位FT5426 */ 56 delayms(20); 57 gpio_pinwrite(GPIO5, 9, 1); /* 停止复位FT5426 */ 58 delayms(20); 59 ft5426_write_byte(FT5426_ADDR, FT5426_DEVICE_MODE, 0); 60 ft5426_write_byte(FT5426_ADDR, FT5426_IDG_MODE, 1); 61 ft5426_read_len(FT5426_ADDR, FT5426_IDGLIB_VERSION, 2, reg_value); 62 printf("Touch Frimware Version:%#X\r\n", ((unsigned short)reg_value[0]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3