公告

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

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

cross mob
lock attach
Attachments are accessible only for community members.
Fayne_Meng
Level 4
Level 4
Distributor - Weikeng(GC)
100 sign-ins First like received 10 likes given

 

你好,

    我这边在调试时,发现按键引脚分配顺序发生变化时会导致button1没有信号不能触发;如下截图;工程如附件,请帮忙看一下是什么原因,谢谢。

图一:button1不能触发,其他按键可以正常触发

button1不能触发.png

图二,所有的按键都可以正常触发

button1能触发.png

 

 

 

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

你原先的代码是这样的:

CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();
CapSense_ProcessAllWidgets();
Capsense_WidgetsValueGet();

我的意思是:CapSense_ProcessAllWidgets(); 之前不能scan。这个逻辑和你在前面判断没关系啊,你紧挨着这个语句,调用的就是scan啊!这个地方逻辑有问题。

在原帖中查看解决方案

10 回复数
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

Hi,

When I checked with the PSoC 4100S Datasheet,

P4.3 seems to be dedicated to csd.sch_tank.

你好。

当我检查PSoC 4100S数据表时。

P4.3似乎是专门用于csd.sch_tank的。

001-P4_3.JPG

So this may be the reason that P4.3 did not work as button1.

所以这可能是P4.3没有作为按钮1工作的原因。

moto

0 点赞
Fayne_Meng
Level 4
Level 4
Distributor - Weikeng(GC)
100 sign-ins First like received 10 likes given

你好,

    应该不是专用引脚,只是建议在有Ctank电容的情况下,该引脚优先配置为Ctan脚;在不调整引脚分配的情况下,当我去掉均值滤波和中值滤波后,Button1就可以触发了;或者调整引脚顺序,Button1也可以正常触发。如果是专用引脚的话,如上的两种操作,Button1应该也无法工作的;

     谢谢。

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

Open the CSD component data, find out the code, then test.  It can avoid the code issue: 

#include "project.h"
int main()
{
__enable_irq(); /* Enable global interrupts. */
EZI2C_Start(); /* Start EZI2C Component */
/*
* Set up communication and initialize data buffer to CapSense data structure
* to use Tuner application
*/
EZI2C_EzI2CSetBuffer1(sizeof(CapSense_dsRam),
sizeof(CapSense_dsRam),
(uint8_t *)&(CapSense_dsRam));
CapSense_Start(); /* Initialize Component */
CapSense_ScanAllWidgets(); /* Scan all widgets */
for(;;)
{
/* Do this only when a scan is done */
if(CapSense_NOT_BUSY == CapSense_IsBusy())
{
CapSense_ProcessAllWidgets(); /* Process all widgets */
CapSense_RunTuner(); /* To sync with Tuner application */
if (CapSense_IsAnyWidgetActive()) /* Scan result verification */
{
/* add custom tasks to execute when touch detected */
}

CapSense_ScanAllWidgets(); /* Start next scan */
}
}
}

0 点赞
Fayne_Meng
Level 4
Level 4
Distributor - Weikeng(GC)
100 sign-ins First like received 10 likes given

Hi Lingling,

     我这边找到原因了,只需要将CapSense_UpdateAllBaselines();和CapSense_ScanAllWidgets();的执行位置放到后边,但是不太明白为什么?还请给解释一下,谢谢。

我最初的代码在Tuner时由于引脚顺序不一样,会导致触摸Button1时的信号输出不一致如下图(下图引脚顺序在Tuner时,触摸Button1时无信号,其他按键正常):

tuner时button1触摸无信号.png

原始代码:

static void CapSenseScanTask(void)
{
if(CapSense_SW_STS_BUSY== CapSense_IsBusy())
{
//按键扫描中,提前退出
return ;
}
// 调用API,扫描按键
CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();
CapSense_ProcessAllWidgets();
Capsense_WidgetsValueGet();

。。。。。

}

调整代码执行顺序后恢复正常,调整后代码如下:

static void CapSenseScanTask(void)
{
if(CapSense_SW_STS_BUSY== CapSense_IsBusy())
{
//按键扫描中,提前退出
return ;
}
CapSense_ProcessAllWidgets();
Capsense_WidgetsValueGet();

。。。。。

// 调用API,扫描按键
CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();

}

Fayne

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

那你为什么要调用CapSense_UpdateAllBaselines();?这个地方我有点不理解。

CapSense_ProcessAllWidgets()这个函数执行的时候,CSD模块不能处于SCAN的状态,所以你调换顺序以后问题就解决了。

 

0 点赞
Fayne_Meng
Level 4
Level 4
Distributor - Weikeng(GC)
100 sign-ins First like received 10 likes given

你好Lingling,

    我是想在按键扫描完成后执行按键触发的判断,然后更新一下Baseline,所以才加了CapSense_UpdateAllBaselines();

我代码中已经加了判断,如果CapSense_SW_STS_BUSY== CapSense_IsBusy()的话,就Return了,不会执行下边的代码包括CapSense_UpdateAllBaselines()也不会执行。

 

Fayne

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

你原先的代码是这样的:

CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();
CapSense_ProcessAllWidgets();
Capsense_WidgetsValueGet();

我的意思是:CapSense_ProcessAllWidgets(); 之前不能scan。这个逻辑和你在前面判断没关系啊,你紧挨着这个语句,调用的就是scan啊!这个地方逻辑有问题。

Fayne_Meng
Level 4
Level 4
Distributor - Weikeng(GC)
100 sign-ins First like received 10 likes given

明白。改为如下顺序,对调用CapSense_UpdateAllBaselines();这个函数有没有前提要求(比如要先执行某个函数,或者必须在某个函数执行完后才能执CapSense_UpdateAllBaselines();),谢谢。


CapSense_ProcessAllWidgets();
Capsense_WidgetsValueGet();

CapSense_UpdateAllBaselines();
CapSense_ScanAllWidgets();

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

按照我的理解:你这个API:CapSense_UpdateAllBaselines();放在这里没什么用。在API:CapSense_ProcessAllWidgets(); 这个函数里面已经更新了baseline。 你不需要再调用这个函数了。

 

Fayne_Meng
Level 4
Level 4
Distributor - Weikeng(GC)
100 sign-ins First like received 10 likes given

好的,非常感谢😊

0 点赞