基于STM32F103的TTP229B两线串行通讯测试

时间:2024-05-18 15:32:31

    最近在做一个项目,项目中使用到了触摸按键板。淘宝上买了一个TTP229B的16键触摸板模块用于调试,但是商家不提供测试程序和使用说明。无奈查阅资料,按照时序图模拟时序,花了一上午时间完成16键触摸键盘的测试工作(两线串行通讯)。very happy!基于STM32F103的TTP229B两线串行通讯测试

1、 触摸按键模块:

基于STM32F103的TTP229B两线串行通讯测试

2、原理图:

基于STM32F103的TTP229B两线串行通讯测试


3、16键串行配置,手册重点说明。

基于STM32F103的TTP229B两线串行通讯测试

根据手册说明,使用16键模式,需要TP2连接高阻值电阻到地!

基于STM32F103的TTP229B两线串行通讯测试

16键的2-线串行通讯方式可以配置为高电平有效,和低电平有效两种方式。

此处选择为高电平有效(根据个人习惯配置)。所以TP1=0,TP2=0。TP1和TP2都连接高阻值电阻到地!,需要将触摸板上的K1,K2通过短接块接地。

如下:

基于STM32F103的TTP229B两线串行通讯测试

基于STM32F103的TTP229B两线串行通讯测试

上图表格为芯片手册的时序图中的时序参数设定范围!


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、测试结果。

   测试效果感觉不错,暂时未遇到传说中的按键串扰和不灵敏等现象。