以前用过电阻屏... 这电阻屏说多了都是泪. 现在用上电容屏了.
/* I2C 总线发送接收有关函数声明 */
void I2C_SendByte(uint8_t Byte );
uint8_t I2C_ReceiveByte( void );
uint8_t I2C_WaitAck( void );
void I2C_SendAck( void );
void I2C_SendNoAck( void );
/* GT9147 驱动 */
/* 参数1 16位寄存器地址,参数2:第一个数据地址,参数3:数据长度 */
uint8_t GT9147_WriteBuff(uint16_t Reg,uint8_t *pData,uint8_t Length) //返回值
0: 写成功 1:失败
{
I2C_Start();
I2C_SendByte(GT_CMD_WR);// 写地址 0x28 读 0x29
if(I2C_WaitAck())
return 1;
I2C_SendByte(Reg>>8);
if(I2C_WaitAck())
return 2;
I2C_SendByte(Reg&0xff);
if(I2C_WaitAck())
return 3;
while(Length--)
{
I2C_SendByte(*pData++);
if(I2C_WaitAck())
return 4;
}
I2C_Stop();
return 0;
}
/* 从第一个地址为Reg 的地址上接收Length 个数据 放在pData 上 0:成功 1失败 */
uint8_t GT9147_ReadBuff(uint16_t Reg,uint8_t *pData,uint8_t Length)
{
I2C_Start();
I2C_SendByte(GT_CMD_WR);
if(I2C_WaitAck())
return 1;
I2C_SendByte(Reg>>8);
if(I2C_WaitAck())
return 2;
I2C_SendByte(Reg&0xff);
if(I2C_WaitAck())
return 3;
I2C_Start();
I2C_SendByte(GT_CMD_RD);
if(I2C_WaitAck())
return 4;
while(Length--)
{
*pData=I2C_ReceiveByte();
pData++;
if(Length)
I2C_SendAck();
else
I2C_SendNoAck();
}
I2C_Stop();
return 0;
}
/* 寄存器设置表 */
const u8 GT9147_CFG_TBL[]={
0X60,0XE0,0X01,0X20,0X03,0X05,0X35,0X00,0X02,0X08,
0X1E,0X08,0X50,0X3C,0X0F,0X05,0X00,0X00,0XFF,0X67,
0X50,0X00,0X00,0X18,0X1A,0X1E,0X14,0X89,0X28,0X0A,
0X30,0X2E,0XBB,0X0A,0X03,0X00,0X00,0X02,0X33,0X1D,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X32,0X00,0X00,
0X2A,0X1C,0X5A,0X94,0XC5,0X02,0X07,0X00,0X00,0X00,
0XB5,0X1F,0X00,0X90,0X28,0X00,0X77,0X32,0X00,0X62,
0X3F,0X00,0X52,0X50,0X00,0X52,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,
0X0F,0X03,0X06,0X10,0X42,0XF8,0X0F,0X14,0X00,0X00,
0X00,0X00,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,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,
};
uint8_t GT9147_SendCFG(uint8_t Mode) // 设置寄存器
{
uint8_t Buff[2];
uint8_t Byte=0;
Buff[0]=0;
Buff[1]=Mode;
for(Byte=0;Byte<sizeof(GT9147_CFG_TBL);Byte++)
Buff[0]+=GT9147_CFG_TBL[Byte];//计算校验和
Buff[0]=(~Buff[0])+1;
GT9147_WriteBuff(GT_CFGS_REG,(u8*)GT9147_CFG_TBL,sizeof(GT9147_CFG_TBL));//发送寄存器配置
GT9147_WriteBuff(GT_CHECK_REG,Buff,2);//写入校验和,和配置更新标记
return 0;
}
#define GT_CTRL_REG 0X8040 //GT9147控制寄存器
#define GT_CFGS_REG 0X8047 //GT9147配置起始地址寄存器
#define GT_CHECK_REG 0X80FF //GT9147校验和寄存器
#define GT_PID_REG 0X8140 //GT9147产品ID寄存器
#define GT_GSTID_REG 0X814E //GT9147当前检测到的触摸情况
#define GT_TP1_REG 0X8150 //第一个触摸点数据地址
#define GT_TP2_REG 0X8158//第二个触摸点数据地址
#define GT_TP3_REG 0X8160//第三个触摸点数据地址
#define GT_TP4_REG 0X8168//第四个触摸点数据地址
#define GT_TP5_REG 0X8170//第五个触摸点数据地址
uint8_t GT9147_Init(void){
uint8_t Buff[5];
TOUCH_GPIO_Configuration();//引脚初始化 INT 上拉输入
/* 复位 */
GT9147_RST_LOW();
I2C_Delay(10000);
GT9147_RST_HIGH();
I2C_Delay(10000);
/* INT 浮空输入 */
GPIOB->MODER|=GPIO_Mode_IN<<2*1;
GPIOB->PUPDR&=(~((uint32_t)(1<<2)-1))<<2*1;
I2C_Delay(100000);
/* 读取器件ID */
GT9147_ReadBuff(GT_PID_REG,Buff,4);
Buff[4]=0;
printf("TOUCH ID=%s\n",Buff);
/* 中断初始化 */
INT_Configuration();
Buff[0]=0x02;
if(GT9147_WriteBuff(GT_CTRL_REG,Buff,1))
{
printf("xie ru cuo wu 1 \n");
return 1;
}
if(GT9147_ReadBuff(GT_CFGS_REG,Buff,1))
{
printf("du qu cuo wu \n");
}
if(Buff[0]<0X60)//默认版本比较低,需要更新flash配置
{
printf("Default Ver:%0x\n",Buff[0]);
GT9147_SendCFG(1);//更新并保存配置
}
I2C_Delay(10000);
Buff[0]=0X00;
if(GT9147_WriteBuff(GT_CTRL_REG,Buff,1))
{
printf("fu wi shi bai \n");
return 1;
}
//结束复位
return 0;
}
/* 读取坐标的时候先 读取 GT_GSTID_REG 寄存器 判断第七位是不是为1 如果是1 就有数据 否则没有数据 读取完毕的时候 要清零 3:0 位保存的值表示有多少个点同时被按下 */
|