你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32H7体验】+ 连接TTP229电容键盘

[复制链接]
晒太阳的懒猫 发布时间:2022-4-23 16:45
前面几个评测中,在开发板上连接了OLED显示屏、nRF24L01无线通讯模块。这次加入电容键盘。考虑到系统主要使用3.3V电源,所以准备使用以TTP229为控制核心的电容键盘模块,它的使用电压范围为2.4V~5.5V,电压适用范围宽。
它可以使用2-线串行模式通讯,占用口线少,通讯协议也不复杂,只需要简单获取模块的数据即可。有数据,表示按键被触摸。模块外形图:
TTP229-1.png
使用这个模块,需要提前做些准备工作,很简单,把红圈标记的地方短接起来。

短接

短接
黄色标记内的排针是准备接入开发板用到的接口,分别是VCCGNDSCL时钟、SDA数据。
我把PB10作为SCL时钟,PB11作为SDA数据。
系统连接好的状态:

键盘

键盘
测试时,在OLED屏幕的右上角显示按键的键值。对应16个触摸按键的键值为1-16。可以按照自己的需求,给按键设置为功能键。我准备按照如下配置处理键盘的输入。
13-------向上选择菜单条目、调整数据减1
14-------向下选择菜单条目、调整数据加1
15-------取消
16-------确认
其他按键根据需要,比如为了简化某些操作时,再做调整。根据TPP229的资料:

时序1

时序1
所以我之前提到过短接的那两个跳线孔,就是为了设置为上面的这种通讯方式(TP1=0,TP2=0),简单有效,不用考虑太多的通讯协议之类的东西,不使用从机地址数据,直接访问。
按照这个模式,要想获得键盘按键情况,先发一个SDA脉冲,由“1”到“0”,作为启动信号。之后,正常发出SCL脉冲,在SCL=1的时候,取得SDA线上的数据。按照D0 - D5的顺序,取得16位数据后,计算其中为0的数据位数,就得到按键的键值。这里不考虑几个按键同时按下的处理。有兴趣的同学可以自行花时间做实验。
开发板的主频很高,为了适应TTP229的读取时序,需要加一些必要的延时。

时序2

时序2
下面是读取键值的代码:
  1. /********************************************************************/ e; q% s. W  ~% R5 E7 {5 c; a2 x
  2. * 名称 : ttp_GetKeyCode()" D+ i& M- a% I) X/ Q& F9 U
  3. * 功能 : 扫描TTP229电容键盘(16按键)函数; e# L* E4 V6 I5 f5 m
  4. * 输入 : 无
    5 V+ u& T% t6 @9 Y% ~, t* O! x* f
  5. * 输出 : 按键编号% F$ b- T  f" h) Y* y: p& l& q6 m% t
  6. ***********************************************************************/- a5 w6 ]) d. }$ l1 r# _2 L6 a
  7. uint8_t ttp_GetKeyCode(void) {1 z9 w, T0 ^1 [0 @( b3 o1 T
  8.         uint8_t key=0;
    1 n* ^) f: K" V$ O
  9.         uint8_t i;
    ! k6 ?, g' p; Y# l5 w' H
  10.     uint8_t temp=0x0000;: `# w, D/ g, C* C  A. |* v

  11. & _' ~- ~$ {0 j' Y! S! Y4 Q
  12.     : p% q! _2 X" s& i
  13.    
    1 d* z! R4 ^# \8 j1 a
  14.         CLR_TTP229_SDA();
    * y! z+ i0 W& _7 I0 _6 N
  15.     ttp29_delay(200);% Q+ f: P: S5 P  J) r
  16.     SET_TTP229_SDA();) X# m: T' {0 K
  17.         ttp29_delay(200);
    & a# A1 {5 c) q# G' L: W

  18. 2 Q9 X3 e% {. h. B$ \

  19. % j% B9 I8 F: f/ a6 k
  20.            for(i=0;i<16;i++) {
    : b1 {$ f2 U6 s6 \! r/ k1 f8 l
  21.                   CLR_TTP229_SCL();
    / i/ h5 n- @, R) \
  22.                 ttp29_delay(200);, O4 Z* }6 x  s- Z: {
  23.                 SET_TTP229_SCL();) ]& F7 j+ R4 t" D. l* J
  24.         ttp29_delay(200);
    . i6 |. Q- P+ S' |) `7 J$ z
  25.                 if(READ_TTP229_SDA()==RESET) {5 J+ ^: B( q8 ]; l2 U
  26.                         temp|=(1<<i);
    - E- E, c1 I3 k5 g- P  I! ?
  27.                 }' F, [2 ~+ e% W; E# v) x
  28.                 % `2 Y8 O1 }! Z6 y" G8 o
  29.         }
    3 h8 Y+ i! j& h( L
  30.            for (i=0;i<16;i++) {
    2 W. T% L1 N; A% [
  31.            if ((temp & (1<<i)) > 0) {
    1 e( o6 O, N; T
  32.                       key=i+1;$ |1 n1 F7 i9 D2 h/ W& A
  33.            }
    % n2 x4 v) D5 j/ ^  Z% B  D/ g4 c/ P
  34.         }
    6 C6 G% m5 j1 O, d5 h0 n
  35.         HAL_Delay(50);
    0 c) }/ J: c7 {  d% y
  36.            return key;
    2 T" a& A, x% f- i1 y3 ]
  37. }
复制代码
因为涉及SDA的输出以及输入读取,所以要及时调整它所在GPIO的输入输出设置。
组装好系统后,为了能及时观察按键的响应,在OLED的右上角位置,即时显示键值。
在此附上TTP229处理用的代码。
ttp229.zip (1.66 KB, 下载次数: 14)
封面.jpg
1 收藏 评论2 发布时间:2022-4-23 16:45

举报

2个回答
蓝雪001 回答时间:2023-2-13 12:56:09

网上包括这篇文章,关于SDO信号的理解大部分是错误的,仔细看手册,SDO信号是输出信号,不可以往输出信号管脚置高或低,波形图上起始的SDO信号,那是芯片本身有了触摸按键触摸后,输出的一个表示有键按下的信号,可以接到单片机的中断信号输入,是按键中断信号。MCU接到这个信号后,在SCL上输出时钟,在SDO上读取键值。

晒太阳的懒猫 回答时间:2023-2-13 14:04:32

蓝雪001 发表于 2023-2-13 12:56
网上包括这篇文章,关于SDO信号的理解大部分是错误的,仔细看手册,SDO信号是输出信号,不可以往输出信 ...

[md]谢谢指正,我抽时间测试下

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版