久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
GT316L觸摸芯片驅動代碼
[打印本頁]
作者:
zbfyz
時間:
2020-4-4 19:48
標題:
GT316L觸摸芯片驅動代碼
/***********************************************************************************************************************
----------------------------------------------------------------[文件信息]------
---文 件 名: 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
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
在线观看中文字幕视频
|
激情国产在线
|
亚洲 一区
|
在线观看av网站
|
国产精久久久久久久
|
欧美日韩国产一区二区三区
|
久久亚洲国产精品
|
午夜精品久久
|
九九热re
|
欧美亚洲一级
|
毛片毛片毛片毛片毛片
|
精品视频一区二区在线观看
|
男人天堂网址
|
亚洲视频免费观看
|
日本a视频
|
一区二区中文
|
99精品视频免费观看
|
欧美成人视屏
|
国产精品一区二区三区在线
|
免费观看的av
|
99亚洲精品
|
av网站免费观看
|
91精品国产一区二区三区
|
欧美国产激情二区三区
|
日韩免费在线观看视频
|
91资源在线
|
欧美中文
|
91精品一区
|
精品久久久精品
|
一区二区高清在线观看
|
亚洲一区二区三区视频在线
|
www.婷婷
|
免费观看www7722午夜电影
|
亚洲激情一区二区三区
|
欧美亚洲国产一区
|
国产精品久久久久久婷婷天堂
|
99热视
|
日韩一区二区三区精品
|
久久一区二区三区免费
|
成年人视频在线免费观看
|
91精品国产自产在线老师啪
|