TTP22x是常见的电容感应式触摸按键控制器,由台湾通泰积体电路原产。TTP22x成本低廉,性能可靠,有不少应用。我在使用TTP229-BSF过程中遇到不少问题,总结如下,与大家分享。欢迎转载,但请注明出处:cnblogs.com/helesheng
一、TTP229型号及对应资料问题
TTP229后缀众多,与一般IC不同,TTP22x系列的不同后缀不仅代表不同温度等级等与功能开发关系不密切的含义,
还代表了接口的类型和功能
。从台湾通泰的官网上可以发现,目前仍然在产的型号有:
而其中最常见的
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数量。
三、TTP22x管脚配置
TTP229的功能配置管脚与按键管脚共用,使用时可以使用一个1MΩ的电阻连接到低电平,或者是悬空(悬空时是缺省配置)。借用立创开源平台上的下图电路示意一下:但开关SW1的对应位置被短路后,TTP229的对应管脚被1MΩ的电阻连接到地,从而被配置为非缺省值。
最常用的配置是TP0、TP1、TP2的配置,其含义如下:
TP0高阻抗接地(顺便猜测以下高阻抗是为了不影响触摸功能,且降低功耗),将是按键输出配置为开漏形式,用以连接不通电源电压的单片机和按键检测系统。
TP1高阻抗接地,将把同步串行输出的输出配置为高电平有效(
被按下的键对应的位,读取时输出高电平,未被按下的输出低电平
)。
TP2高阻抗接地,将使能15键。
以上配置在上电时完成
,上电后重新配置无效。
四、TTP229-BSF读取时序
由于TTP229-BSF是SPI接口的,因此
只能使用数据手册中的以下时序
。(TP2被高阻抗接地,配置为16键模式)
仔细观察后发现,
由于高低电平有效的配置不同(由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);
return(0);
1、读取GPIO数据在SCL下降沿之后。
2、每个时钟电平维持时间被配置为1us,这是为了满足TTP229手册中关于同步时钟频率不得高于512KHz的要求。
3、我不一定给出所有16个位的读取时钟,而是在读取到第一个高电平时就返回按键值。这种方法可以解决按键读取时间,但有可能造成单片机软件和TTP229的串行接口失去同步(即:在读取到某个键值退出后,再次进入读取键值程序,TTP229仍然以为软件在继续读取之前没有全部读走的后续数据)。之所以没有发生这个问题,原因是TTP229同步串行接口具有一个2ms的状态机控制,该状态机会在一次读取2ms内自动恢复初始状态(无论是否读取完成都会恢复)。
当然,这就要求我间隔2ms以上再发起读取。对于按键检测来说2ms的间隔很容易做到。
4、返回的键值将是1-16的编号,如果没有按键将返回0。
5、我使用了实时操作系统,单独开启一个任务来管理TTP229,因此直接使用了查询法(software poll)来检测是否有按键。如果使用裸机编程的朋友可以使用间隔10-100ms的定时中断来调用上面的驱动程序查询读取键值。也可以使用SDO管脚提供的DV中断功能来提示单片机读取——当然在这么做的时候仍然要注意TP1配置对信号极性和时序的影响。