/*** *************************************************************************************** * @file touch_043.c * @version V1.0 * @date 2018-1-1 * @author 反客科技 * @brief GT9147触摸驱动 *************************************************************************************** * @description * * 实验平台:反客STM32F429核心板 + 4.3寸RGB液晶屏(屏幕型号RGB043M1) * 淘宝地址:https://shop212360197.taobao.com * QQ交流群:536665479 * >>>>> 文件说明: * * 1.触摸屏相关的操作函数 * 2.使用模拟IIC * 3.通信速度默认为100KHz * >>>>> 重要说明: * * 1.GT9147可以掉电保存配置参数,且出厂时已配置好,用户一般情况下无需再进行配置 * 2.在修改触摸配置参数之前,需要将原厂的参数读取并做好备份,以免改动关键的参数 * 3.用户修改参数之后,需要将 GT9XX_SendCfg() 函数屏蔽掉,不然频繁的写入会将触摸芯片的Flash写坏 * *************************************************************************************** ***/ #include "touch_043.h" // 触摸信息结构体,在函数 Touch_Scan() 里被调用,存储触摸数据 TouchStructure touchInfo; // 触摸参数配置数组,在函数 GT9XX_SendCfg() 里调用,用于配置触摸IC的相关参数 // 由于GT9147可以固化保存这些参数,所以用户一般情况下无需再进行配置 // 详细的寄存器功能请参考《GT9147编程指南》 // const u8 GT9XX_CFG_DATA[] = { 0XAA, // 寄存器地址:0x8047,功能:配置版本号 0XE0,0X01, // 寄存器地址:0x8048~0x8049,功能:X坐标最大值,低位在前 0X10,0X01, // 寄存器地址:0x804A~0x804B,功能:Y坐标最大值,低位在前 0X05, // 寄存器地址:0x804C,功能:设置最大触摸点数,1~5点 0X0E, // 寄存器地址:0x804D,功能:设置INT触发方式、XY坐标交换 0X00, // 该寄存器无需配置 0X88, // 寄存器地址:0x804F,功能:按下或松开去抖次数 0X0B, // 寄存器地址:0x8050,功能:原始坐标窗口滤波值 0X80,0X08,0X50,0X3C,0X0F,0X00,0X00,0X00,0XFF,0X67, // 0X8051 ~ 0X805A 0X50,0X00,0X00,0X18,0X1A,0X1E,0X14,0X89,0X28,0X0A, // 0X805B ~ 0X8064 0X30,0X2E,0XBB,0X0A,0X03,0X00,0X00,0X02,0X33,0X1D, // 0X8065 ~ 0X806E 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X32,0X00,0X00, // 0X806F ~ 0X8078 0X2A,0X1C,0X5A,0X94,0XC5,0X02,0X07,0X00,0X00,0X00, // 0X8079 ~ 0X8082 0XB5,0X1F,0X00,0X90,0X28,0X00,0X77,0X32,0X00,0X62, // 0X8083 ~ 0X808C 0X3F,0X00,0X52,0X50,0X00,0X52,0X00,0X00,0X00,0X00, // 0X808D ~ 0X8096 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, // 0X8097 ~ 0X80A0 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F, // 0X80A1 ~ 0X80AA 0X0F,0X03,0X06,0X10,0X42,0XF8,0X0F,0X14,0X00,0X00, // 0X80AB ~ 0X80B4 0X00,0X00, /****************************************************************************************** * 寄存器地址: 0x80B7~0X80C4 * 功能说明 : 修改感应通道对应的芯片通道号,可以改变触摸面板的垂直扫描方向 *******************************************************************************************/ // 0X08,0X0A,0X0C,0X0E,0X10,0X12,0X14,0X16,0X18,0X1A, // 扫描方向从 上 到 下 0X1A,0X18,0X16,0X14,0X12,0X10,0X0E,0X0C,0X0A,0X08, // 扫描方向从 下 到 上 0X00,0X00,0X00,0X00, // 未使用的感应通道,无需更改设置 /******************************************************************************************/ 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, // 无作用寄存器,无需配置 0X00,0X00,0X00,0X00,0x00,0x00, // 无作用寄存器,无需配置 /******************************************************************************************* * 寄存器地址: 0x80D5~0X80EE * 功能说明 : 修改驱动通道对应的芯片通道号,可以改变触摸面板的水平扫描方向 ********************************************************************************************/ // 0x00,0x02,0x04,0x05,0x06,0x08,0x0a,0x0c, // 扫描方向从 左 到 右 // 0x0e,0x1d,0x1e,0x1f,0x20,0x22,0x24,0x28,0x29, 0X29,0X28,0X24,0X22,0X20,0X1F,0X1E,0X1D, // 扫描方向从 右 到 左 0X0E,0X0C,0X0A,0X08,0X06,0X05,0X04,0X02,0X00, 0xff, // 未使用的驱动通道,无需更改设置 /*******************************************************************************************/ 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, // 通道调整系数寄存器,无需修改 0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, // 通道调整系数寄存器,无需修改 0XFF,0XFF,0XFF,0XFF, // 通道调整系数寄存器,无需修改 }; /***************************************************************************************** * 函 数 名: GT9XX_Reset * 入口参数: 无 * 返 回 值: 无 * 函数功能: 复位GT9147 * 说 明:复位GT9147,并将芯片的IIC地址配置为0xBA/0xBB ******************************************************************************************/ void GT9XX_Reset(void) { Touch_INT_Out(); // 将INT引脚配置为输出 // 初始化引脚状态 GPIO_ResetBits(Touch_INT_PORT,Touch_INT_PIN); // 将INT拉低 GPIO_SetBits (Touch_RST_PORT,Touch_RST_PIN); // 将RST拉高 Touch_IIC_Delay(10000); // 开始执行复位 // INT引脚保持低电平不变,将器件地址设置为0XBA/0XBB GPIO_ResetBits(Touch_RST_PORT,Touch_RST_PIN); // 拉低复位引脚,此时芯片执行复位 Touch_IIC_Delay(350000); // 延时 GPIO_SetBits (Touch_RST_PORT,Touch_RST_PIN); // 拉高复位引脚,复位结束 Touch_IIC_Delay(350000); // 延时 Touch_INT_In(); // INT引脚转为浮空输入 Touch_IIC_Delay(350000); // 延时 } /***************************************************************************************** * 函 数 名: GT9XX_WriteHandle * 入口参数: addr - 要操作的寄存器 * 返 回 值: SUCCESS - 操作成功 * ERROR - 操作失败 * 函数功能: GT9XX 写操作 * 说 明:对指定的寄存器执行写操作 ******************************************************************************************/ u8 GT9XX_WriteHandle (u16 addr) { u8 status; // 状态标志位 Touch_IIC_Start(); // 启动IIC通信 if( Touch_IIC_WriteByte(GT9XX_IIC_WADDR) == ACK_OK ) //写数据指令 { if( Touch_IIC_WriteByte((u8)(addr >> 8)) == ACK_OK ) //写入16位地址 { if( Touch_IIC_WriteByte((u8)(addr)) != ACK_OK ) { status = ERROR; // 操作失败 } } } status = SUCCESS; // 操作成功 return status; } /***************************************************************************************** * 函 数 名: GT9XX_WriteData * 入口参数: addr - 要写入的寄存器 * value - 要写入的数据 * 返 回 值: SUCCESS - 操作成功 * ERROR - 操作失败 * 函数功能: GT9XX 写一字节数据 * 说 明:对指定的寄存器写入一字节数据 ******************************************************************************************/ u8 GT9XX_WriteData (u16 addr,u8 value) { u8 status; Touch_IIC_Start(); //启动IIC通讯 if( GT9XX_WriteHandle(addr) == SUCCESS) //写入要操作的寄存器 { if (Touch_IIC_WriteByte(value) != ACK_OK) //写数据 { status = ERROR; // 写入失败 } } Touch_IIC_Stop(); // 停止通讯 status = SUCCESS; // 写入成功 return status; } /***************************************************************************************** * 函 数 名: GT9XX_WriteReg * 入口参数: addr - 要写入的寄存器区域首地址 * cnt - 数据长度 * value - 要写入的数据区 * 返 回 值: SUCCESS - 操作成功 * ERROR - 操作失败 * 函数功能: GT9XX 写寄存器 * 说 明:往芯片的寄存器区写入指定长度的数据 ******************************************************************************************/ u8 GT9XX_WriteReg (u16 addr, u8 cnt, u8 *value) { u8 status = 0; u8 i = 0; Touch_IIC_Start(); // 启动IIC通信 if( GT9XX_WriteHandle(addr) == SUCCESS) //写入要操作的寄存器 { for(i = 0 ; i < cnt; i++) // 计数 { Touch_IIC_WriteByte(value[i]); // 写入数据 } Touch_IIC_Stop(); // 停止IIC通信 status = SUCCESS; // 写入成功 } else { Touch_IIC_Stop(); // 停止IIC通信 status = ERROR; // 写入失败 } return status; } /***************************************************************************************** * 函 数 名: GT9XX_ReadReg * 入口参数: addr - 要读取的寄存器区域首地址 * cnt - 数据长度 * value - 要读取的数据区 * 返 回 值: SUCCESS - 操作成功 * ERROR - 操作失败 * 函数功能: GT9XX 读寄存器 * 说 明:从芯片的寄存器区读取指定长度的数据 ******************************************************************************************/ u8 GT9XX_ReadReg (u16 addr, u8 cnt, u8 *value) { u8 status = 0; u8 i = 0; status = ERROR; Touch_IIC_Start(); // 启动IIC通信 if( GT9XX_WriteHandle(addr) == SUCCESS) // 写入要操作的寄存器 { Touch_IIC_Start(); // 重新启动IIC通讯 if (Touch_IIC_WriteByte(GT9XX_IIC_RADDR) == ACK_OK) // 发送读命令 { for(i = 0 ; i < cnt; i++) // 计数 { if (i == (cnt - 1)) { value[i] = Touch_IIC_ReadByte(0); // 读到最后一个数据时发送 非应答信号 } else { value[i] = Touch_IIC_ReadByte(1); // 发送应答信号 } } Touch_IIC_Stop(); // 停止IIC通信 status = SUCCESS; } } Touch_IIC_Stop(); return (status); } /***************************************************************************************** * 函 数 名: GT9XX_SendCfg * 入口参数: 无 * 返 回 值:无 * 函数功能: 发送GT9147配置参数 * 说 明:由于GT9147可以掉电保存配置参数,并且出厂时已配置好,一般情况下用户无需更改, * 用户修改参数之后,需要将该函数屏蔽掉,不然频繁的写入会将触摸芯片的Flash写坏 ******************************************************************************************/ void GT9XX_SendCfg(void) { u8 GT9XX_Check[2]; u8 i=0; GT9XX_Check[1] = 1; // 配置更新标志 for(i=0;i0) ) { printf("\r\n"); } printf("0X%.2x,",GT9XX_Cfg[i]); } printf("\r\n-----------------------------------------\r\n"); } /***************************************************************************************** * 函 数 名: Touch_Init * 入口参数: 无 * 返 回 值: SUCCESS - 初始化成功 * ERROR - 错误,未检测到触摸屏 * 函数功能: 触摸IC初始化,并读取相应信息发送到串口 * 说 明: 在程序里周期性的调用该函数,用以检测触摸操作,触摸信息存储在 touchInfo 结构体 ******************************************************************************************/ u8 Touch_Init(void) { u8 GT9XX_Info[11]; // 触摸屏IC信息 u8 cfgVersion = 0; // 触摸配置版本 Touch_IIC_GPIO_Config(); // 初始化IIC引脚 GT9XX_Reset(); // GT9147 复位 // //读取GT9147配置参数,通过串口打印输出 // // 通过串口打印数据,在修改数据之前,需要将原厂的参数读取并做好备份,以免改动关键的参数 // GT9XX_ReadCfg(); // // 发送配置参数,由于GT9147可以掉电保存配置参数,一般情况下用户无需更改 // //用户修改参数之后,需要将该函数屏蔽掉,不然频繁的写入会将触摸芯片的Flash写坏 // GT9XX_SendCfg(); GT9XX_ReadReg (GT9XX_ID_ADDR,11,GT9XX_Info); // 读触摸屏IC信息 GT9XX_ReadReg (GT9XX_CFG_ADDR,1,&cfgVersion); // 读触摸配置版本 if( GT9XX_Info[0] == '9' ) // 判断第一个字符是否为 ‘9’ { // printf("Touch ID: GT%.4s \r\n",GT9XX_Info); // 打印触摸芯片的ID // printf("固件版本: 0X%.4x\r\n",(GT9XX_Info[5]<<8) + GT9XX_Info[4]); // 芯片固件版本 // printf("触摸分辨率:%d * %d\r\n",(GT9XX_Info[7]<<8) + GT9XX_Info[6],(GT9XX_Info[9]<<8) +GT9XX_Info[8]); // 当前触摸分辨率 // printf("触摸参数配置版本: 0X%.2x \r\n",cfgVersion); // 触摸配置版本 return SUCCESS; } else { // printf("未检测到触摸IC\r\n"); //错误,未检测到触摸屏 return ERROR; } } /***************************************************************************************** * 函 数 名: Touch_Scan * 入口参数: 无 * 返 回 值: 无 * 函数功能: 触摸扫描 * 说 明: 在程序里周期性的调用该函数,用以检测触摸操作,触摸信息存储在 touchInfo 结构体 ******************************************************************************************/ void Touch_Scan(void) { u8 touchData[2 + 8 * TOUCH_MAX ]; //用于存储触摸数据 u8 i = 0; GT9XX_ReadReg (GT9XX_READ_ADDR,2 + 8 * TOUCH_MAX ,touchData); //读数据 GT9XX_WriteData (GT9XX_READ_ADDR,0); // 清除触摸芯片的寄存器标志位 touchInfo.num = touchData[0] & 0x0f; // 取当前的触摸点数,若为0则代表无触摸数据发生 if ( (touchInfo.num >= 1) && (touchInfo.num <=5) ) // 当触摸数在 1-5 之间时 { for(i=0;i