一、触摸IC总结
1.1台湾通泰:ttp229 16个按键(也有不同数量通道的型号)
1.2
16键IIC通道JR9016触控方案芯片概述:
JR9016是16键电容式触摸按键专用检测触摸按键。采用第二代电荷检测技术,利用操作者的手指与触摸按键焊盘之间产生电荷电平来进行检测,通过检测电荷的微小变化来确定手接近或者触摸到感应表面没有任何机械部件,不会磨损,很容易制成与周围环境密封的键盘。面板图案随心所欲,案键大小,形自由选择,字符,商标,透视窗等可以任意搭配,外形美观,时尚,而且不退色,不变形经久耐用从根本上改变了各种金属面板以及机械面板无法达到的效果。其可靠性和美观设计随意性,可以直接取代现有普通面板(金属键盘,薄膜键盘,导电胶键盘),而且给你的产品倍增活力!你的产品现有的控制程序不需要做任何改动。外围原件少,成本低,功耗少。
16键IIC通道JR9016触控方案芯片特点:
1. 触摸按键数:16个。
2. 触摸按键输出方式:IIC。
3. 工作电压:2.5-5.5V(固定电压)。
4. 超低待机功耗:10UA。
5. 灵敏度参数可以软件更改。
6. 超小封装,节省更多板材空间。
16键IIC通道JR9016触控方案芯片引脚定义:
16键IIC通道JR9016触控方案芯片引脚图:
16键IIC通道JR9016触控方案芯片原理图:
1.3
CPT212B是Silicon Labs公司推出的支持12个电容式触摸按键的触摸芯片,可以很方便的实现4*3的矩阵键盘。CPT212B高度集成化,只需要简单调整触摸参数,就可以实现触摸功能。CPT212B的触摸参数配置有两种方式,一种是通过C2接口,使用烧录器直接烧写Hex文件进行配置;一种是使用MCU通过I2C接口进行配置。
因为CPT212B需要MCU协助完成触摸按键实现具体功能,所以使用MCU配置触摸按键参数,只需要增加配置参数的程序代码,就可以省略使用烧写工具烧写配置参数的生产流程,节约生产成本。
使用MCU配置触摸按键参数,需要先把触摸按键的参数导入MCU的工程中。参数的获取可以参考世强的文章《【经验】如何配置CPT212B电容式触摸传感器固件参数?》,按照文章步骤操作,会生成一个“cpt212b_a01_gm_init.h”的头文件,将该头文件拷贝到工程中,以备程序调用。
CPT212B复位后,进入参数配置模式,此时触摸按键不会动作。如果想直接进入触摸按键传感器模式,需要通过0x8指令进行配置,指令格式如图一所示。
图1 模式切换指令
配置模式时,CPT212B的I2C从地址固定为0xC0。传感器模式时,I2C的从地址是由配置参数时配置的从地址。所以在程序中需要定义两个不同的从地址。
在配置模式时,将触摸按键参数写入CPT212B,需要通过以下步骤进行操作,且每一步操作成功,才能写入配置参数。每一条指令完成时,CPT212B会返回ACK。
1. CPT212B解锁
向I2C的0xC0地址写入0x9,0xA5,0xF1三个数据。0x9为解锁指令,0xA5和0xF1为解锁参数。参数固定不变,使用其他参数无法完成解锁操作。
2. 擦除原有配置参数
向I2C的0xC0地址写入0xA指令开始擦除参数。完成后I2C会返回ACK。
3. 写入新参数
向I2C的0xC0地址写入0xB指令写入新参数,每条指令只能写入8个字节的参数,所以要将所有参数写入CPT212B,需要重复使用0xB指令。
4. 写入CRC校验码
向I2C的0xC0地址写入0xC指令,后面带两个字节的校验码值。该校验码在“cpt212b_a01_gm_init.h”头文件中自动生成:#define CPT212B_A01_GM_DEFAULT_CONFIG_CHECKSUM (0xA95B),可以直接调用该值。
5. 验证写入正确性
向I2C的0xC0地址发送读命令,返回一个字节值。如果返回0x80,表示写入正确,成功完成参数更新;如果返回0x01,表示出现错误,未能正确写入。
整个参数写入流程的指令格式如图2所示。
图2 写入配置参数指令集
Silicon Labs公司的开发SLSTK2021上有提供CPT212B的例程,例程路径:“..\SimplicityStudio\v4\developer\sdks\8051\v4.1.5\examples\EFM8BB2_SLSTK2021A\CPT212B_Demo”,在C文件smbus.c中,有完整的配置流程代码。该例程中,CRC校验码由EFM8BB2的硬件CRC生成,许多MCU不带硬件CRC功能,可以直接调用配置头文件中的CRC校验值,省掉CRC生成函数。
1.4 EC8228
1.5 TC334B电容式触摸按键ic
1.6 APT8L16
1.7 ASC0129
1.1、台湾通泰:ttp229
一般说明
TTP229-BSF TonTouchTM IC是电容式感应设计,专为触摸板控制而设计。该设备内置调节器,用于触摸传感器。 稳定的传感方法可以覆盖多样性条件。人机界面通过非导电介电材料控制面板链路。 主要应用是专注于更换机械开关或按钮。 ASSP可以独立处理8个触摸板或最多16个触摸板。
特征
- 工作电压:2.4V~5.5V
- 内置调节器
- 待机电流
在3V,睡眠模式慢采样率8Hz:
=> 16个输入键的典型值为2.5uA
=> 8个输入键的典型2.0uA
- 提供按选项设置8个直接键或16个直接键
- 仅为8种直接输入键模式设置8个独立输出
- 具有2线串行输出接口,均可用于8和16直接输入键模式
- 8个独立输出可选择输出驱动类型(CMOS / OD / OC,有效高/低)
- 2线串行接口可选择高电平有效或低电平有效
通过选项提供多键或单键功能
- 提供两种采样率,在睡眠模式下采样速率为8Hz,快速采样率为64Hz
通过引脚选项,最大键控时间约为80秒
- 灵敏度可通过外部电容(1~50pF)调节
- 上电后约有0.5秒的稳定时间,在此期间请勿触摸键盘,所有功能均被禁用
- 自动校准环境变化
并且重新校准周期约为4.0秒,此时所有按键在固定时间内未被激活
PIN 封装布局
引脚描述
Pin No. | Pin Name | Share Pin | I/O Type | Pin Description |
1 | TP3 | SKMS1 | I/O | 触摸板输入引脚(KEY-3) 按键动作功能选项-1(单键/多键) 默认是所有单键 |
2 | TP2 | KYSEL | I/O | 触摸板输入引脚(KEY-2) 键编号功能选项(8键/ 16键) 默认为8键 |
3 | NC | | | |
4 | SENADJ0 | | I/O | 触摸板TP0~3灵敏度调整公共引脚 |
5 | TP1 | | I/O | 触摸板输入引脚(KEY-1) 输出类型功能选项(活动高/低) 对于TPQ0~7,默认为高电平有效,对于2线串行类型(SCL和SDO),低电平有效 |
6 | TP0 | | I/O | 触摸板输入引脚(KEY-0) 输出类型功能选项(8键的CMOS / OD / OC) 默认为CMOS |
7 | TP15 | | I/O/OD | 触摸板输入引脚(KEY-15) 8键直接输出引脚(TPQ7) |
8 | TP14 | | I/O/OD | 触摸板输入引脚(KEY-14) 8键直接输出引脚(TPQ6) |
9 | SENADJ3 | | I/O | 触摸板TP12~15灵敏度调整公共引脚 |
10 | TP13 | | I/O/OD | 触摸板输入引脚(KEY-13) 8键直接输出引脚(TPQ5) |
11 | TP12 | | I/O/OD | 触摸板输入引脚(KEY-12) 8键直接输出引脚(TPQ4) |
12 | SDO | | O | 2线串行输出的数据引脚,通过TP1选择低/高有效 |
13 | SCL | | I | 串行时钟输入引脚,用于串行类型,它可以通过TP1设置为低电平有效/高电平有效 |
14 | SLPSENB | | I/O | B组(TP8〜15)睡眠模式灵敏度调节引脚 |
15 | TP11 | TPQ3 | I/O/OD | 触摸板输入引脚(KEY-11) 8键直接输出引脚(TPQ3) |
16 | TP10 | TPQ2 | I/O/OD | 触摸板输入引脚(KEY-10) 8键直接输出引脚(TPQ2) |
17 | SENADJ2 | | I/O | 触摸板TP8~11灵敏度调整公共引脚 |
18 | TP9 | TPQ1 | I/O/OD | 触摸板输入引脚(KEY-9) 8键直接输出引脚(TPQ1) |
19 | TP8 | TPQ0 | I/O/OD | 触摸板输入引脚(KEY-8) 8键直接输出引脚(TPQ0) |
20 | TEST | | I-PL | 仅用于测试 |
21 | TP7 | SKSRT | I/O | 触摸板输入引脚(KEY-7) 最大键接通时间功能选项(无限/ 80秒) 默认是无限的 |
22 | TP6 | SLWPTM | I/O | 触摸板输入引脚(KEY-6) 睡眠模式采样长度功能选项(4.0 / 2.0mS) 默认值为4.0ms |
23 | SENADJ1 | | I/O | 触摸板TP4~7灵敏度调整公共引脚 |
24 | TP5 | WPSCT | I/O | 触摸板输入引脚(KEY-5) 睡眠模式下的采样率功能选项(8Hz / 64Hz) 默认值为8Hz |
25 | TP4 | SKMS0 | I/O | 触摸板输入引脚(KEY-4) 键动作功能选项-0(单键/多键) 默认是所有单键 |
26 | VDD | | P | 正电源 |
27 | VSS | | P | 负电源,接地 |
28 | SLPSENA | | I/O | A组(TP0~7)的睡眠模式灵敏度调节引脚 |
注意:引脚类型
I =>仅CMOS输入
I-PH => CMOS输入和上拉电阻
I-PL => CMOS输入和下拉电阻
O => CMOS推挽输出
I / O => CMOS I / O.
P =>电源/地
OD => CMOS开漏输出
(对于OD TPQ0~TPQ7引脚有二极管保护电路,SDA引脚没有二极管保护电路)
功能说明
1.灵敏度调整
PCB上连接线的电极尺寸和电容总负载会影响灵敏度。因此灵敏度调整必须根据PCB上的实际应用。 TTP229-BSF提供了一些调整外部灵敏度的方法。
1-1由电极尺寸决定
在其他条件下是固定的。使用更大的电极尺寸可以提高灵敏度。否则会降低灵敏度。但电极尺寸必须在有效范围内使用。
1-2按面板厚度
在其他条件下是固定的。使用更薄的面板可以提高灵敏度。否则会降低灵敏度。但面板厚度必须低于最大值。
1-3外接电容值(请参见下图1-3-1)
在其他条件下是固定的。当添加CJ0~CJ3和CJWA和CJWB的值时,将在有用范围内降低灵敏度(1pF≤CJ0~CJ3≤50pF,pF≤CJWA~CJWB≤50pF)。
当不使用任何意味着在电容器位置打开的电容器时,灵敏度最敏感。电容器CJ0~CJ3用于在操作模式下调节键的灵敏度。
电容器CJWA和CJWB用于调节睡眠模式下的唤醒灵敏度。
关于电容和控制键的关系请看下表。
电容 | 键组控制和调整 |
CJ0 | K0~K3 组 |
CJ1 | K4~K7 组 |
CJ2 | K8~K11 组 |
CJ3 | K12~K15 组 |
CJWA | K0~K7 组 |
CJWB | K8~K15 组 |
注意:使用电容值调整灵敏度时,建议先为K0~K15来调整电容CJ0~CJ3,然后调整电容CJWA和CJWB来改变唤醒灵敏度。
2.输入键编号选择
TTP229-BSF具有8键输入模式和16键输入模式。 这些模式通过连接到TP2(KYSEL)引脚和VSS的高阻值电阻选择。 TP2(KYSEL)引脚未使用电阻连接到VSS的默认选择是8键输入模式。 另一种是选择16键输入模式,它使用连接到VSS的高阻值电阻。
3.输出模式
TTP229-BSF具有8引脚直接输出模式和串行输出接口模式。 16键输入模式的输出仅提供串行输出接口。 8键输入模式有8种引脚直接输出和串行输出接口两种输出。 8针直接输出仅用于8键输入模式。
3-1在8引脚直接输出模式下,TTP229-BSF有两种输出类型:CMOS型输出和OD(漏极开路)型输出。这些由TP0(OPDEN)引脚选择。 CMOS类型输出默认为TP0(OPDEN)引脚不用于VSS的任何组件。当TP0(OPDEN)引脚使用连接到VSS的高阻值电阻时,选择OD型输出。
3-2选择8引脚直接CMOS输出模式时,输出通道可通过TP1(SAHL)引脚设置为高电平有效或低电平有效。 TP1(SAHL)引脚默认不使用高阻值电阻,它设置为高电平有效。当TP1(SAHL)引脚的高阻值电阻连接到VSS时,它被设置为低电平有效。
3-3在8引脚直接OD输出模式下,它具有OD1(漏极开路)或OC(开路集电极)输出模式,由TP1(SAHL)引脚选择。 TP1(SAHL)引脚有一个连接到VSS的高阻值电阻,它选择OC模式。 另一种是选择OD模式,没有电阻。 默认为OD模式。 OD模式的状态是浮动和低电平有效。 并且OC模式的状态是浮动且高电平有效。 OD和OC输出模式的结构请看下图。
注意:输出引脚在芯片中有二极管保护电路。 因此,当它选择OD或OC模式时。不建议连接使用不同电压的其他设备。 这避免了在系统中发生泄漏电流。
3-4在串行输出接口模式下,SDO引脚是数据输出引脚,SCL是时钟输入引脚,可通过TP1(SAHL)引脚设置为高电平有效和低电平有效。 默认为低电平有效,TP1(SAHL)引脚未使用电阻连接到VSS。 另一个是高电平有效,使用连接到VSS的高阻值电阻。
2线串行模式支持始终轮询系统上其他设备的数据。 或者其他器件可以等待TTP229-BSF通过SDO引脚输出数据有效(DV)信号,并且它可以将时钟信号提供给TTP229-BSF SCL引脚并从SDO引脚获取关键数据。
TTP229-BSF 2线串行接口支持SCL引脚的超时机制。 如果SCL引脚在2ms内没有信号边沿变化,则2线串行接口将自行复位并返回待机状态。
2线串行接口模式时序请看如下:
D0~D15对应于TP0~TP15的数据。
下图3-4-1 , 当TP1 = 0时,TP2 = 0:设置16键高电平有效
3-4-1 16个输入键和高电平有效的时序
3-4-2。 当TP1 = 1时,TP2 = 0:设置16键低电平有效
3-4-2 16个输入键和低电平有效的时序
3-4-3。 当TP1 = 0时,TP2 = 1:设置8键高电平有效
3-4-3 8个输入键和高电平有效的时序
3-4-4。 当TP1 = 1时,TP2 = 1:设置8键低电平有效
3-4-4 8个输入键和低电平有效的时序
图3-4-1~4的参数:
3-5 至于选择为I2C 通讯方式,需要将SLSERT 端口连接到VSS。
此模式下SDA 端口作为串行数据端口,SCL 作为串行时钟输入端口。SDA 和SCL 端口必须
通过外部电阻拉至高电平。
TTP229 的4 位鉴别码是“1010”, 设备地址由A0,A1 和A2 端口的状态确定。这三个端口具
有内部上拉电阻,可由外部设定为0。TTP229 的8 位设备地址包含4 位鉴别码,3 位地址选定
和R/W 位组成(参见表3-5-1)。
由于TTP229 IC 使用I2C 通讯协议方式输出触摸键(TP0~TP15 端口)的数据,因此TTP229 只接
受读操作R/W 位是”1” 的数据”。如果为“0”,TTP229 将不响应写操作。除此之外,TTP229
的I2C 通讯协议符合标准的I2C 通讯协议。它支持最大SCL 时钟频率为400KHz 的快速模式。
I2C 通讯方式协议如下:
总线空闲状态:当总线空闲时SDA 和SCL 保持在高电平。
起始条件:开始条件是当SCL=1 时,SDA 由1 跳转到0。(参见图3-5-2)
终止条件:停止条件是当SCL=1 时,SDA 由0 跳转到1。(参见图3-5-2)
数据有效条件:开始条件成立后,SDA pin 上的电平在SCL 为高电平期间内必须稳定。SDA pin
上的高低电平只有在SCL 线上时钟信号为低电平时可以改变。(参见图3-5-2)
回应(确认):一个ACK 信号表示成功完成数据传输。传输方(主设备或从设备)在传输八个二
进制位后释放总线。在主设备发出的第九个时钟周期接收方将SDA 线拉至低电平,以确认成功
接收数据的八个二进制位。从设备没有成功接收到数据的八个二进制位时,将不会发送ACK
信号。
在数据读取操作,从设备在传输完8 位数据后释放SDA 线,然后在第九个时钟周期监察ACK
信号。若检测到ACK 信号,从设备将继续传送下一个数据。若没有检测到ACK 信号,从设备
中止数据传送,并在回到待机模式前等待主设备发起停止条件。
从设备地址: TTP229 的鉴别码是“(1010)”。设备地址可由A2,A1 和A0 端口的状态设定。
读/写:从设备地址的最后一位(第八位)定义将进行的操作类型。如果R/W 位是“1”,将执
行读操作,如果是“0”,则执行写操作。但TTP229 只接受读操作。
读数据操作的顺序参照图3-5-1。
备注:Data_0:B7~B0对应TP0~TP7 闭合/断开状态,0为按键断开,1为按键闭合。
Data_1:B7~B0对应TP8~TP15 闭合/断开状态,0为按键断开,1为按键闭合。
图3-5-4. I2C总线上F/S模式设备的时序定义
4.按键操作模式
TTP229-BSF具有单键和多键功能。 这些功能由TP3(SKMS1)和TP4(SKMS0)引脚设置。 全部16个键可以使用一个组,或者16个键可以分为两组。 组-1包括TP0,TP1,TP2,TP3,TP8,TP9,TP10,TP11键。 第2组包括
TP4,TP5,TP6,TP7,TP12,TP13,TP14,TP15键。 如何设置功能? 请参见下表4-1:
表4-1。 TP3(SKMS1)和TP4(SKMS0)选项的功能
注意:
1. 一组:TP0~TP15。
二组:组-1 => TP0,TP1,TP2,TP3,TP8,TP9,TP10,TP11。
组2=> TP4,TP5,TP6,TP7,TP12,TP13,TP14,TP15。
2.使用8输入键模式时。 使用键为TP0~TP7。
3. TP3和TP4的选项状态,“0”状态使用连接到VSS的高值电阻,“1”状态不使用连接到VSS的电阻。
4.键检测在单键功能中确认,当有效触摸多个键时,优先级是按键扫描顺序(从TP0到TP15)。 这不是关键的触动力量。
5.睡眠模式下的唤醒采样率和采样长度TTP229-BSF在睡眠模式下有两种采样率。 这些是8Hz和64Hz。 这两个功能由TP5(SLWPTM)引脚选择。 TP5(SLWPTM)引脚使用连接到VSS的高阻值电阻,选择64Hz采样率。 另一个是8Hz未使用电阻连接到VSS。 8Hz采样是默认值。
而TTP229-BSF在睡眠模式下有两种采样长度。 它们是由TP6(WPSCT)引脚选择的4ms和2ms。 TP6(WPSCT)引脚未使用电阻连接到VSS,默认为4ms。 另外,TP6引脚使用连接到VSS的高阻值电阻为2ms。
睡眠模式下的唤醒采样时间和长度:
6.最大开机时间
如果某些物体覆盖在感应垫中,并且导致变化量足以被检测到。 为防止这种情况,TTP229-BSF设置一个计时器来监控检测。 计时器是最大键入时间。 在3V时设定约80秒。 当检测结束时,系统将返回上电初始状态,输出变为无效直到下一次检测。 该功能通过连接到TP7(SKSRT)引脚的高阻值电阻设置到VSS。 TP7(SKSRT)引脚没有电阻,设置禁用最大接通时间,然后按键动作无限,这是默认值。
另一个设置启用具有电阻器的最大接通时间。
如果系统需要使用最大接通时间使能和2线串行输出接口功能,它只使用始终轮询数据用于2线串行输出接口。
7.内置调节器
电容式感应触摸板IC需要稳定的电源。 所以TTP229-BSF内置在芯片中的稳压器。 它可以使内部电源保持稳定。 并且灵敏度检测对于芯片是正常的。
稳定的功率可以避免灵敏度异常和错误检测。
8.自动校准功能
TTP229-BSF包括完整的自动校准功能。 设备上电后,将首先校准环境的初始状态。 在持续时间内禁用所有功能,因此不要操作。 然后系统进入待机模式。 并且未检测到所有按键触摸超过约4秒,然后系统会自动重新校准。 该过程是固定和重复的。 通过实现此功能,系统可以捕捉环境变化的条件。 让系统运行正常。
9.从睡眠模式到操作模式的时序
9-1 误触发的时机
9-2 有效触发的时间
10.选项表
选项引脚 | 操作状态 | 特征 | 备注 | |
TP0 (OPDEN)
TP1 (SAHL) | TP0(OPDEN) | TP1(SAHL) | 8个输出引脚=> CMOS输出高电平有效 2线串行接口=> CMOS输出低电平有效 | 默认 |
1 | 1 | |||
1 | 0 | 8个输出引脚=> CMOS输出低电平有效 2线串行接口=> CMOS输出高电平有效 | | |
0 | 1 | 8个输出引脚=> OD输出有效 - 低电平 2线串行接口=> CMOS输出低电平有效 | | |
0 | 0 | 8个输出引脚=> OC输出高电平有效 2线串行接口=> CMOS输出高电平有效 | | |
TP2 (KYSEL) | 1 | 8输入键模式 | 默认 | |
0 | 16输入键模式 | | ||
TP3 (SKMS1)
TP4 (SKMS0)
| TP3 (SKMS1) | TP4 (SKMS0) | 所有单键:一组(16键) | 默认 |
1 | 1 | |||
1 | 0 | 两组操作:group-1 =>单键; group-2 =>单键 | | |
0 | 1 | 两组操作:group-1 =>单键; group-2 =>多键 | | |
0 | 0 | 所有多键:一组(16键) | | |
TP5 (WPSCT)
| 1 | 睡眠模式下唤醒的8Hz采样率 | 默认 | |
0 | 睡眠模式下唤醒的64Hz采样率 | | ||
TP6 (SLWPTM) | 1 | 唤醒采样长度=>约4.0ms | 默认 | |
0 | 唤醒采样长度=>约2.0ms | | ||
TP7 (SKSRT) | 1 | 最大开机时间禁用=>无限 | 默认 | |
0 | 最大接通时间启用=>约80秒 | |
注:1. 关于group-1和group-2的组合,请参见上述第4点。
2.选项状态“1”表示内部上拉(默认)。
3.选项状态“0”表示TP0~TP7引脚通过连接到VSS的高值电阻。
应用电路
参考博文:1
首先说明一下,网上资料真的有很多坑!!!请听我娓娓道来……算了不废话,直接上主题:
一、TTP229并不是芯片具体型号,该类芯片下面有多个具体型号,在开发之前,请一定要先确认你的芯片具体型号,
我用的是TTP229BSF,这一款芯片其实是不带I2C功能的!
二、请确认使用对了文档
我刚开始用的文档是 TTP229_SPEC_V1.1(Simplified_Chinese).pdf,毕竟这个是中文文档,看起来方便,但是还是大错特错!因为这个根本不是TTP229BSF的对应文档,文档里描述到了I2C功能,我就埋头研究,结果撞墙两天。。。
三、别被网上的各种资料搞晕了,很多代码根本就不能运行就贴上来了,可恨呐!就拿如何读取触摸按键的键值这个来说吧,官方时序图如下(以16键为例):
根据文档描述,16键模式只支持串行读取,并且需要短接TP2,另外,由于我习惯了数据高电平有效,所以根据文档描述,短接了TP1(等于0表示短接)
重点来了!!!!网上很多参考代码都是貌似根据时序图,通过单片机先设置SDO=0,然后delay(),然后SDO=1,接着SCL=1,delay(),再读取SDO是否为1,delay()……,,,总之会通过单片机对SDO口发命令,其实根本不需要,而且我这样做这样反而读不了结果!!!!
具体原因有官方文档为证:
也就是说,有2种方法可以读取TTP229触摸按键的数据,方法1是单片机一直查询SDO口的数据,这种方法显然效率较低;方法2是单片机可以通过判断SDO口上的DV信号来确认是否有按键按下,我采用的是方法2,部分代码如下:
所以其实真的很简单,时序图上的DV信号是TTP229发出的,并不需要我们通过单片机给它发,因此,我们只要发现SDO口上有高电平(TP1短接接地的情况下,不接地默认就是低电平有效),我们再按照时序,在SCL引脚上发送对应时序就能读取数据了。
下图是我在16键模式、高电平有效条件下,按下11键,通过逻辑分析仪得到的时序图:
由上图可知,通道1的第一个高电平是我按下11键后,TTP发往SDO口上的高电平(时间很短,所以看起来很小),而后面的这个高电平就是11键的数据了(对应SCL时序下的第11个电平变化)。
另外,我用的是STM32,STM32接SDO口引脚配置成浮空输入即可。
如果用线程轮询SDO口,一次轮询后的延时不要太长,否则可能读不到数据。
参考博文2 :
最近在做一个项目,项目中使用到了触摸按键板。淘宝上买了一个TTP229B的16键触摸板模块用于调试,但是商家不提供测试程序和使用说明。无奈查阅资料,按照时序图模拟时序,花了一上午时间完成16键触摸键盘的测试工作(两线串行通讯)。very happy!
1、 触摸按键模块:
2、原理图:
3、16键串行配置,手册重点说明。
根据手册说明,使用16键模式,需要TP2连接高阻值电阻到地!
16键的2-线串行通讯方式可以配置为高电平有效,和低电平有效两种方式。
此处选择为高电平有效(根据个人习惯配置)。所以TP1=0,TP2=0。TP1和TP2都连接高阻值电阻到地!,需要将触摸板上的K1,K2通过短接块接地。
如下:
上图表格为芯片手册的时序图中的时序参数设定范围!
4、测试程序。
key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#include "delay.h"
#define KEY_SDA_IN() {GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=0X00008000;GPIOC->ODR==0<<3;} //下拉输入
#define KEY_SDA_OUT() {GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=0X00003000;} //推挽输出,50Mhz
#define TT_SCL PCout(2) //SCL-PC2
#define TT_SDO PCout(3) //SDA-PC3
#define TT_SDI PCin(3)
u16 TouchKey_Read(void);
void TouchKey_init(void);
u8 Get_KeyNum(void);
#endif
key.c文件
#include "key.h"
#include "usart.h"
void TouchKey_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
KEY_SDA_OUT(); //SDO设置为输出
TT_SDO = 0;
TT_SCL = 0;
TouchKey_Read();
}
u16 TouchKey_Read(void)
{
u8 i;
u16 re_val = 0;
KEY_SDA_OUT();
TT_SDO = 1;
delay_us(100);
TT_SDO = 0;
delay_us(20);
KEY_SDA_IN();
for (i = 0; i < 16; i++)
{
TT_SCL = 1;
delay_us(200);
TT_SCL = 0;
if (TT_SDI==1)
{
re_val |= (1 << i);
}
delay_us(200);
}
delay_ms(2); //根据时序图延时2ms, 不然容易出现按键串扰现象
return re_val;
}
u16 PreKeyNum;
u16 NowKeyNum;
u8 Get_KeyNum(void)
{
u8 key_num;
NowKeyNum=TouchKey_Read();
if((NowKeyNum & 0x0001)&& !(PreKeyNum & 0x0001))
{
key_num=1;
}
if((NowKeyNum & 0x0002)&& !(PreKeyNum & 0x0002))
{
key_num=2;
}
if((NowKeyNum & 0x0004)&& !(PreKeyNum & 0x0004))
{
key_num=3;
}
if((NowKeyNum & 0x0008)&& !(PreKeyNum & 0x0008))
{
key_num=4;
}
if((NowKeyNum & 0x0010)&& !(PreKeyNum & 0x0010))
{
key_num=5;
}
if((NowKeyNum & 0x0020)&& !(PreKeyNum & 0x0020))
{
key_num=6;
}
if((NowKeyNum & 0x0040)&& !(PreKeyNum & 0x0040))
{
key_num=7;
}
if((NowKeyNum & 0x0080)&& !(PreKeyNum & 0x0080))
{
key_num=8;
}
if((NowKeyNum & 0x0100)&& !(PreKeyNum & 0x0100))
{
key_num=9;
}
if((NowKeyNum & 0x0200)&& !(PreKeyNum & 0x0200))
{
key_num=10;
}
if((NowKeyNum & 0x0400)&& !(PreKeyNum & 0x0400))
{
key_num=11;
}
if((NowKeyNum & 0x0800)&& !(PreKeyNum & 0x0800))
{
key_num=12;
}
if((NowKeyNum & 0x1000)&& !(PreKeyNum & 0x1000))
{
key_num=13;
}
if((NowKeyNum & 0x2000)&& !(PreKeyNum & 0x2000))
{
key_num=14;
}
if((NowKeyNum & 0x4000)&& !(PreKeyNum & 0x4000))
{
key_num=15;
}
if((NowKeyNum & 0x8000)&& !(PreKeyNum & 0x8000))
{
key_num=16;
}
PreKeyNum=NowKeyNum;
return key_num;
}
main.c文件
#include "usart.h"
#include "key.h"
#include "as608.h"
int main(void)
{
u16 num=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
usart1_init(115200);
delay_init();
TouchKey_init();
while(1)
{
num=Get_KeyNum();
printf("num=%d\r\n",num);
}
}
5、测试结果。
测试效果感觉不错,暂时未遇到传说中的按键串扰和不灵敏等现象
注意: 以上程序都是串行TT模式,不是I2C