- /***********************************************************************************************************************
- ----------------------------------------------------------------[文件信息]------
- ---文 件 名: 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)
2020-4-4 21:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|