天天看點

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

電容感應式觸摸按鍵控制器TTP22x使用中的一些問題

TTP22x是常見的電容感應式觸摸按鍵控制器,由台灣通泰積體電路原産。TTP22x成本低廉,性能可靠,有不少應用。我在使用TTP229-BSF過程中遇到不少問題,總結如下,與大家分享。歡迎轉載,但請注明出處:cnblogs.com/helesheng

一、TTP229型号及對應資料問題

TTP229字尾衆多,與一般IC不同,TTP22x系列的不同字尾不僅代表不同溫度等級等與功能開發關系不密切的含義,還代表了接口的類型和功能。從台灣通泰的官網上可以發現,目前仍然在産的型号有:

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

而其中最常見的TTP229-BSF的接口類型為SPI,而不是我想象的I2C!是以應下載下傳和閱讀對應的手冊《TTP229-BSF_V1.1_EN.pdf》,中文的那個手冊《TTP229_SPEC_V1.1(Simplified_Chinese)》則應注意選擇SPI接口的内容,而不是I2C的部分。

二、TTP22x輸出

TTP22x可以選擇直接管腳輸出對應按鍵狀态,或同步序列槽輸出。但以TTP229-BSF為例,它隻有8個按鍵的直接管腳輸出(直接管腳輸出使用了TP8-15這八個管腳),無法使用TTP229的全部十六個按鍵。是以建議在有單片機的系統中使用同步序列槽讀取按鍵值,可以在使用全部功能的同時解決單片機GPIO數量。

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]
觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

三、TTP22x管腳配置

TTP229的功能配置管腳與按鍵管腳共用,使用時可以使用一個1MΩ的電阻連接配接到低電平,或者是懸空(懸空時是預設配置)。借用立創開源平台上的下圖電路示意一下:但開關SW1的對應位置被短路後,TTP229的對應管腳被1MΩ的電阻連接配接到地,進而被配置為非預設值。

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

 最常用的配置是TP0、TP1、TP2的配置,其含義如下:

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

 TP0高阻抗接地(順便猜測以下高阻抗是為了不影響觸摸功能,且降低功耗),将是按鍵輸出配置為開漏形式,用以連接配接不通電源電壓的單片機和按鍵檢測系統。

TP1高阻抗接地,将把同步串行輸出的輸出配置為高電平有效(被按下的鍵對應的位,讀取時輸出高電平,未被按下的輸出低電平)。

TP2高阻抗接地,将使能15鍵。

以上配置在上電時完成,上電後重新配置無效。

四、TTP229-BSF讀取時序

由于TTP229-BSF是SPI接口的,是以隻能使用資料手冊中的以下時序。(TP2被高阻抗接地,配置為16鍵模式)

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

仔細觀察後發現,由于高低電平有效的配置不同(由TP1是否接地決定),兩種時序關系的時鐘和資料相位是相反的——而這也正是網絡上廣為流傳的大量代碼不一定能正常工作的原因。 它們的差別在于是下降沿重新整理資料,上升沿讀取;還是上升沿重新整理資料,下降沿讀取。

由于我使用了高電平有效的配置(TP1高阻抗接地),是以應該使用第一種時序。

四、TTP229-BSF讀取代碼

為配合手冊要求的第一種時序,我的代碼供大家參考:

unsigned char read_ttp229(void)//讀取TTP229按鍵值的函數
//以下函數體用于以下情形:
//TP0=1(未連接配接1MΩ下拉電阻,推挽輸出);
//TP1=0(連接配接1MΩ下拉電阻;高電平有效——按下鍵輸出高電平;且上升沿重新整理資料,下降沿讀取資料);
//TP2=0(連接配接1MΩ下拉電阻,使用16個鍵)
////注意:這個代碼并不一定會産生16個讀取時鐘,是以要保證讀取結果正确兩次調用之間要間隔2ms以上,以等待接口自動恢複初始狀态。
{
    unsigned char i;
    for(i = 0 ; i < 16 ; i++)//以下采用了手冊中BSF晶片的第一種SPI時序:上升沿重新整理資料,下降沿讀取資料
    {
        TTP229_SCL = 1;
        delay_us(1);//ttp229讀取的最大時鐘為512KHz
        TTP229_SCL = 0;
        if(TTP229_SDO != 0)
            break;
        delay_us(1);
    }
    if(i < 16)
        return(i+1);
    else
        return(0);
}          

其中:

1、讀取GPIO資料在SCL下降沿之後。

2、每個時鐘電平維持時間被配置為1us,這是為了滿足TTP229手冊中關于同步時鐘頻率不得高于512KHz的要求。

3、我不一定給出所有16個位的讀取時鐘,而是在讀取到第一個高電平時就傳回按鍵值。這種方法可以解決按鍵讀取時間,但有可能造成單片機軟體和TTP229的串行接口失去同步(即:在讀取到某個鍵值退出後,再次進入讀取鍵值程式,TTP229仍然以為軟體在繼續讀取之前沒有全部讀走的後續資料)。之是以沒有發生這個問題,原因是TTP229同步串行接口具有一個2ms的狀态機控制,該狀态機會在一次讀取2ms内自動恢複初始狀态(無論是否讀取完成都會恢複)。

觸摸按鍵控制器TTP229-BSF使用心得[原創cnblogs.com/helesheng]

 當然,這就要求我間隔2ms以上再發起讀取。對于按鍵檢測來說2ms的間隔很容易做到。

4、傳回的鍵值将是1-16的編号,如果沒有按鍵将傳回0。

5、我使用了實時作業系統,單獨開啟一個任務來管理TTP229,是以直接使用了查詢法(software poll)來檢測是否有按鍵。如果使用裸機程式設計的朋友可以使用間隔10-100ms的定時中斷來調用上面的驅動程式查詢讀取鍵值。也可以使用SDO管腳提供的DV中斷功能來提示單片機讀取——當然在這麼做的時候仍然要注意TP1配置對信号極性和時序的影響。

繼續閱讀