资讯详情

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

目录

  • 触摸屏
    • 组成
    • 检测原理
  • GT1151Q芯片
    • 简介
    • 寄存器
      • 控制寄存器(0x8040)
      • 状态寄存器(0x814E)
      • 坐标寄存器(0x8150 ~ 0x819D)
  • 核心代码

一般LCD将触摸屏组合起来扩展相应的功能,这里要注意触摸屏和LCD前者用于收集用户的触摸信息,后者用于显示。人机交互实际上是单片机通过触摸屏收集触摸信息后的触摸信息LCD上显示。以下是触摸屏的原理及相应触摸屏驱动芯片的作用。

触摸屏

组成

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

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

检测原理

根据检测原理,触摸屏可分为交互电容式和自我电容式。交互电容式触摸屏ITO层XY两组电极相互结合形成电容,而自电容式触摸屏两组电极与地形成电容,结构上的差异也导致检测方法的差异,本文介绍了交互式电容式触摸屏的检测方法。 交互式电容触摸屏ITO层XY轴之间的电容位置代表了触摸屏的实际坐标,可以通过检测电容的充电时间来确定手指是否按下,类似于电容按钮的原理。在检测触点坐标时,第一个X轴的电极发出激励信号,所有Y轴的电极接收信号可以通过检测交互电容器的充电时间来检测每个Y轴和第一个X轴交叉的交互电容器的大小。然后每个X轴依次发出激励信号,Y轴重复上述步骤,根据触摸屏电容变化的二维数据表,了解触摸点的坐标。

GT1151Q芯片

简介

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

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

GT1151Q芯片的引脚大多与触摸屏连接,用于输出触摸驱动信号和获取触摸模拟信号。只有四个引脚连接到开发板,即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配置起始地址寄存器 span class="token directive-hash">#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;  //无效值
    }
  }
}

标签: gd8216电容器设备数字电阻屏

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台