求助:触摸阈值TSTH11无法写入数据
本帖最后由 吽吽吽 于 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
主要函数:
串口数据:(前00为高位 后00为低位)
直接TSTH11=0xAAAA;或者TSTH11H=0xAA;TSTH11L=0xAB;
串口数据:(前00为高位 后00为低位)
使能TK11 (TSCHEN1=0x00;TSCHEN2=0x08;)直接将TSDATH,TSDATL通过串口输出
串口数据(高位9D为无触摸,高位12与0E为有触摸数据)
其前后TSTH10H,TSTH10L;TSTH12H,TSTH12L都能正常读写数据,偏偏TSTH11H,TSTH11L不行。
初步感觉是寄存器TSTH11H,TSTH11L损坏
#define TSTH11 (*(unsigned intvolatile 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 00007:触摸开始扫描 6:单次扫描5:扫描完成后暂停,4:低功耗时钟 3:关闭内部比较器 2:关闭低功耗 重复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;
}
触摸按键的寄存器都是扩展寄存器,配置前需要先设置扩展寄存器访问使能:
乘风飞扬 发表于 2023-1-6 09:08
触摸按键的寄存器都是扩展寄存器,配置前需要先设置扩展寄存器访问使能:
TSTHn都在扩展RAM,TSTH03 05 01 00 10都能正常读写,唯独TSTH11不能 先设置扩展寄存器访问使能,然后再进行配置试试。没设置扩展寄存器访问使能,读写寄存器操作不是在正常的寄存器里执行,你看到的都不是真实寄存器的内容。 乘风飞扬 发表于 2023-1-6 15:39
先设置扩展寄存器访问使能,然后再进行配置试试。没设置扩展寄存器访问使能,读写寄存器操作不是在正常的寄 ...
不使能扩展寄存器,就不可能对TSTH03,05,01,0,10进行读写,既然我能对TSTH03,05,01,0,10进行读写,那么就应该能对TSTH11进行读写,实际情况是唯独不能对TSTH11进行读写,我用的是while 与 switch语句,对TSTHn寄存器的操作的几个语句是一样的,其他都正常,唯独不能对TSTH11进行读写。 你先回答,你有没有允许访问扩展的 XSFR寄存器 !!!!!!!!!
你先回答,你有没有允许访问扩展的 XSFR寄存器 !!!!!!!!! 初始化有这么一句
P_SW2|=128; //1000 0000 允许访问片内XSFR0FA00H~0FFFFHFB50-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
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(有触摸)
分析确认触摸按键门槛值寄存器里面,TSTH11H和TSTH11L被设置成只写模式,不能读取它们的值。其它的是可读可写。
页:
[1]
2