GD32学习笔记(2)触摸屏驱动芯片GT1151Q

       一般LCD都会组合触摸屏以扩展相应的功能,这里要注意,触摸屏和LCD是不同的东西,前者用于收集用户的触控信息,后者用于显示。人机交互实际上是单片机通过触摸屏收集到触控信息后,根据触控在LCD上显示。下面介绍触摸屏的原理及相应触摸屏驱动芯片的作用。

触摸屏

组成

       触摸屏分为表面电容式触摸屏和投射式触摸屏。前者不透光,一般用于如笔记本电脑触控板之类的非显示领域;后者透光,一般用在手机屏幕等显示领域。投射式触摸屏实际上由三层物质组成,如下图所示:
在这里插入图片描述
       三层物质的特点如下:

名称特点作用
保护玻璃手指直接接触的地方保护内部结构
ITO层有电极组成,具有导电性和透光性用于完成触控检测的核心部件
基板具有相应接口,承上启下支撑、连接检测电路

检测原理

       触摸屏按照检测原理可以分为交互电容型和自我电容型,交互电容型触摸屏的ITO层XY两组电极之间彼此结合组成电容,而自我电容型触摸屏两组电极与地构成电容,结构上的差别也导致检测方法的差别,这里介绍一下交互电容型触摸屏检测方法。
       交互式电容触摸屏的ITO层XY轴之间的电容位置代表了触摸屏的实际坐标,检测电容的充电时间即可确定是否有手指按下,和电容按键原理类似。检测触点坐标时,第1条X轴的电极发出激励信号,所有Y轴的电极接收信号,通过检测交互电容的充电时间可检测出各条Y轴与第1条X轴相交的交互电容的大小。接着各条X轴依次发出激励信号,Y轴重复上述步骤,根据得到的触摸屏电容量变化的二维数据表,即可得知触摸点的坐标。

GT1151Q芯片

简介

       触摸屏控制芯片用于检测ITO层电极之间电容的变化,从而得到手指按压的具体坐标,同时将这些坐标和状态信息进行编码,并保存在芯片内部相应的寄存器内,供微控制器读取和调用。
       GT1151Q芯片触摸扫描频率为120Hz,检测通道有16个驱动通道和29个感应通道,两种通道分别对应ITO层的X和Y电极数,数字越大表示检测坐标的精度越高。GT1151Q最高支持10点触控,其引脚功能如下表所示:

引脚号名称功能描述
1 ~ 3DRV02 ~ DRV00触摸驱动信号输出
4DRV00模拟地
5 ~ 33SENS00 ~ SENS28触摸模拟信号输入
34AVDD28模拟电压输入
35AVDD22LDO输出
36DVDD12LDO输出
37DGND数字地
38INT中断信号
39 ~ 40Sensor_OPT1 ~ Sensor_OPT2模组识别口
41I2C_SDAI2C数据信号
42I2C_SCLI2C时钟信号
43NC
44VDDIOGPIO电平控制
45/RST系统复位脚
46 ~ 58DRV15 ~ DRV03触摸驱动信号输出

       GT1151Q芯片的大部分引脚与触摸屏连接,用于输出触摸驱动信号和获取触摸模拟信号,只有4个引脚与开发板连接,分别是INT、/RST、I2C_SCL和I2C_SDA。其中INT为中断引脚,用于检测坐标变化,/RST为复位引脚,I2C_SCL和I2C_SDA为I2C接口的时钟线和数据线。
       GT1151Q芯片使用I2C协议与微控制器进行通信,器件地址为0x14。

寄存器

       这里将要介绍一下GT1151Q芯片相应的寄存器,在相应文件可使用宏定义方便控制:

#define GT1151Q_CTRL_REG   0x8040      //GT1151Q控制寄存器
#define GT1151Q_CFGS_REG   0x8050      //GT1151Q配置起始地址寄存器
#define GT1151Q_PID_REG    0x8140      //GT1151Q产品ID寄存器

#define GT1151Q_GSTID_REG  0x814E      //GT1151Q当前检测到的触摸情况
#define GT1151Q_TP1_REG    0x8150      //第一个触摸点数据地址
#define GT1151Q_TP2_REG    0x8158      //第二个触摸点数据地址
#define GT1151Q_TP3_REG    0x8160      //第三个触摸点数据地址
#define GT1151Q_TP4_REG    0x8168      //第四个触摸点数据地址
#define GT1151Q_TP5_REG    0x8170      //第五个触摸点数据地址

//IIC设备地址(含最低位)
#define GT1151Q_DEVICE_ADDR 0x28

控制寄存器(0x8040)

       控制寄存器用于设置GT1151Q芯片完成相应的操作,具体介绍如下表:
在这里插入图片描述

状态寄存器(0x814E)

       状态寄存器用于存储当前的触点数目,具体介绍如下表,其中bit7为标志位,触点不为0时该位为1,并且不会自动清零。bit3 ~ bit0为触点数目:

在这里插入图片描述

坐标寄存器(0x8150 ~ 0x819D)

       坐标寄存器用于存储触点信息,共有60个,即每个触点通过6个寄存器存储信息,以触点1为例,如下表所示,0x8150 ~ 0x8151用于存储触点1X坐标值的低字节和高字节,0x8152 ~ 0x8153用于存储触点1Y坐标值的低字节和高字节,0x8154 ~ 0x8155用于存储触点1的宽和高:

在这里插入图片描述
       对触点坐标值的存放,可使用以下结构体:

typedef struct
{
  u16 x;    //横坐标,0xFFFF表示无效值
  u16 y;    //纵坐标,0xFFFF表示无效值
  u16 size; //触点大小
}StructTouchPoint;

核心代码

       作为核心功能为获取触点坐标的芯片,获取的数据可通过存放于以下结构体:

typedef struct
{
  u8               pointNum;                 //触摸点数,最多支持POINT_NUM_MAX个触摸点
  u8               pointFlag[POINT_NUM_MAX]; //触摸点按下标志位,1-触摸点按下,0-未检测到触摸点按下
  StructTouchPoint point[POINT_NUM_MAX];     //坐标点数据
}StructTouchDev;

       通过以下函数可获取数据(仅供参考):

void ScanGT1151Q(StructTouchDev* dev)
{
  static u16 s_arrRegAddr[5] = {GT1151Q_TP1_REG, GT1151Q_TP2_REG, GT1151Q_TP3_REG, GT1151Q_TP4_REG, GT1151Q_TP5_REG};//各个触点数据地址
  u8  regValue;
  u8  buf[6];
  u8  i;
  u16 swap;

  //读取状态寄存器
  IICCommonReadBytesEx(&s_structIICDev, GT1151Q_GSTID_REG, &regValue, 1, IIC_COMMON_NACK);//读取地址为GT1151Q_GSTID_REG,长度为1字节的数据至regValue中
  regValue = regValue & 0x0F;

  //记录触摸点个数
  dev->pointNum = regValue;

  //清除状态寄存器
  regValue = 0;
  IICCommonWriteBytesEx(&s_structIICDev, GT1151Q_GSTID_REG, &regValue, 1);

  //循环获取5个触摸点数据
  for(i = 0; i < 5; i++)
  {
    //检测到触点
    if(dev->pointNum >= (i + 1))
    {
      IICCommonReadBytesEx(&s_structIICDev, s_arrRegAddr[i], buf, 6, IIC_COMMON_NACK);
      dev->point[i].x    = (buf[1] << 8) | buf[0];
      dev->point[i].y    = (buf[3] << 8) | buf[2];
      dev->point[i].size = (buf[5] << 8) | buf[4];
      
      //横屏坐标转换
      if(1 == s_structLCDDev.dir)
      {
        swap            = dev->point[i].x;
        dev->point[i].x = dev->point[i].y;
        dev->point[i].y = swap;
        dev->point[i].x = 800 - dev->point[i].x;
      }

      //标记触摸点按下
      dev->pointFlag[i] = 1;
    }

    //未检测到触点
    else
    {
      dev->pointFlag[i] = 0;       //未检测到
      dev->point[i].x   = 0xFFFF;  //无效值
      dev->point[i].y   = 0xFFFF;  //无效值
    }
  }
}
  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值