capsense scan 扫描通道数过多会使MCDWT配置不能立即生效

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
user_4363331
Level 1
Level 1
5 replies posted First question asked First reply posted

大家好

     我在做capsense在deepsleep模式扫描唤醒时发现:当capsense通道数大于等于8时,判断while(CapSense_NOT_BUSY != CapSense_IsBusy());(等待扫描完成),使用MCWDT_SetMatch(CY_MCWDT_COUNTER0,319,93)配置MCWDT后不能立即生效,当通道数小于8或者不执行while(CapSense_NOT_BUSY != CapSense_IsBusy());时可以立即生效,(用LED闪烁看效果,附件是简化扫描过程后的逻辑)。但是while(CapSense_NOT_BUSY != CapSense_IsBusy());这个判断在整个扫描过程中好像是必不可少的,我该怎么改呢?

0 点赞
1 解答
lock attach
Attachments are accessible only for community members.
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: 从代码的整体设计,我推测你是想在M0+上面设计,这一点也基于你之前建的几个问题。

2: 请删除在M4的文件里面写中断入口函数。把中断的入口函数写在M0+的main.c里面,因为你的中断都是M0+触发的。

3: 你LED亮的时间选的是match393,也就是12.31ms,这个时间不太适合做测试。建议选择和灭的时间选用一样的match18000。

5: 你代码里面用了三个counter,需要Enable一下:

Cy_MCWDT_Enable(MCWDT_0_HW, CY_MCWDT_CTR0|CY_MCWDT_CTR1|CY_MCWDT_CTR2, \

                MCWDT_0_TWO_LF_CLK_CYCLES_DELAY);

6:另外,我需要解释的是: 深度睡眠之后第一次扫描,状态位是不是会改为ON,是要根据你debounce的设计的,如果你debounce是3,那么需要连续三次扫描一个sensor是ON的状态,最终才会check到active。

7:希望我的解释可以帮助你对CYPRESS芯片的理解。

在原帖中查看解决方案

0 点赞
5 回复数
lock attach
Attachments are accessible only for community members.
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

我写了一个测试代码,放在附件里面了。你看一下。

代码我在kit-062BLE上面测试过了,可以正常工作。

0 点赞
lock attach
Attachments are accessible only for community members.

@LinglingG_46你好,我之前没有把我想表达的意思表达完整,我想做低功耗检测按键,大致过程是当没有操作n秒后进入deepsleep,同时把MCWDT周期改为500ms来唤醒deepsleep,希望在500ms内如果有手指touch按键,就把MCWDT中断周期改为10ms,但是我发现以下几个问题:

1.当按键数量>=8个,在MCWDT周期为500ms是改为10ms时,在进入第一次deepsleep时,MCWDT是以比500ms更大的周期(用你写的测试代码进行过测试)才进入中断,我把个数改为6个时(其他条件不变),MCWDT设置后可以在进入下一个deepsleep后立即生效;还有就是在不改变按键个数(依然是8个),不去判断if(CapSense_NOT_BUSY == CapSense_IsBusy())这条语句也是能立即生效的,这个和我写的代码产生的结果一样。

2.我按照例程来修改的按键处理,过程就是扫描→等待扫描完成→处理→deepsleep这个过程,我在deepsleep下以500ms唤醒去执行扫描过程,发现手指touch后唤醒的第二次才能检测到capsense是active的。这个现象和唤醒周期时间无关。我CSD setting里面的modutor clock frequency 设为最低6250,如果把这个参数提高到一定数值,那么在500ms的周期唤醒下是永远检测不到touch的。

3.扫描→等待扫描完成→处理这个过程我实测耗时大约18ms,这点是否是正常的?

以上现象就好造成当检测到capsense是active的时,还需等待一个大于500ms的时间, 影响触摸体验感,如果把周期减少,功耗就好变得很大,我该怎么处理,或者我这样的处理方式是否不合理?

以下是我更改你给的测试代码(工程见附件,也是kit-062BLE板测试):

    for(;;)

    {

  /* CM0+ is not used after enabling CM4. CM0+ is put into Deep Sleep mode

  to save power. CM0+ does not wake up from Deep Sleep mode */

      //  Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);

    

       

      if(CapSense_NOT_BUSY == CapSense_IsBusy())

        {

         CapSense_ProcessAllWidgets();

       if(CapSense_IsAnyWidgetActive())

        {

         //Cy_GPIO_Inv(LED_1_PORT, LED_1_NUM);

         

        }

        else

        {

          

        }

         CapSense_RunTuner();

        CapSense_Sleep();

        MCWDT_0_SetMatch(CY_MCWDT_COUNTER0,319,93);

        //CyDelay(100);

        Cy_GPIO_Clr(LED_PORT, LED_NUM);//亮

        Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);

        Cy_GPIO_Set(LED_PORT, LED_NUM);//灭   亮灭这个过程周期应该是319,但实际是比18000还大(这点更奇怪)

        MCWDT_0_SetMatch(CY_MCWDT_COUNTER0,18000,93);

        Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);

        CapSense_Wakeup();

        CapSense_ScanAllWidgets();

     

        }

0 点赞
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: 第一个问题,你deepsleep的扫描周期是500ms的话,在500ms之内是检测不到手指触摸的。

2: 我一直不懂你说的不能生效是什么意思?从机器的执行上面,不存在什么不能生效这一说。

3: 你首先要保证你的触摸是在active的状态下执行的,才能被检测到。

4: 你不要把问题总是放在sensor少于8或者大于8上面。

5: GPIO在deepsleep的情况下是保留的,所以我不知道你是怎么检测18000?

6: 非常建议你一个问题一个问题的解决,你这个低功耗的demo可以参考我们PSoC4 low power的历程。

6: 请问你这个案子有没有代理商跟。

0 点赞
user_4363331
Level 1
Level 1
5 replies posted First question asked First reply posted

很抱歉描述不清对你造成过多的困扰。

1: 我只是想知道在做低功耗扫描按键时手指按下后第一次从deepsleep唤醒,能不能检测到手指触摸,根据我的方法是要第二次唤醒才可以,因为这涉及到我在不影响体验感的同时能做到多低的功耗。

2: 生效的意思是当我配置MCWDT后的下一个中断周期是按我刚配置好的周期参数进入中断,而实际并不是(你可以把我的附件里面的capsense使能的通道数删除2个(8-2),其他不作任何改变去看LED闪烁的效果就很明显,kit-062BLE板)。

3: 我在中断用一个LED闪烁来看是否发生了中断,手指是一直触摸的。

4: 我并没关注通道数量,我只是在找问题时做过很多测试,发现这是影响到结果的一个原因,但是我不知道为什么会影响到。

5: 18000只是测试代码的MCWDT的周期,这可以是任何数字,比如我设置中断周期是10ms,异常情况下明显大于500ms?

6: 有参考过相应例程,也做过几乎不做改动下去测试,结果是一样的。

6: 暂时没找到FAE。

0 点赞
lock attach
Attachments are accessible only for community members.
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: 从代码的整体设计,我推测你是想在M0+上面设计,这一点也基于你之前建的几个问题。

2: 请删除在M4的文件里面写中断入口函数。把中断的入口函数写在M0+的main.c里面,因为你的中断都是M0+触发的。

3: 你LED亮的时间选的是match393,也就是12.31ms,这个时间不太适合做测试。建议选择和灭的时间选用一样的match18000。

5: 你代码里面用了三个counter,需要Enable一下:

Cy_MCWDT_Enable(MCWDT_0_HW, CY_MCWDT_CTR0|CY_MCWDT_CTR1|CY_MCWDT_CTR2, \

                MCWDT_0_TWO_LF_CLK_CYCLES_DELAY);

6:另外,我需要解释的是: 深度睡眠之后第一次扫描,状态位是不是会改为ON,是要根据你debounce的设计的,如果你debounce是3,那么需要连续三次扫描一个sensor是ON的状态,最终才会check到active。

7:希望我的解释可以帮助你对CYPRESS芯片的理解。

0 点赞