5 Replies Latest reply on Sep 16, 2019 7:05 PM by LinglingG_46

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

    user_4363331

      大家好

           我在做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());这个判断在整个扫描过程中好像是必不可少的,我该怎么改呢?

        • 1. Re: capsense scan 扫描通道数过多会使MCDWT配置不能立即生效
          LinglingG_46

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

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

          • 2. Re: capsense scan 扫描通道数过多会使MCDWT配置不能立即生效
            user_4363331

            @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();

                 

                    }

            • 3. Re: capsense scan 扫描通道数过多会使MCDWT配置不能立即生效
              LinglingG_46

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

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

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

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

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

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

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

              • 4. Re: capsense scan 扫描通道数过多会使MCDWT配置不能立即生效
                user_4363331

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

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

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

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

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

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

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

                6: 暂时没找到FAE。

                • 5. Re: capsense scan 扫描通道数过多会使MCDWT配置不能立即生效
                  LinglingG_46

                  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芯片的理解。