锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

硬件知识:电容触摸按键IC

时间:2023-09-12 03:07:02 电容触摸触控ic

一、触摸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通道JR芯片引脚定义9016触控方案:

image

16键IIC通道JR芯片引脚图9016触控方案:

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复位后,进入参数配置模式,此时触摸按钮不会移动。如果您想直接进入触摸按钮传感器模式,您需要通过0x配置8个指令,如图1所示。

图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,0需要重复使用xB指令。

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.5TC334B电容式触摸按钮ic

1.6APT8L16

1.7ASC0129

1.1、台湾通泰:ttp229

一般说明
TTP229-BSF TonTouchTM IC是专门为触摸板控制而设计的电容式感应设计。该设备用于触摸传感器的内置调节器。 稳定的传感方法可以覆盖多种条件。面板链路由非导电介电材料控制。 主要用途是更换机械开关或按钮。 ASSP可独立处理8个触摸板或最多16个触摸板。

特征

  • 工作电压:2.4V~5.5V
  • 内置调节器
  • 待机电流

在3V,慢采样率8的睡眠模式Hz:
=> 16个输入键的典型值为2.5uA
=> 典型的8个输入键2.0uA

  • 按选项设置8个直接键或16个直接键
  • 只设置8个直接输入键模式
  • 可用于8和16直接输入键模式
  • 输出驱动类型可选择8个独立输出(CMOS / OD / OC,有效高/低)
  • 高电平有效或低电平有效

多键或单键功能通过选项提供

  • 在睡眠模式下样率为8Hz,64快速采样率Hz

最大键控时间约为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

https://blog.csdn.net/baidu_15814023/article/details/100580650?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

首先说明一下,网上资料真的有很多坑!!!请听我娓娓道来……算了不废话,直接上主题:

 

一、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 :https://blog.csdn.net/YANGSAI123/article/details/79879969

最近在做一个项目,项目中使用到了触摸按键板。淘宝上买了一个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

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章