標(biāo)題:
GT316L觸摸芯片驅(qū)動代碼
[打印本頁]
作者:
zbfyz
時間:
2020-4-4 19:48
標(biāo)題:
GT316L觸摸芯片驅(qū)動代碼
/***********************************************************************************************************************
----------------------------------------------------------------[文件信息]------
---文 件 名: GT316L.c
---功能描述: GT316L觸摸芯片功能驅(qū)動
---版本信息: V1.0
---創(chuàng)建信息: A&T 12.13
---備 注: 請保持整潔風(fēng)格,如遇問題,歡迎@Awen 探討溝通
----------------------------------------------------------------[修改記錄]------
---修改人/時間: Awen 2018.2.6
---發(fā)布版本: V1.0
---修改內(nèi)容: 驅(qū)動更新整理,增加硬件設(shè)計注意點和IIC協(xié)議說明
----------------------------------------------------------------[移植步驟]------
第一步:配置 GT316L 設(shè)備地址,具體根據(jù)CTRL狀態(tài)配置
(1) 若 CTRL -> GND 則 #define GT316L_ADDR 0xB0
(2) 若 CTRL -> VCC 則 #define GT316L_ADDR 0xB2
第二步:配置通信用GPIO口(IIC和中斷輸入INT),如下是針對GPIO模擬IIC通信操作的配置,具體根據(jù)實際硬件來設(shè)置
(1)INT中斷輸出配置: GT316L輸出信號連接到MCU中斷口,需要根據(jù)硬件設(shè)計配置對應(yīng)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數(shù)據(jù)腳
(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函數(shù)
(1) KCT_InitGT316L :初始化函數(shù)
(2) KCT_GetCurrentKey :獲取鍵值
注意點:
(1)I2C通信時,讀取指定寄存器地址數(shù)據(jù)操作時,發(fā)送完寄存器地址后,不要發(fā)送停止位,直接發(fā)送開始為,然后發(fā)送設(shè)備地址和讀操作指令,然后讀取數(shù)據(jù);
(2)芯片復(fù)位腳建議懸空,芯片內(nèi)部有上拉;若接外部控制,則低電平復(fù)位,高電平工作;
(3)芯片Ctrl腳(pin22)不能懸空,需要上拉或下拉,對應(yīng)的I2C地址為0xB0或0xB2;
(4)針對低功耗需求,建議配置Reg06=0x1C, Reg0A=0x00
I2C協(xié)議說明:
(1)I2C Start和Stop信號: SCL高電平時,SDA負(fù)脈沖(由高電平變?yōu)榈碗娖剑┬盘柋硎緎tart,SDA正脈沖(由低變高)表示結(jié)束信號;
(2)ACK和NAK信號:0-ACK,1-NAK;
(3)數(shù)據(jù)信號:僅在SCL位低電平時,SDA信號可以根據(jù)實際情況變化;SCL高電平期間,SDA數(shù)據(jù)需要保持不變,且在SCL的正脈沖期間采集/發(fā)送SDA上的信號即為發(fā)送數(shù)據(jù)0(低電平)或1(高電平)
GT316硬件設(shè)計注意事項:
(1)按鍵和Sin腳之間的走線盡量短,線間距盡可能寬;
(2)Pad背面不要鋪地,Pad和Pad-Sin走線外圍可以鋪地,建議間隔距離在1mm以上;
(3)Sin走線不要和按鍵點在同一個平面,要求在按鍵pad的底面;并且遠(yuǎn)離LED等阻抗變化大的線路
(4)芯片供電不要與電機(jī)、喇叭等紋波較大的電流公用,建議單獨供電,或者與功耗穩(wěn)定/較低的器件共用LDO輸出
(5)芯片RIN腳電容可以降低環(huán)境干擾,但是Rin和電容間走線要求盡量短,否則可能造成觸摸檢測失;該電容選擇的容值,以各觸摸點上的電容值均值為參考,盡量選擇相同;
(6)Sin上的對地電容不宜過大,過大的電容會使按鍵靈敏度降低
(7)沒有用到的觸摸通道,建議關(guān)閉,具體配置為輸出模式;
(8)Sin和Pad之間串聯(lián)電阻,阻值必須小于1k,并且建議盡量接近Sin腳
**************************************************************************************/
#include "stm8l15x.h"
#include "GT316L.h"
/*******************************************************************************
---函數(shù):void DelayUs(unsigned int us)
---功能:微秒延時函數(shù)
---輸入:us-延時的微秒數(shù)
---輸出:無
---備注:
*************************************************/
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();
}
}
/*******************************************************************************
---函數(shù):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);
}
/*******************************************************************************
---函數(shù):void I2C_Stop(void)
---功能:停止數(shù)據(jù)傳輸
---輸入:無
---輸出:無
---備注:
*************************************************/
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();
}
/*******************************************************************************
---函數(shù):void I2C_SendAck(u8 bAck)
---功能:Host發(fā)送應(yīng)答信號,
---輸入:bAck = 1:NACK;
= 0 :ACK;
---輸出:
---備注:Host讀取數(shù)據(jù)時,在最后一個字節(jié)后回Nack來結(jié)束數(shù)據(jù)傳輸;寫數(shù)據(jù)時直接發(fā)送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);
}
/*******************************************************************************
---函數(shù):unsigned char I2C_WaitAck(void)
---功能:I2C通信應(yīng)答機(jī)制
---輸入:
---輸出:0 -返回ACK; 1-返回NACK(通信結(jié)束或失。
---備注:
*************************************************/
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;
}
/*******************************************************************************
---函數(shù):void I2C_Write(unsigned char Buf)
---功能:GPIO模擬I2C發(fā)送1字節(jié)數(shù)據(jù),不包括啟動和結(jié)束位
---輸入:Buf-待寫數(shù)據(jù)
---輸出:
---備注:
*************************************************/
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();
}
/*******************************************************************************
---函數(shù):unsigned char I2C_Read(void)
---功能:GPIO模擬I2C接收1字節(jié)數(shù)據(jù),不包括啟動和結(jié)束位
---輸入:無
---輸出:收到的數(shù)據(jù)
---備注:
*************************************************/
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;
}
/*******************************************************************************
---函數(shù):bool GT316L_WriteDatas(unsigned char *buf,unsigned char len)
---功能:往GT316L連續(xù)寫指定長度的數(shù)據(jù)
---輸入:buf[0] = 待寫入數(shù)據(jù)的起始地址, buf[1]...=待寫數(shù)據(jù) len=待寫數(shù)據(jù)長度
---輸出: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--) //不斷往從設(shè)備寫數(shù)據(jù),第一個字節(jié)存放的是地址信息
{
I2C_Write(*buf);
if(I2C_WaitAck()) return FALSE;
buf++;
}
I2C_Stop();
return TRUE;
}
/*******************************************************************************
---函數(shù):unsigned char GT316L_ReadDatas(unsigned char Reg,unsigned char *Buf,unsigned char len)
---功能:從指定地址開始讀取指定長度的數(shù)據(jù)
---輸入:Reg-寄存器起始地址 len-數(shù)據(jù)讀取長度
---輸出:Buf-讀取數(shù)據(jù)存儲位置
---備注:
*************************************************/
unsigned char GT316L_ReadDatas(unsigned char Reg,unsigned char *Buf,unsigned char len)
{
unsigned int times;
I2C_Start();
I2C_Write(GT316L_ADDR); //發(fā)送寫器件ID
if(I2C_WaitAck()) goto Ext;
I2C_Write(Reg); //再發(fā)送子地址
if(I2C_WaitAck()) goto Ext;
I2C_Start(); //不需要在前面加結(jié)束
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;
}
/*******************************************************************************
---函數(shù):unsigned char GT316L_Write_Byte(unsigned char WriteAddr,unsigned char WriteData)
---功能:向寄存器寫入1字節(jié)數(shù)據(jù)
---輸入: WriteAddr - 寄存器地址
WriteData - 待寫字節(jié)
---輸出: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);
}
/*******************************************************************************
---函數(shù):unsigned char KCT_InitGT316Lnit(void)
---功能:初始化GT316L寄存器
---輸入:無
---輸出:初始化結(jié)果: 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待機(jī); b6-0單點,1多點;b5-PWM 0關(guān)閉1使能;b4-INT模式 0脈沖式,1電平式; b3-0:待機(jī)下的掃描間隔時間
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
GT316L.7z
(4.41 KB, 下載次數(shù): 31)
2020-4-4 21:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1