- /***********************************************************************************************************************
- ----------------------------------------------------------------[文件信息]------
- ---文 件 名: GT316L.c
- ---功能描述: GT316L触摸芯片功能驱动
- ---版本信息: V1.0
- ---创建信息: A&T 12.13
- ---备 注: 请保持整洁风格,如遇问题,欢迎@Awen 探讨沟通
- ----------------------------------------------------------------[修改记录]------
- ---修改人/时间: Awen 2018.2.6
- ---发布版本: V1.0
- ---修改内容: 驱动更新整理,增加硬件设计注意点和IIC协议说明
- ----------------------------------------------------------------[移植步骤]------
- 第一步:配置 GT316L 设备地址,具体根据CTRL状态配置
- (1) 若 CTRL -> GND 则 #define GT316L_ADDR 0xB0
- (2) 若 CTRL -> VCC 则 #define GT316L_ADDR 0xB2
- 第二步:配置通信用GPIO口(IIC和中断输入INT),如下是针对GPIO模拟IIC通信操作的配置,具体根据实际硬件来设置
- (1)INT中断输出配置: GT316L输出信号连接到MCU中断口,需要根据硬件设计配置对应IO口;
- (2)IIC 端口配置
- #define _IIC_PORT GPIOC
- #define _IIC_SCL_GPIO_PIN GPIO_Pin_1 //SCL配置脚
- #define _IIC_SDA_GPIO_PIN GPIO_Pin_0 //SDA数据脚
- (3)IIC 端口初始化宏定义
- #define IIC_SCL_OUT_INT() GPIO_Init(_IIC_PORT,_IIC_SCL_GPIO_PIN, GPIO_Mode_Out_PP_High_Slow) //初始化为高电平输出
- #define IIC_SDA_OUT_INT() GPIO_Init(_IIC_PORT,_IIC_SDA_GPIO_PIN,GPIO_Mode_Out_PP_High_Slow) //初始化为高电平输出
- #define IIC_SDA_IN_INT() GPIO_Init(_IIC_PORT,_IIC_SDA_GPIO_PIN,GPIO_Mode_In_FL_No_IT)
- (4)IIC 端口输入输出宏定义
- #define IIC_SCL_L() GPIO_ResetBits(_IIC_PORT,_IIC_SCL_GPIO_PIN)
- #define IIC_SCL_H() GPIO_SetBits(_IIC_PORT,_IIC_SCL_GPIO_PIN)
- #define IIC_SDA_L() GPIO_ResetBits(_IIC_PORT,_IIC_SDA_GPIO_PIN)
- #define IIC_SDA_H() GPIO_SetBits(_IIC_PORT,_IIC_SDA_GPIO_PIN)
- #define GT316L_SDA_READ() GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)
- 第三步:参考demo函数
- (1) KCT_InitGT316L :初始化函数
- (2) KCT_GetCurrentKey :获取键值
-
- 注意点:
- (1)I2C通信时,读取指定寄存器地址数据操作时,发送完寄存器地址后,不要发送停止位,直接发送开始为,然后发送设备地址和读操作指令,然后读取数据;
- (2)芯片复位脚建议悬空,芯片内部有上拉;若接外部控制,则低电平复位,高电平工作;
- (3)芯片Ctrl脚(pin22)不能悬空,需要上拉或下拉,对应的I2C地址为0xB0或0xB2;
- (4)针对低功耗需求,建议配置Reg06=0x1C, Reg0A=0x00
- I2C协议说明:
- (1)I2C Start和Stop信号: SCL高电平时,SDA负脉冲(由高电平变为低电平)信号表示start,SDA正脉冲(由低变高)表示结束信号;
- (2)ACK和NAK信号:0-ACK,1-NAK;
- (3)数据信号:仅在SCL位低电平时,SDA信号可以根据实际情况变化;SCL高电平期间,SDA数据需要保持不变,且在SCL的正脉冲期间采集/发送SDA上的信号即为发送数据0(低电平)或1(高电平)
- GT316硬件设计注意事项:
- (1)按键和Sin脚之间的走线尽量短,线间距尽可能宽;
- (2)Pad背面不要铺地,Pad和Pad-Sin走线外围可以铺地,建议间隔距离在1mm以上;
- (3)Sin走线不要和按键点在同一个平面,要求在按键pad的底面;并且远离LED等阻抗变化大的线路
- (4)芯片供电不要与电机、喇叭等纹波较大的电流公用,建议单独供电,或者与功耗稳定/较低的器件共用LDO输出
- (5)芯片RIN脚电容可以降低环境干扰,但是Rin和电容间走线要求尽量短,否则可能造成触摸检测失败;该电容选择的容值,以各触摸点上的电容值均值为参考,尽量选择相同;
- (6)Sin上的对地电容不宜过大,过大的电容会使按键灵敏度降低
- (7)没有用到的触摸通道,建议关闭,具体配置为输出模式;
- (8)Sin和Pad之间串联电阻,阻值必须小于1k,并且建议尽量接近Sin脚
- **************************************************************************************/
- #include "stm8l15x.h"
- #include "GT316L.h"
- /*******************************************************************************
- ---函数:void DelayUs(unsigned int us)
- ---功能:微秒延时函数
- ---输入:us-延时的微秒数
- ---输出:无
- ---备注:
- *************************************************/
- void DelayUs(unsigned int us)
- {
- while(us > 0)
- {
- us --;
- __no_operation();
- __no_operation();
- __no_operation();
- __no_operation();
- __no_operation();
- __no_operation();
- __no_operation();
- __no_operation();
- __no_operation();
- }
- }
- /*******************************************************************************
- ---函数:void I2C_Start(void)
- ---功能:启动I2C传输
- ---输入:无
- ---输出:无
- ---备注:
- *************************************************/
- void I2C_Start(void)
- {
- IIC_SDA_OUT_INT();
- IIC_SCL_H();
-
- IIC_SDA_H();
- DelayUs(IIC_bDELAY_CNT);
- IIC_SDA_L();
- DelayUs(IIC_bDELAY_CNT);
- IIC_SCL_L();
- DelayUs(IIC_bDELAY_CNT);
- }
- /*******************************************************************************
- ---函数:void I2C_Stop(void)
- ---功能:停止数据传输
- ---输入:无
- ---输出:无
- ---备注:
- *************************************************/
- void I2C_Stop(void)
- {
- IIC_SDA_OUT_INT();
- IIC_SDA_L();
- IIC_SCL_L();
- DelayUs(IIC_bDELAY_CNT);
- IIC_SCL_H();
- DelayUs(IIC_bDELAY_CNT);
- IIC_SDA_H();
- }
- /*******************************************************************************
- ---函数:void I2C_SendAck(u8 bAck)
- ---功能:Host发送应答信号,
- ---输入:bAck = 1:NACK;
- = 0 :ACK;
- ---输出:
- ---备注:Host读取数据时,在最后一个字节后回Nack来结束数据传输;写数据时直接发送Stop信号
- *************************************************/
- void I2C_SendAck(u8 bAck)
- {
- IIC_SDA_OUT_INT();
- if(bAck)
- IIC_SDA_H(); //NAK
- else
- IIC_SDA_L(); //ACK
-
- DelayUs(IIC_bDELAY_CNT);
- IIC_SCL_H();
- DelayUs(IIC_bDELAY_CNT);
- IIC_SCL_L();
- DelayUs(IIC_bDELAY_CNT);
- }
- /*******************************************************************************
- ---函数:unsigned char I2C_WaitAck(void)
- ---功能:I2C通信应答机制
- ---输入:
- ---输出:0 -返回ACK; 1-返回NACK(通信结束或失败)
- ---备注:
- *************************************************/
- unsigned char I2C_WaitAck(void)
- {
- IIC_SDA_IN_INT();
- if(GT316L_SDA_READ())
- {
- IIC_SCL_L();
- DelayUs(IIC_bDELAY_CNT);
- return IIC_NAK;
- }
- IIC_SCL_L();
- DelayUs(IIC_bWRSP_CNT);
- return IIC_ACK;
- }
- /*******************************************************************************
- ---函数:void I2C_Write(unsigned char Buf)
- ---功能:GPIO模拟I2C发送1字节数据,不包括启动和结束位
- ---输入:Buf-待写数据
- ---输出:
- ---备注:
- *************************************************/
- void I2C_Write(unsigned char Buf)
- {
- unsigned char i;
- IIC_SDA_OUT_INT();
- for (i= 0 ; i< 8; i++)
- {
- if (Buf & 0x80) // write data
- {
- IIC_SDA_H();
- }
- else
- {
- IIC_SDA_L();
- }
- IIC_SCL_H();
- DelayUs(IIC_bDELAY_CNT);
- IIC_SCL_L();
- DelayUs(IIC_bDLOW_CNT);
- Buf <<= 1;
- }
- IIC_SDA_H();
- IIC_SCL_H();
- }
- /*******************************************************************************
- ---函数:unsigned char I2C_Read(void)
- ---功能:GPIO模拟I2C接收1字节数据,不包括启动和结束位
- ---输入:无
- ---输出:收到的数据
- ---备注:
- *************************************************/
- unsigned char I2C_Read(void)
- {
- unsigned char TempBuff=0;
- unsigned char i;
-
- IIC_SDA_IN_INT();
- IIC_SCL_L();
- for (i=0; i<8; i++)
- {
- TempBuff <<= 1;
-
- IIC_SCL_H();
- DelayUs(IIC_bDELAY_CNT);
-
- if (GT316L_SDA_READ())
- {
- TempBuff |= 0x01;
- }
- else
- {
- TempBuff &= 0xfe;
- }
- IIC_SCL_L();
- }
- IIC_SDA_OUT_INT();
- return TempBuff;
- }
- /*******************************************************************************
- ---函数:bool GT316L_WriteDatas(unsigned char *buf,unsigned char len)
- ---功能:往GT316L连续写指定长度的数据
- ---输入:buf[0] = 待写入数据的起始地址, buf[1]...=待写数据 len=待写数据长度
- ---输出:bool : 0 - 写入失败 1 - 写入成功 ;
- ---备注:
- *************************************************/
- bool GT316L_WriteDatas(unsigned char *buf,unsigned char len)
- {
- I2C_Start();
- I2C_Write(GT316L_ADDR);
- if(I2C_WaitAck())
- return FALSE;
-
- while(len--) //不断往从设备写数据,第一个字节存放的是地址信息
- {
- I2C_Write(*buf);
- if(I2C_WaitAck()) return FALSE;
- buf++;
- }
- I2C_Stop();
- return TRUE;
- }
- /*******************************************************************************
- ---函数:unsigned char GT316L_ReadDatas(unsigned char Reg,unsigned char *Buf,unsigned char len)
- ---功能:从指定地址开始读取指定长度的数据
- ---输入:Reg-寄存器起始地址 len-数据读取长度
- ---输出:Buf-读取数据存储位置
- ---备注:
- *************************************************/
- unsigned char GT316L_ReadDatas(unsigned char Reg,unsigned char *Buf,unsigned char len)
- {
- unsigned int times;
- I2C_Start();
-
- I2C_Write(GT316L_ADDR); //发送写器件ID
- if(I2C_WaitAck()) goto Ext;
-
- I2C_Write(Reg); //再发送子地址
- if(I2C_WaitAck()) goto Ext;
-
- I2C_Start(); //不需要在前面加结束
- I2C_Write(GT316L_ADDR|0x01);
- if(I2C_WaitAck()) goto Ext;
-
- for(times=0;times<len;times++)
- {
- *Buf = I2C_Read();
- if(times==(len-1))
- I2C_SendAck(1); // NAck = 1
- else
- I2C_SendAck(0); // Ack = 0
-
- Buf++;
- }
- I2C_Stop();
- return TRUE;
-
- Ext:
- I2C_Stop();
- return FALSE;
- }
- /*******************************************************************************
- ---函数:unsigned char GT316L_Write_Byte(unsigned char WriteAddr,unsigned char WriteData)
- ---功能:向寄存器写入1字节数据
- ---输入: WriteAddr - 寄存器地址
- WriteData - 待写字节
- ---输出:0 - 操作失败, 1 - 操作成功
- ---备注:
- *************************************************/
- unsigned char GT316L_Write_Byte(unsigned char WriteAddr,unsigned char WriteData)
- {
- unsigned char buf[2] = {0};
-
- buf[0] = WriteAddr;
- buf[1] = WriteData;
- return GT316L_WriteDatas(buf,2);
- }
- /*******************************************************************************
- ---函数:unsigned char KCT_InitGT316Lnit(void)
- ---功能:初始化GT316L寄存器
- ---输入:无
- ---输出:初始化结果: 1-成功, 0-失败
- ---备注:
- *************************************************/
- unsigned char KCT_InitGT316L(void)
- {
- unsigned char i=0;
- I2C_Start();
- I2C_Write(GT316L_ADDR);
- if(I2C_WaitAck()) goto Ext;
-
- if(GT316L_Write_Byte(0x04, 0xff)==FALSE) goto Ext; //配置为模拟输入
- if(GT316L_Write_Byte(0x05, 0xff)==FALSE) goto Ext; //配置为模拟输入
- if(GT316L_Write_Byte(0x06, 0x1C)==FALSE) goto Ext; //b7-0工作,1待机; b6-0单点,1多点;b5-PWM 0关闭1使能;b4-INT模式 0脉冲式,1电平式; b3-0:待机下的扫描间隔时间
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
GT316L.7z
(4.41 KB, 下载次数: 31)
|