久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: GT316L觸摸芯片驅動代碼 [打印本頁]

作者: zbfyz    時間: 2020-4-4 19:48
標題: GT316L觸摸芯片驅動代碼
  1. /***********************************************************************************************************************
  2. ----------------------------------------------------------------[文件信息]------
  3. ---文 件 名: GT316L.c
  4. ---功能描述: GT316L觸摸芯片功能驅動
  5. ---版本信息: V1.0
  6. ---創建信息: A&T 12.13
  7. ---備    注: 請保持整潔風格,如遇問題,歡迎@Awen 探討溝通
  8. ----------------------------------------------------------------[修改記錄]------
  9. ---修改人/時間: Awen 2018.2.6
  10. ---發布版本: V1.0
  11. ---修改內容: 驅動更新整理,增加硬件設計注意點和IIC協議說明
  12. ----------------------------------------------------------------[移植步驟]------

  13.         第一步:配置 GT316L 設備地址,具體根據CTRL狀態配置
  14.                                 (1)  若 CTRL -> GND   則 #define GT316L_ADDR    0xB0
  15.                                 (2)  若 CTRL -> VCC   則 #define GT316L_ADDR    0xB2

  16.         第二步:配置通信用GPIO口(IIC和中斷輸入INT),如下是針對GPIO模擬IIC通信操作的配置,具體根據實際硬件來設置

  17.                (1)INT中斷輸出配置: GT316L輸出信號連接到MCU中斷口,需要根據硬件設計配置對應IO口;

  18.                (2)IIC 端口配置
  19.                         #define _IIC_PORT              GPIOC
  20.                         #define _IIC_SCL_GPIO_PIN      GPIO_Pin_1              //SCL配置腳
  21.                         #define _IIC_SDA_GPIO_PIN      GPIO_Pin_0              //SDA數據腳

  22.                (3)IIC 端口初始化宏定義
  23.                         #define IIC_SCL_OUT_INT()     GPIO_Init(_IIC_PORT,_IIC_SCL_GPIO_PIN, GPIO_Mode_Out_PP_High_Slow)      //初始化為高電平輸出           
  24.                         #define IIC_SDA_OUT_INT()     GPIO_Init(_IIC_PORT,_IIC_SDA_GPIO_PIN,GPIO_Mode_Out_PP_High_Slow)       //初始化為高電平輸出           
  25.                         #define IIC_SDA_IN_INT()      GPIO_Init(_IIC_PORT,_IIC_SDA_GPIO_PIN,GPIO_Mode_In_FL_No_IT)                                          

  26.                (4)IIC 端口輸入輸出宏定義
  27.                         #define IIC_SCL_L()           GPIO_ResetBits(_IIC_PORT,_IIC_SCL_GPIO_PIN)
  28.                         #define IIC_SCL_H()           GPIO_SetBits(_IIC_PORT,_IIC_SCL_GPIO_PIN)  

  29.                         #define IIC_SDA_L()           GPIO_ResetBits(_IIC_PORT,_IIC_SDA_GPIO_PIN)
  30.                         #define IIC_SDA_H()           GPIO_SetBits(_IIC_PORT,_IIC_SDA_GPIO_PIN)
  31.                         #define GT316L_SDA_READ()     GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)

  32.         第三步:參考demo函數
  33.                                 (1) KCT_InitGT316L       :初始化函數
  34.                                 (2) KCT_GetCurrentKey    :獲取鍵值

  35.                                        
  36.     注意點:
  37.         (1)I2C通信時,讀取指定寄存器地址數據操作時,發送完寄存器地址后,不要發送停止位,直接發送開始為,然后發送設備地址和讀操作指令,然后讀取數據;
  38.         (2)芯片復位腳建議懸空,芯片內部有上拉;若接外部控制,則低電平復位,高電平工作;
  39.         (3)芯片Ctrl腳(pin22)不能懸空,需要上拉或下拉,對應的I2C地址為0xB0或0xB2;
  40.         (4)針對低功耗需求,建議配置Reg06=0x1C, Reg0A=0x00

  41.     I2C協議說明:
  42.         (1)I2C Start和Stop信號: SCL高電平時,SDA負脈沖(由高電平變為低電平)信號表示start,SDA正脈沖(由低變高)表示結束信號;
  43.         (2)ACK和NAK信號:0-ACK,1-NAK;
  44.         (3)數據信號:僅在SCL位低電平時,SDA信號可以根據實際情況變化;SCL高電平期間,SDA數據需要保持不變,且在SCL的正脈沖期間采集/發送SDA上的信號即為發送數據0(低電平)或1(高電平)

  45.     GT316硬件設計注意事項:
  46.         (1)按鍵和Sin腳之間的走線盡量短,線間距盡可能寬;
  47.         (2)Pad背面不要鋪地,Pad和Pad-Sin走線外圍可以鋪地,建議間隔距離在1mm以上;
  48.         (3)Sin走線不要和按鍵點在同一個平面,要求在按鍵pad的底面;并且遠離LED等阻抗變化大的線路
  49.         (4)芯片供電不要與電機、喇叭等紋波較大的電流公用,建議單獨供電,或者與功耗穩定/較低的器件共用LDO輸出
  50.         (5)芯片RIN腳電容可以降低環境干擾,但是Rin和電容間走線要求盡量短,否則可能造成觸摸檢測失敗;該電容選擇的容值,以各觸摸點上的電容值均值為參考,盡量選擇相同;
  51.         (6)Sin上的對地電容不宜過大,過大的電容會使按鍵靈敏度降低
  52.         (7)沒有用到的觸摸通道,建議關閉,具體配置為輸出模式;
  53.         (8)Sin和Pad之間串聯電阻,阻值必須小于1k,并且建議盡量接近Sin腳


  54. **************************************************************************************/
  55. #include "stm8l15x.h"
  56. #include "GT316L.h"




  57. /*******************************************************************************
  58. ---函數:void DelayUs(unsigned int us)
  59. ---功能:微秒延時函數
  60. ---輸入:us-延時的微秒數
  61. ---輸出:無
  62. ---備注:
  63. *************************************************/
  64. void DelayUs(unsigned int us)
  65. {   
  66.     while(us > 0)
  67.     {
  68.         us --;
  69.         __no_operation();
  70.         __no_operation();
  71.         __no_operation();
  72.         __no_operation();
  73.         __no_operation();
  74.         __no_operation();
  75.         __no_operation();
  76.         __no_operation();
  77.         __no_operation();
  78.     }
  79. }

  80. /*******************************************************************************
  81. ---函數:void I2C_Start(void)
  82. ---功能:啟動I2C傳輸
  83. ---輸入:無
  84. ---輸出:無
  85. ---備注:
  86. *************************************************/
  87. void I2C_Start(void)
  88. {
  89.     IIC_SDA_OUT_INT();
  90.     IIC_SCL_H();
  91.    
  92.     IIC_SDA_H();
  93.     DelayUs(IIC_bDELAY_CNT);
  94.     IIC_SDA_L();
  95.     DelayUs(IIC_bDELAY_CNT);
  96.     IIC_SCL_L();
  97.     DelayUs(IIC_bDELAY_CNT);
  98. }

  99. /*******************************************************************************
  100. ---函數:void I2C_Stop(void)
  101. ---功能:停止數據傳輸
  102. ---輸入:無
  103. ---輸出:無
  104. ---備注:
  105. *************************************************/
  106. void I2C_Stop(void)
  107. {
  108.     IIC_SDA_OUT_INT();
  109.     IIC_SDA_L();
  110.     IIC_SCL_L();
  111.     DelayUs(IIC_bDELAY_CNT);
  112.     IIC_SCL_H();
  113.     DelayUs(IIC_bDELAY_CNT);
  114.     IIC_SDA_H();      
  115. }

  116. /*******************************************************************************
  117. ---函數:void I2C_SendAck(u8 bAck)
  118. ---功能:Host發送應答信號,
  119. ---輸入:bAck = 1:NACK;  
  120.               = 0 :ACK;
  121. ---輸出:
  122. ---備注:Host讀取數據時,在最后一個字節后回Nack來結束數據傳輸;寫數據時直接發送Stop信號
  123. *************************************************/
  124. void I2C_SendAck(u8 bAck)
  125. {   
  126.     IIC_SDA_OUT_INT();     
  127.     if(bAck)     
  128.         IIC_SDA_H();    //NAK
  129.     else
  130.         IIC_SDA_L();    //ACK
  131.    
  132.     DelayUs(IIC_bDELAY_CNT);      
  133.     IIC_SCL_H();   
  134.     DelayUs(IIC_bDELAY_CNT);   
  135.     IIC_SCL_L();     
  136.     DelayUs(IIC_bDELAY_CNT);
  137. }

  138. /*******************************************************************************
  139. ---函數:unsigned char I2C_WaitAck(void)
  140. ---功能:I2C通信應答機制
  141. ---輸入:
  142. ---輸出:0 -返回ACK;  1-返回NACK(通信結束或失敗)
  143. ---備注:
  144. *************************************************/
  145. unsigned char I2C_WaitAck(void)
  146. {      
  147.     IIC_SDA_IN_INT();      
  148.     if(GT316L_SDA_READ())   
  149.     {        
  150.         IIC_SCL_L();     
  151.         DelayUs(IIC_bDELAY_CNT);      
  152.         return IIC_NAK;   
  153.     }           
  154.     IIC_SCL_L();   
  155.     DelayUs(IIC_bWRSP_CNT);   
  156.     return IIC_ACK;
  157. }

  158. /*******************************************************************************
  159. ---函數:void I2C_Write(unsigned char Buf)
  160. ---功能:GPIO模擬I2C發送1字節數據,不包括啟動和結束位
  161. ---輸入:Buf-待寫數據
  162. ---輸出:
  163. ---備注:
  164. *************************************************/
  165. void I2C_Write(unsigned char Buf)
  166. {
  167.     unsigned char i;
  168.     IIC_SDA_OUT_INT();
  169.     for (i= 0 ; i< 8; i++)         
  170.     {
  171.         if (Buf & 0x80)             // write data
  172.         {
  173.             IIC_SDA_H();
  174.         }
  175.         else   
  176.         {
  177.             IIC_SDA_L();
  178.         }
  179.         IIC_SCL_H();              
  180.         DelayUs(IIC_bDELAY_CNT);
  181.         IIC_SCL_L();              
  182.         DelayUs(IIC_bDLOW_CNT);
  183.         Buf <<=  1;
  184.     }     
  185.     IIC_SDA_H();
  186.     IIC_SCL_H();
  187. }

  188. /*******************************************************************************
  189. ---函數:unsigned char I2C_Read(void)
  190. ---功能:GPIO模擬I2C接收1字節數據,不包括啟動和結束位
  191. ---輸入:無
  192. ---輸出:收到的數據
  193. ---備注:
  194. *************************************************/
  195. unsigned char I2C_Read(void)
  196. {
  197.     unsigned char TempBuff=0;
  198.     unsigned char i;
  199.    
  200.     IIC_SDA_IN_INT();
  201.     IIC_SCL_L();   
  202.     for (i=0; i<8; i++)
  203.     {
  204.         TempBuff <<= 1;
  205.         
  206.         IIC_SCL_H();
  207.         DelayUs(IIC_bDELAY_CNT);
  208.         
  209.         if (GT316L_SDA_READ())
  210.         {
  211.             TempBuff |= 0x01;
  212.         }
  213.         else
  214.         {
  215.             TempBuff &= 0xfe;
  216.         }
  217.         IIC_SCL_L();               
  218.     }
  219.     IIC_SDA_OUT_INT();
  220.     return TempBuff;
  221. }

  222. /*******************************************************************************
  223. ---函數:bool GT316L_WriteDatas(unsigned char *buf,unsigned char len)
  224. ---功能:往GT316L連續寫指定長度的數據
  225. ---輸入:buf[0] = 待寫入數據的起始地址,  buf[1]...=待寫數據            len=待寫數據長度
  226. ---輸出:bool :  0 - 寫入失敗     1 - 寫入成功 ;  
  227. ---備注:
  228. *************************************************/
  229. bool GT316L_WriteDatas(unsigned char *buf,unsigned char len)
  230. {
  231.     I2C_Start();
  232.     I2C_Write(GT316L_ADDR);
  233.     if(I2C_WaitAck())
  234.         return FALSE;
  235.    
  236.     while(len--)            //不斷往從設備寫數據,第一個字節存放的是地址信息
  237.     {
  238.         I2C_Write(*buf);
  239.         if(I2C_WaitAck()) return FALSE;
  240.         buf++;
  241.     }
  242.     I2C_Stop();
  243.     return TRUE;
  244. }

  245. /*******************************************************************************
  246. ---函數:unsigned char GT316L_ReadDatas(unsigned char Reg,unsigned char *Buf,unsigned char len)
  247. ---功能:從指定地址開始讀取指定長度的數據
  248. ---輸入:Reg-寄存器起始地址          len-數據讀取長度
  249. ---輸出:Buf-讀取數據存儲位置            
  250. ---備注:
  251. *************************************************/
  252. unsigned char GT316L_ReadDatas(unsigned char Reg,unsigned char *Buf,unsigned char len)
  253. {
  254.     unsigned int times;
  255.     I2C_Start();
  256.    
  257.     I2C_Write(GT316L_ADDR);                 //發送寫器件ID
  258.     if(I2C_WaitAck()) goto Ext;
  259.    
  260.     I2C_Write(Reg);                    //再發送子地址
  261.     if(I2C_WaitAck()) goto Ext;
  262.    
  263.     I2C_Start();                        //不需要在前面加結束
  264.     I2C_Write(GT316L_ADDR|0x01);
  265.     if(I2C_WaitAck()) goto Ext;
  266.    
  267.     for(times=0;times<len;times++)  
  268.     {        
  269.         *Buf = I2C_Read();
  270.         if(times==(len-1))  
  271.             I2C_SendAck(1);     // NAck = 1         
  272.         else     
  273.             I2C_SendAck(0);     // Ack = 0
  274.         
  275.         Buf++;
  276.     }
  277.     I2C_Stop();
  278.     return TRUE;
  279.    
  280. Ext:
  281.     I2C_Stop();
  282.     return FALSE;   
  283. }

  284. /*******************************************************************************
  285. ---函數:unsigned char GT316L_Write_Byte(unsigned char WriteAddr,unsigned char WriteData)
  286. ---功能:向寄存器寫入1字節數據
  287. ---輸入:   WriteAddr  - 寄存器地址
  288.             WriteData  - 待寫字節
  289. ---輸出:0 - 操作失敗,  1 - 操作成功
  290. ---備注:
  291. *************************************************/
  292. unsigned char GT316L_Write_Byte(unsigned char WriteAddr,unsigned char WriteData)
  293. {   
  294.     unsigned char buf[2] = {0};
  295.    
  296.     buf[0] = WriteAddr;
  297.     buf[1] = WriteData;

  298.     return GT316L_WriteDatas(buf,2);
  299. }

  300. /*******************************************************************************
  301. ---函數:unsigned char  KCT_InitGT316Lnit(void)
  302. ---功能:初始化GT316L寄存器
  303. ---輸入:無
  304. ---輸出:初始化結果: 1-成功, 0-失敗
  305. ---備注:
  306. *************************************************/
  307. unsigned char  KCT_InitGT316L(void)
  308. {
  309.     unsigned char i=0;
  310.     I2C_Start();
  311.     I2C_Write(GT316L_ADDR);
  312.     if(I2C_WaitAck())                                  goto Ext;
  313.    
  314.     if(GT316L_Write_Byte(0x04, 0xff)==FALSE)           goto Ext;    //配置為模擬輸入
  315.     if(GT316L_Write_Byte(0x05, 0xff)==FALSE)           goto Ext;    //配置為模擬輸入
  316.     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:待機下的掃描間隔時間
  317. ……………………

  318. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
GT316L.7z (4.41 KB, 下載次數: 31)





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 在线观看中文字幕视频 | 激情国产在线 | 亚洲 一区 | 在线观看av网站 | 国产精久久久久久久 | 欧美日韩国产一区二区三区 | 久久亚洲国产精品 | 午夜精品久久 | 九九热re | 欧美亚洲一级 | 毛片毛片毛片毛片毛片 | 精品视频一区二区在线观看 | 男人天堂网址 | 亚洲视频免费观看 | 日本a视频| 一区二区中文 | 99精品视频免费观看 | 欧美成人视屏 | 国产精品一区二区三区在线 | 免费观看的av| 99亚洲精品 | av网站免费观看 | 91精品国产一区二区三区 | 欧美国产激情二区三区 | 日韩免费在线观看视频 | 91资源在线 | 欧美中文| 91精品一区| 精品久久久精品 | 一区二区高清在线观看 | 亚洲一区二区三区视频在线 | www.婷婷| 免费观看www7722午夜电影 | 亚洲激情一区二区三区 | 欧美亚洲国产一区 | 国产精品久久久久久婷婷天堂 | 99热视 | 日韩一区二区三区精品 | 久久一区二区三区免费 | 成年人视频在线免费观看 | 91精品国产自产在线老师啪 |