GT911电容触摸屏使用[通俗易懂]

GT911电容触摸屏使用[通俗易懂]一、介绍与硬件连接GT911、GT928、GT9147都属于GT9系列非单层多点触控芯片,他们支持的触控点数不同(GT928支持10个点、GT911支持5个点)、驱动和感应通道也可能不同。可是他们的寄存器和IIC通讯时序是相同的,也就是说驱动程序是兼容的。与主机的接口共有6PIN,分别为:VDD、GND、SCL、SDA、INT、RESET。INT、RESET不需要接上下拉电阻,可与主机直连。SCL、SDA需要接上拉电阻4.7K,毕竟400KHz的通信频率,没有上拉可能导致SCL、SDA边沿不够陡峭。R

大家好,又见面了,我是你们的朋友全栈君。

注:转载于https://blog.csdn.net/qlexcel/article/details/99696108
一、介绍与硬件连接
GT911、GT928、GT9147都属于GT9系列非单层多点触控芯片,他们支持的触控点数不同(GT928支持10个点、GT911支持5个点)、驱动和感应通道也可能不同。可是他们的寄存器和IIC通讯时序是相同的,也就是说驱动程序是兼容的。
与主机的接口共有6PIN,分别为:VDD、GND、SCL、SDA、INT、RESET。INT、RESET不需要接上下拉电阻,可与主机直连。SCL、SDA需要接上拉电阻4.7K,毕竟400KHz的通信频率,没有上拉可能导致SCL、SDA边沿不够陡峭。
RST是复位引脚,拉低100us以上,即可复位。正常工作时,应该保持拉高。
INT是GT9xx的触摸信号输出引脚,在正常工作时,主机端要设置为悬浮输入,即不上下拉(GT9xx的驱动能力有限,如果外部上下拉,GT9xx可能驱动不了)。当有触摸发生时,INT引脚会输出上升沿或下降沿(内部寄存器可以配置),主机端可以一直读取INT脚的电平信号,也可以用端口外部中断检测。
二、初始化
1、第一步,GT9xx的IIC地址选择

GT9 系列在通信中始终作为从设备,其I2C设备地址由7 位设备地址加1 位读写控制位组成,高7 位为地址,bit 0为读写
控制位。GT9 系列有两个从设备地址可供选择:
在这里插入图片描述
设置方法为:

把RST、INT引脚配置为输出模式。

A、把RST、INT拉低,延时10ms,把INT拉高,延时100us,把RST拉高,就可以把IIC地址设为0x28/0x29
在这里插入图片描述
B、把RST、INT拉低,延时10ms,把RST拉高,就可以把IIC地址设为0xBA/0xBB
在这里插入图片描述
2、第二步,把INT设置为悬浮输入模式(如果要用外部中断检测INT,也要在这里配置好),RST保持拉高输出。

3、第三步,更新GT9xx寄存器配置,如果不需要更新,可以直接跳过。

1)、往控制命令寄存器(0x8040)写入2,软复位GT9xx。

2)、把寄存器配置数组写入(0x8047-0x8100),一共186个寄存器,这些寄存器的功能可以查看数据手册。需要注意的是:

A,0X8047寄存器用于指示配置文件版本号,程序写入的版本号,必须大于等于GT9xx本地保存的版本号,才可以更新配置,否则当前写入配置无效。

B,0X80FF寄存器用于存储校验和,使得0X8047-0X80FF之间所有数据之和为0,如果校验不通过,当前配置无效。

C,0X8100用于控制是否将配置保存在本地,写0,则不保存配置,写1则保存配置。

3)、往控制命令寄存器(0x8040)写入0,结束软复位。

4、完成初始化过程。

三、读取触摸点坐标值

当有触摸发生时,GT9xx会有3个提示:

1、INT会输出上升沿或下降沿信号。

2、状态寄存器0x814E的最高位(buffer状态位)的值变为1,表示数据已准备好。

3、状态寄存器0x814E的低4位的值会变为触摸点个数,提示有多少个点被按下。

读完坐标后,要把0x814E寄存器清为0,表示坐标点已读。否则GT9xx会一直输出INT信号,不继续检测触摸。切记!

因此对应的,我们有3种读取方法:
1、轮询读取0x814E寄存器的值,如果最高位(buffer状态位)的值变为1,则依照低4位来读取相应个数的坐标值,读完后把0x814E寄存器清为0。如果最高位为0,则退出,继续下一次检测。

2、使用INT中断,当有触摸发生,INT输出信号触发外部中断。在中断服务程序中读取0x814E的低4位得到触摸点数,再去读取相应个数的坐标值,读完后把0x814E寄存器清为0。

3、使用IIC的DMA,因为IIC的通信频率是400K,假如只有一个触摸点,那么把这个触摸点的坐标读出来需要:S+ADR_W+ACK+Reg_H+ACK+Reg_L+ACK+E+S+ADR_R+ACK+DATA_1+ACK+DATA_2+ACK+DATA_3+ACK+DATA_4+NACK+E,一共76*1/400,190us,还没有加上检测的时间,因此直接读取IIC的效率是很低的。使用DMA的方式,只需要把数据放入、取出就可以了,时间可以缩短到几个us。具体方法是,开两个DMA通道,一个用于发送,一个用于接收。发送通道负责S+ADR_W+ACK+Reg_H+ACK+Reg_L+ACK+E,接收通道负责S+ADR_R+ACK+DATA_1+ACK+DATA_2+ACK+DATA_3+ACK+DATA_4+ACK+DATA_5+ACK+DATA_6+NACK+E,根据自己的使用情况确定好需要读取多少个坐标,比如只需要读取1个坐标点,那么从0x804E开始读6个字节就行了,读出来后根据0x804E的值来判断坐标是否有效,如果有效,这6个字节的后4位就是坐标值,取完坐标值,再通过DMA发送通道清除0x804E。
四、其他提示

1、GT9xx的触摸检测频率为100Hz,因此使用DMA或者轮询时,读取频率为100Hz就可以了,读再快也没有意义了。

2、检测触摸是否一直按着没放,需要做一下额外的处理。假如按下了一个点,一直不放,读取频率为100Hz,发生的情况如下:触摸按下后,0x814E的最高位会变为1,读取坐标后,把0x814E清为0,再去读取0x814E,0x814E的最高位会变为0,过一会儿读到的0x814E的最高位才会变为1。也就是说,读完坐标,清零0x814E后,要等一会儿触摸点才能准备好,即0x814E的最高位被清零后,要等一会儿才变为1,可是这段时间内,触摸一直是按下状态的。0x814E值的变化情况如下:

在这里插入图片描述
如果不处理的话,一直按下的状态就会变为按下放开、按下放开。。。

因此处理为:

定义按下状态变量Press_Sta,按下计数变量Press_Times。

当0x814E的最高位变为1时,Press_Sta=1表示被按下,同时Press_Times=0。

当0x814E的最高位变为0时,Press_Times++。当Press_Times>8,Press_Sta=0表示触摸放开。(8可以自己调整)

编程手册链接:https://download.csdn.net/download/qq_33822946/10753049

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150211.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(4)
blank

相关推荐

  • 手机号码正则(已测试可以)

    手机号码正则(已测试可以)

    2021年10月19日
  • vue-router beforeEach钩子

    vue-router beforeEach钩子在使用vue-routerbeforeEach钩子时,你也许会遇到如下问题:源码:router.beforeEach((to,from,next)=>{//判断登录状态简单实例varuserInfo=window.localStorage.getItem(‘token’);if(userInfo){next();…

  • 学习微机原理与接口这一篇就够了

    学习微机原理与接口这一篇就够了注意问题:由于这篇文章我是用WORD编辑的,写完以后,发现没办法转换为MD格式,所以我只能用截图的形式上传了,写这篇文章的主要目的是对微机原理与接口基础知识的一个简单梳理。…

  • sublime插件合集「建议收藏」

    sublime插件合集「建议收藏」本文系转载,原文地址:http://www.xuanfengge.com/practical-collection-of-sublime-plug-in.html版权归 轩枫阁 所有本文标题:实用的sublime插件集合–sublime推荐必备插件转载请务必注明出处,小生将不胜感激,谢谢!喜欢本文或觉得本文对您有帮助,请分享给您的朋友^_^

  • Eclipse 导入项目乱码问题(中文乱码)

    Eclipse 导入项目乱码问题(中文乱码)1.修改项目编码格式:鼠标移到项目名,右键->Properties->Resource->TextfileenCoding->更改编码(GBK、UTF-8等)->Apply->OK>退出2.修改整个Eclipse工作空间的编码Window->Preferences->General->Workspace-&gt…

  • 高并发下线程安全的单例模式(最全最经典)

    高并发下线程安全的单例模式(最全最经典)在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号