[DemoCode下载] 赛元SC95F低功耗触摸按键唤醒库有BUG

[复制链接]
 楼主| WoodData 发表于 2020-4-16 21:55 | 显示全部楼层 |阅读模式
     这几天用SC95F低功耗触摸按键唤醒库发现一个问题,现象是进入低功耗后,通过其他方式(非触摸按键)唤醒后调用退出低功耗模式(调用该函数void TouchKey_QuitLowPowerMode(void))时,在退出低功耗到正常模式扫描按键时,会有最后触摸扫描通道按键触发。

    通过打印跟踪在unsigned long int TouchKeyScan(void)函数中,WakeUpKeyValue变量在非触摸退出低功耗时正好是最后扫描通道,导致一退出低功耗就有按键触发。
QQ截图20200416214418.jpg
  1. /**************************************************
  2. *函数名称:unsigned int TouchKeyScan(void)
  3. *函数功能:检测按键接口
  4. *入口参数:void
  5. *出口参数:按键通道, 返回的是一个int , 通道数
  6. *备注         :1,  调用触控库检测函数SensorKeyFlag()
  7.                    2,  分析得出16个通道,哪个通道有按下,按下bit 位设置为1,否则为0
  8.                    3,  检测是否需要立即更新baseline:  大于MAX_KEY_RESET_BASELINE 个按键按下时立即更新baseline
  9.                    4,  双键或者单键按下时, 时间大于SetOneKeyPushResetTime()结果时更新baseline
  10. **************************************************/
  11. unsigned long int TouchKeyScan(void)
  12. {
  13.         unsigned char t;
  14.     unsigned char MultipleCnt = 0;//按键计数
  15.         unsigned long int Keyvalue = 0;
  16.         unsigned long int KeyData = 0;        
  17.        
  18.         if(WakeUp_Flag == 0)
  19.         {
  20.                 if(GetIsNeedUpdateBaseline() == 0)                                //检测是否需要更新baseline
  21.                 {
  22.                         Keyvalue = SensorKeyFlag();                                        //Sensor判断, 这里如果bMultiple = 1 表示中间有干扰         //分析按键,得出标准的16通道bit 位                                                                               
  23.                         for(t=0;t<CurrentChannelMax;t++)
  24.                         {
  25.                                 Keyvalue = Keyvalue>>1;
  26.                                 if(TK_CY)
  27.                                 {
  28.                                         KeyData |= ((unsigned long int)0x01 << (CurrentChannel[t]));              
  29.                                         MultipleCnt++;                                                       
  30.                                 }
  31.                         }               
  32.                         if(MultipleCnt >= 2)                                                          //进入多按键处理
  33.                         {                       
  34.                                 bMultiple = 1;                       
  35.                                 if(MultipleCnt >= SOCAPI_MAX_KEY_NUM_INVALID)
  36.                                 {
  37.                                         SetNeedUpdateBaseline();                                 // 立即更新baseline ,例如亚克力板盖上去
  38.                                 }
  39.                                 else
  40.                                 {                                       
  41.                                         if(IsDoubleKeyOrSlideKey())
  42.                                         {
  43.                                                 bMultiple = 0;
  44.                                         }                                  
  45.                                 }                       
  46.                         }                       
  47.        
  48.                         if(bMultiple == 0)                                                                //进入按键判断
  49.                         {               
  50.                                 if(KeyData != 0x0)                                                    //单个按键达到多长时间就update baseline ,松手检测
  51.                                 {                       
  52.                                         UpdateBaseLNum++;
  53.                                 }
  54.                                 else       
  55.                                 {
  56.                                         UpdateBaseLNum = 0;        
  57.                                 }
  58.                         }       
  59.                         else
  60.                         {   
  61.                             //考虑基线更新               
  62.                                 MultipleLNum++;
  63.                                 KeyData = 0x00;
  64.                         }
  65.        
  66.                         if(UpdateBaseLNum > SetOneKeyPushResetTime())        //按键超出最长输出时间更新基线
  67.                         {
  68.                                  SetNeedUpdateBaseline();
  69.                                 UpdateBaseLNum = 0;
  70.                         }
  71.                                        
  72.                         if(MultipleLNum >SOCAPI_MAX_KEY_MUTIPLE)                //干扰计数大于最大计数更新基线
  73.                          {
  74.                                 SetNeedUpdateBaseline();
  75.                                 MultipleDealTpye = 1;
  76.                                 MultipleLNum = 0;
  77.                         }  
  78.                 }                       
  79.                 else
  80.                 {
  81.                         MultipleDeal(TKCFG[AUTO_UPDATE_TIME]);                        //基线复位处理
  82.                 }
  83.         }
  84.         else
  85.         {
  86.         #ifdef  TK_LowPowerMode
  87.                
  88.                 if(++WakeUpThenScanCount>5)
  89.                 {
  90.                         WakeUpThenScanCount = 0;
  91.                         WakeUp_Flag = 0;
  92.                 }
  93.                 for(t=0;t<CurrentChannelMax;t++)
  94.                 {
  95.                         FilterDataDeal(t);
  96.                         if(!WakeUp_Flag)
  97.                         {
  98.                                 if(WakeUpKeyValue==t)
  99.                                         continue;
  100.                                 BaseLine[t] = RawData[t];       
  101.                         }
  102.                 }
  103.                 //修改后
  104.                 if(WakeUpKeyValue != 0xff)
  105.                 {
  106.                         KeyData |= ((unsigned long int)0x01 << (CurrentChannel[WakeUpKeyValue]));
  107.                 }
  108.                 //原来
  109.                 //KeyData |= ((unsigned long int)0x01 << (CurrentChannel[WakeUpKeyValue]));
  110.                 #endif
  111.         }  
  112.         return KeyData;
  113. }
   就是在这个void TouchKey_LowPower_Dispose(void)函数中,在无触摸按键下,WakeUpKeyValue变量值是最后扫描通道。现在需要修改在无触摸时WakeUpKeyValue值不能为正常触摸通道索引,修改如下:
QQ截图20200416214530.jpg

  1. /**************************************************
  2. *函数名称:void TouchKey_LowPower_Dispose(void)
  3. *函数功能低功耗扫描数据处理
  4. *入口参数:void
  5. *出口参数:void  
  6. **************************************************/
  7. void TouchKey_LowPower_Dispose(void)
  8. {  
  9.         int differData;
  10.         int SetFingerThresholdtmp;
  11.         unsigned char WakeUpKey_Index;
  12.         unsigned char NextWakeUpKey_Index;
  13.         unsigned int ScanTimeTemp;
  14.        
  15.         SingleKeyFastScan_Flag = 0;
  16.         TKCFG0 &= 0XF0;       
  17.         BTM_WakeUpFlag = 0;
  18.         TKCFG0 |= TKChannelCfg[0][SET_TOUCH_FREQ];       
  19.         for(WakeUpKey_Index=0; WakeUpKey_Index<WakeUpKeyNum; WakeUpKey_Index++)
  20.         {
  21.                 WakeUpKeyValue = WakeUpKey_List[WakeUpKey_Index];
  22.                 NextWakeUpKey_Index = WakeUpKey_Index+1;
  23.                 if(NextWakeUpKey_Index>=WakeUpKeyNum)
  24.                 {
  25.                         NextWakeUpKey_Index = 0;
  26.                 }

  27.                 ScanTimeTemp = ScanTimeTemp0*TKChannelCfg[WakeUpKey_List[NextWakeUpKey_Index]][SCANTIME];

  28.                 while(TRIF == 0);  
  29.                 TRIF = 0;
  30.                
  31.                 RawData[WakeUpKeyValue] = TKCNT<<4;

  32.                 TKCFG1 = (TKCFG1 & 0X80) | BaseLineAdjusttmp[WakeUpKey_List[NextWakeUpKey_Index]];
  33.             TKCR = 0x80|CurrentChannel[WakeUpKey_List[NextWakeUpKey_Index]];
  34.                 TKTM = ScanTimeTemp;
  35.                 TRIG = 1;
  36.                
  37.                 differData = RawData[WakeUpKeyValue]-BaseLine[WakeUpKeyValue] ;
  38.                 SetFingerThresholdtmp = GetCurrFingerValue(WakeUpKeyValue);
  39.                
  40.                 if(differData >= SetFingerThresholdtmp)
  41.             {
  42.                          SingleKeyFastScan_Flag = 1;
  43.                          break;      
  44.             }
  45.                 else if(differData > (-(SetFingerThresholdtmp>>1)))
  46.             {
  47.                         if(WakeUpNum==WakeUpKey_Index%BaselineUpdateCnt)
  48.                                 Lowpower_BaselineUpdate(5);
  49.                 }
  50.                 else       
  51.                 {
  52.                         Lowpower_BaselineUpdate(2);
  53.                 }
  54.         }
  55.         if(++WakeUpNum>=BaselineUpdateCnt)
  56.         {
  57.                 WakeUpNum = 0;
  58.         }
  59.         //新修改添加
  60.         if(!SingleKeyFastScan_Flag)
  61.         {
  62.                 WakeUpKeyValue = 0xff;
  63.         }
  64. }


     通过以上修改之后,在其他需要唤醒调用函数void TouchKey_QuitLowPowerMode(void)时,就不会有触摸误动作按键。



赛元MCU3 发表于 2020-4-17 13:58 | 显示全部楼层
你好,这个触控低功耗在芯片唤醒后退出低功耗模式时,需要注意默认是有一个按键置起的, 在程序的这个位置可以看出: 774005e99437dace48.png 需要用外部中断唤醒时,不能修改WakeUpKeyValue的值,会改变低功耗的逻辑;可增加一个标志去判断是否是触控按键唤醒:当使用非触控按键唤醒时,不做触摸按键的赋值;当是触控唤醒时才进行按键赋值。 263485e9943ae8e83e.png 389155e9943c5b3ff2.png

评论

[url=home.php?mod=space&uid=2665594]@赛元MCU3[/url] 有sc95f8613的触控调试的库文件吗??在官网上没相关的文件,在论坛看到需要赛元公司的人才有相关的资料。邮箱:[email]420448071@qq.com[/email],谢谢  发表于 2020-8-16 22:42
 楼主| WoodData 发表于 2020-4-17 20:27 | 显示全部楼层
赛元MCU3 发表于 2020-4-17 13:58
你好,这个触控低功耗在芯片唤醒后退出低功耗模式时,需要注意默认是有一个按键置起的, 在程序的这个位置可 ...

明白了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4781

帖子

28

粉丝
快速回复 在线客服 返回列表 返回顶部