找回密码
 立即注册
查看: 2112|回复: 9

求助:触摸阈值TSTH11无法写入数据

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-08-17 16:41:35

16

主题

25

回帖

270

积分

中级会员

积分
270
发表于 2023-1-5 19:54:05 | 显示全部楼层 |阅读模式
本帖最后由 吽吽吽 于 2023-1-5 20:06 编辑

芯片:STC8H4K64TLCD 45I-LQFP48 229A668354.H+A

程序:使能TK11 (TSCHEN1=0x00;TSCHEN2=0x08;)并将TK11的 TSDAT存入TSTH11,在将TSTH11H,TSTH11L数据通过串口1发送。
现象:TSTH11H,TSTH11L的数据都是0x00
主要函数:
tk11-1.png
串口数据:(前00为高位 后00为低位)
tk11-2.png

直接TSTH11=0xAAAA;或者TSTH11H=0xAA;TSTH11L=0xAB;
tk11-3.png
串口数据:(前00为高位 后00为低位)
tk11-4.png

使能TK11 (TSCHEN1=0x00;TSCHEN2=0x08;)直接将TSDATH,TSDATL通过串口输出
tk11-5.png
串口数据(高位9D为无触摸,高位12与0E为有触摸数据)
tk11-6.png

其前后TSTH10H,TSTH10L;TSTH12H,TSTH12L都能正常读写数据,偏偏TSTH11H,TSTH11L不行。

初步感觉是寄存器TSTH11H,TSTH11L损坏
#define     TSTH11                  (*(unsigned int  volatile xdata *)0xfb66)
#define     TSTH11H                 (*(unsigned char volatile xdata *)0xfb66)
#define     TSTH11L                 (*(unsigned char volatile xdata *)0xfb67)
具体有关函数如下:
int xdata TK_DAT=0x0000;

CLKSEL=0;  //内部高速时钟

P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x10; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;


//--------------------触摸设置--------------------------------------
TSCFG1=0x74;              //触摸按键内部电容工作频率,13/2=6MHz 放电时间7500个系统时钟
TSCFG2=0x03;              //触摸按键内部参考电压,参考电压3/4ACC 即3.75V
TSWUTC=255;      //低压触摸唤醒频率。大于扫描时间。
TSRT=0x00;        //关闭LED分时复用



void TK_GO()
{        
while(1)
{
Delay500ms();
switch(TK_N){
        case 0x03:TSCHEN1=0x08;TSCHEN2=0x00;LED1_B();SPI();break; //TK3触摸  LED1_B(); SPI();指示触摸按键,方便调试。
        case 0x05:TSCHEN1=0x20;TSCHEN2=0x00;LED2_B();SPI();break; //TK5触摸 0000 1000 并开始扫描
        case 0x01:TSCHEN1=0x02;TSCHEN2=0x00;LED3_B();SPI();break; //TK1触摸 0000 0010 并开始扫描
        case 0x00:TSCHEN1=0x01;TSCHEN2=0x00;LED4_B();SPI();break; //TK0触摸 0010 0000
        case 0x11:TSCHEN1=0x00;TSCHEN2=0x08;LED5_B();SPI();break; //TK11触摸 0000 0000   0000 010
        case 0x12:TSCHEN1=0x00;TSCHEN2=0x10;break;
        case 0x10:TSCHEN1=0x00;TSCHEN2=0x04;break;
}        
TSCTRL=0xe0;       //1110 0000  7:触摸开始扫描 6:单次扫描  5:扫描完成后暂停,4:低功耗时钟 3:关闭内部比较器 2:关闭低功耗 [1:0]重复1次
while(TSIF==0){TSIF=TSSTA2;TSIF=TSIF>>7;}   //TSIF变1,扫描完成否则等待扫描完成
TSCTRL=0x00;      //关闭触摸
TSSTA2|=0X80;     //触摸中断清零      
TSIF=0;           //扫描完成标志清零
TK_DAT=TSDAT;     //取出扫描数据
switch(TK_N){
        case 0x03:TSTH03=TK_DAT; TK_N=0x05;AURT_1(0x03);AURT_1(TSTH03H);AURT_1(TSTH03L);break;  //TK5触摸数据存入 阈值
        case 0x05:TSTH05=TK_DAT; TK_N=0x01;AURT_1(0x05);AURT_1(TSTH05H);AURT_1(TSTH05L);break;  //TK5触摸数据存入 阈值
        case 0x01:TSTH01=TK_DAT; TK_N=0x00;AURT_1(0x01);AURT_1(TSTH01H);AURT_1(TSTH01L);break;  //TK1触摸数据存入 阈值
        case 0x00:TSTH00=TK_DAT; TK_N=0x11;AURT_1(0x00);AURT_1(TSTH00H);AURT_1(TSTH00L);break;  //TK0触摸数据存入 阈值
        case 0x11:TSTH11=TK_DAT;TK_N=0x12;AURT_1(0x11);AURT_1(TSTH11H);AURT_1(TSTH11L);break;    //TK11触摸数据存入 阈值
        case 0x12:TSTH12=TK_DAT; TK_N=0x10;AURT_1(0x12);AURT_1(TSTH12H);AURT_1(TSTH12L);break;
        case 0x10:TSTH10=TK_DAT; TK_N=0x03;AURT_1(0x10);AURT_1(TSTH10H);AURT_1(TSTH10L);Delay500ms();LED1_G();LED2_G();LED3_G();LED4_G();LED5_G();SPI();break;
}        

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-1-6 09:08:19 | 显示全部楼层
触摸按键的寄存器都是扩展寄存器,配置前需要先设置扩展寄存器访问使能:

1.png
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-08-17 16:41:35

16

主题

25

回帖

270

积分

中级会员

积分
270
发表于 2023-1-6 12:35:28 | 显示全部楼层
乘风*** 发表于 2023-1-6 09:08
触摸按键的寄存器都是扩展寄存器,配置前需要先设置扩展寄存器访问使能:

TSTHn都在扩展RAM,TSTH03 05 01 00 10都能正常读写,唯独TSTH11不能
  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-1-6 15:39:18 | 显示全部楼层
先设置扩展寄存器访问使能,然后再进行配置试试。没设置扩展寄存器访问使能,读写寄存器操作不是在正常的寄存器里执行,你看到的都不是真实寄存器的内容。
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-08-17 16:41:35

16

主题

25

回帖

270

积分

中级会员

积分
270
发表于 2023-1-6 18:32:11 | 显示全部楼层
乘风*** 发表于 2023-1-6 15:39
先设置扩展寄存器访问使能,然后再进行配置试试。没设置扩展寄存器访问使能,读写寄存器操作不是在正常的寄 ...

不使能扩展寄存器,就不可能对TSTH03,05,01,0,10进行读写,既然我能对TSTH03,05,01,0,10进行读写,那么就应该能对TSTH11进行读写,实际情况是唯独不能对TSTH11进行读写,我用的是while 与 switch语句,对TSTHn寄存器的操作的几个语句是一样的,其他都正常,唯独不能对TSTH11进行读写。
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-1-6 18:37:35 | 显示全部楼层
你先回答,你有没有允许访问扩展的 XSFR寄存器 !!!!!!!!!
1.png
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-1-6 18:40:11 | 显示全部楼层
1.png


2.png

3.png
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-1-6 18:40:50 | 显示全部楼层
你先回答,你有没有允许访问扩展的 XSFR寄存器 !!!!!!!!!
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-08-17 16:41:35

16

主题

25

回帖

270

积分

中级会员

积分
270
发表于 2023-1-6 20:10:18 | 显示全部楼层
初始化有这么一句
P_SW2|=128;         //1000 0000 允许访问片内XSFR  0FA00H~0FFFFH  FB50-FB6F 触摸阈值寄存器
如果没有这句,那么AURT_1(TSTH11H);AURT_1(TSTH11L);  串口1无任何数据输出。
下面三句
   TK_DAT=TSDAT;     //取出扫描数据,

case 0x11:TSTH11=TK_DAT;TK_N=0x12;AURT_1(0x11);AURT_1(TSTH11H);AURT_1(TSTH11L);break;
//TK11触摸数据存入阈值寄存器TSTH11, 然后串口输出0x11;在输出TSTH11H数据,在输出TSTH11L数据;实际运行输出的是:11 00 00
case 0x11:TSTH11=0xAAAA;TK_N=0x12;AURT_1(0x11);AURT_1(TSTH11H);AURT_1(TSTH11L);break;
//阈值寄存器TSTH11写入0xAAAA, 然后串口输出0x11;在输出TSTH11H数据,在输出TSTH11L数据;实际运行输出的是:11 00 00

tk11-4.png


case 0x11:TSTH11=TK_DAT;TK_N=0x12;AURT_1(0x11);AURT_1(TSDATH);AURT_1(TSDATHL);break;      
//TK11触摸数据存入阈值寄存器TSTH11, 然后串口输出0x11;在输出TSDATH数据,  在输出TSDATL数据;  实际运行输出的是:11 9D 02(无触摸) 11 OE B0(有触摸)   
tk11-6.png





  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-1-9 15:38:20 | 显示全部楼层
分析确认触摸按键门槛值寄存器里面,TSTH11H和TSTH11L被设置成只写模式,不能读取它们的值。其它的是可读可写。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:10 , Processed in 0.220534 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表