目录

  • 多点电容触摸简介
  • 硬件原理分析
  • 实验程序编写
  • 编译下载验证
  • 编写Makefile 和链接脚本
  • 编译下载


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

多点电容触摸简介

触摸屏很早就有了,一开始是电阻触摸屏,电阻触摸屏只能单点触摸,在以前的学习机、功能机时代被广泛使用。2007 年1 月9 日苹果发布了划时代的第一代Iphone,也就是Iphone2G,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 所示:

android SurfaceView 多点触控 多点触控触摸屏_linux


android SurfaceView 多点触控 多点触控触摸屏_触摸屏_02


表28.1.1.1 中就是本章实验我们会使用到的寄存器。关于触摸屏和FT5426 的知识就讲解到这里。

硬件原理分析

本试验用到的资源如下:

①、指示灯LED0。

②、RGB LCD 屏幕。

③、触摸屏

④、串口

触摸屏是和RGB LCD 屏幕做在一起的,所以触摸屏也在RGB LCD 接口上,都是连接在I.MX6U-ALPHA 开发板底板上,原理图如图28.2.1 所示:

android SurfaceView 多点触控 多点触控触摸屏_运维_03


从图28.2.1可以看出,触摸屏连接着I.MX6U 的I2C2,INT引脚连接着I.MX6U的GPIO1_IO9,RST 引脚连接着I.MX6U 的SNVS_TAMPER9。在本章实验中使用中断方式读取触摸点个数和触摸点坐标数据,并且将其显示在LCD 上。

实验程序编写

本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 19_touchscreen。

本章实验在上一章例程的基础上完成,更改工程名字为“touchscreen”,然后在bsp 文件夹下创建名为“touchscreen”的文件。在bsp/ touchscreen 中新建bsp_ft5xx6.c 和bsp_ft5xx6.h 这两个文件,在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 作者: 左忠凯

文件bsp_ft5xx6.h 文件中先是定义了FT5426 的设备地址、寄存器地址和一些触摸点状态宏,然后在第37 行定义了一个结构体ft5426_dev_struc,此结构体用来保存触摸信息,最后就是一些函数声明。接下来在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];

文件bsp_ft5xx6.c 中有7 个函数,我们依次来看一下这7 个函数。第1 个是函数ft5426_init,此函数是ft5426 的初始化函数,此函数先初始化FT5426 所使用的I2C2 接口引脚、复位引脚和中断引脚。接下来使能了FT5426 所使用的中断,并且注册了中断处理函数,最后初始化了I2C2和FT5426。第2 个函数是gpio1_io9_irqhandler,这个是FT5426 的中断引脚中断处理函数,在
此函数中会读取FT5426 内部的触摸数据。第3 和第4 个函数分别为ft5426_write_byte 和ft5426_read_byte,函数ft5426_write_byte 用于向FT5426 的寄存器写入指定的值,函数ft5426_read_byte 用于读取FT5426 指定寄存器的值。第5 个函数是ft5426_read_len,此函数也是从FT5426 的指定寄存器读取数据,但是此函数是读取数个连续的寄存器。第6 个函数是
ft5426_read_tpnum,此函数用于获取FT5426 当前有几个触摸点有效,也就是触摸点个数。最后一个函数是ft5426_read_tpcoord,此函数就是读取FT5426 各个触摸点坐标值的。

最后在main.c 中输入如下内容:

/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名: main.c
作者: 左忠凯
版本: V1.0
描述: I.MX6U开发板裸机实验20 触摸屏实验
其他: I.MX6U-ALPHAL推荐使用正点原子-7寸LCD,此款LCD支持5点电容触摸,
本节我们就来学习如何驱动LCD上的5点电容触摸屏。
论坛: www.openedv.com
日志: 初版V1.0 2019/1/21 左忠凯创建
**************************************************************/
1 #include "bsp_clk.h"

文件main.c 第53 行调用函数ft5426_init 初始化触摸屏,也就是FT5426 这个触摸驱动IC。最后在main 函数的while 循环中不断的显示获取到的触摸点数以及对应的触摸坐标值。因为本章实验我们采用中断方式读取FT5426 的触摸数据,因此main 函数中并没有读取FT5426 的操作,只是显示触摸值。本章实验程序编写就到这里,接下来就是编译、下载和验证。

编译下载验证

编写Makefile 和链接脚本

修改Makefile 中的TARGET 为touchscreen,然后在INCDIRS 和SRCDIRS 中加入“bsp/touchscreen”,修改后的Makefile 如下:

1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= touchscreen
3
4 /* 省略掉其它代码...... */
5
6 INCDIRS := imx6ul \
7 stdio/include \
8 bsp/clk \
9 bsp/led \
10 bsp/delay \
11 bsp/beep \
12 bsp/gpio \
13 bsp/key \
14 bsp/exit \
15 bsp/int \
16 bsp/epittimer \
17 bsp/keyfilter \
18 bsp/uart \
19 bsp/lcd \
20 bsp/rtc \

第2 行修改变量TARGET 为“touchscreen”,也就是目标名称为“touchscreen”。
第25 行在变量INCDIRS 中添加触摸屏的驱动头文件(.h)路径。
第46 行在变量SRCDIRS 中添加触摸屏的驱动文件(.c)路径。
链接脚本保持不变。

编译下载

使用Make 命令编译代码,编译成功以后使用软件imxdownload 将编译完成的touchscreen.bin 文件下载到SD 卡中,命令如下:

chmod 777 imxdownload //给予imxdownload 可执行权限,一次即可
./imxdownload touchscreen.bin /dev/sdd //烧写到SD 卡中,不能烧写到/dev/sda 或sda1 设//备里面!

烧写成功以后将SD 卡插到开发板的SD 卡槽中,然后复位开发板。默认情况下LCD 界面如图28.4.2.1 所示:

android SurfaceView 多点触控 多点触控触摸屏_linux_04


当我们用手指触摸屏幕的时候就会在LCD 上显示出当前的触摸点和对应的触摸值,如图28.4.2.2 所示:

android SurfaceView 多点触控 多点触控触摸屏_运维_05


图28.4.2.2 中有5 个触摸点,每个触摸点的坐标全部显示到了LCD 屏幕上。如果移动手指的话LCD 上的触摸点坐标数据就会相应的变化。