412 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			412 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/***
							 | 
						|||
| 
								 | 
							
									***************************************************************************************
							 | 
						|||
| 
								 | 
							
									*	@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;i<sizeof(GT9XX_CFG_DATA);i++)
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										GT9XX_Check[0] += GT9XX_CFG_DATA[i];	//计算校验和
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								   GT9XX_Check [0] = (~GT9XX_Check[0])+1;		
							 | 
						|||
| 
								 | 
							
									
							 | 
						|||
| 
								 | 
							
									GT9XX_WriteReg(0X8047,sizeof(GT9XX_CFG_DATA),(u8*)GT9XX_CFG_DATA);	//	发送寄存器配置
							 | 
						|||
| 
								 | 
							
									GT9XX_WriteReg(0X80FF,2,GT9XX_Check); // 写入校验和,并更新配置
							 | 
						|||
| 
								 | 
							
								} 
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/*****************************************************************************************
							 | 
						|||
| 
								 | 
							
								*	函 数 名:	GT9XX_ReadCfg
							 | 
						|||
| 
								 | 
							
								*	入口参数:	无
							 | 
						|||
| 
								 | 
							
								*	返 回 值:无
							 | 
						|||
| 
								 | 
							
								*	函数功能:	读取GT9147配置参数
							 | 
						|||
| 
								 | 
							
								*	说    明:通过串口打印数据,在修改数据之前,需要将原厂的参数读取并做好备份,以免改动关键的参数		
							 | 
						|||
| 
								 | 
							
								******************************************************************************************/
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								void GT9XX_ReadCfg(void)
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									u8  GT9XX_Cfg[184];	// 数组长度取决于实际的芯片的寄存器个数
							 | 
						|||
| 
								 | 
							
									u16 i = 0;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									printf("-----------------------------------------\r\n");	
							 | 
						|||
| 
								 | 
							
									printf("读取芯片配置信息,串口打印输出\r\n");
							 | 
						|||
| 
								 | 
							
									
							 | 
						|||
| 
								 | 
							
									GT9XX_ReadReg (GT9XX_CFG_ADDR,184,GT9XX_Cfg);	// 读配置信息
							 | 
						|||
| 
								 | 
							
									for(i=0;i<184;i++)
							 | 
						|||
| 
								 | 
							
									{	
							 | 
						|||
| 
								 | 
							
										if( (i%10 == 0) && (i>0) )			
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											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<touchInfo.num;i++)		// 取相应的触摸坐标
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
								//			touchInfo.y[i] = 272-((touchData[5+8*i]<<8) | touchData[4+8*i]);	// 获取Y坐标
							 | 
						|||
| 
								 | 
							
								//			touchInfo.x[i] = 480-((touchData[3+8*i]<<8) | touchData[2+8*i]);	//	获取X坐标			
							 | 
						|||
| 
								 | 
							
											touchInfo.y[i] = ((touchData[5+8*i]<<8) | touchData[4+8*i]);	// 获取Y坐标
							 | 
						|||
| 
								 | 
							
											touchInfo.x[i] = ((touchData[3+8*i]<<8) | touchData[2+8*i]);	//	获取X坐标			
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										touchInfo.flag = 1;	// 触摸标志位置1,代表有触摸动作发生
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									else                       
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										for(i=0;i<TOUCH_MAX;i++)		// 取相应的触摸坐标
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											touchInfo.y[i] =0;	// 获取Y坐标
							 | 
						|||
| 
								 | 
							
											touchInfo.x[i] =0;	//	获取X坐标			
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										touchInfo.flag = 0;	// 触摸标志位置0,无触摸动作
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								TouchStructure *Touch_GetState(void)
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									return &touchInfo; 
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/******************************************************************************************/
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 |