This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1312R:下降沿触发引脚中断双触发

Guru**** 2552350 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1024674/cc1312r-pin-interrupt-double-fires-on-falling-edge

器件型号:CC1312R

你好。

我有一个引脚中断配置为在下降沿触发。 观察具有示波器的线路、在转换时线路上存在迟滞。 我将配置设置如下。 当线路经历从高到低的转换时、回调被调用两次。 当我反转所有内容并检测到低电平到高电平转换(具有几乎没有迟滞)时、根据需要调用一次回调。

如何防止由于高到低迟滞而调用它两次?

谢谢!

// PIN CONFIG INITIALIZERS
#define PANEL_DETECT_PIN    IOID_1

static PIN_Config detectPinConfig[] = {
    PANEL_DETECT_PIN | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
    PIN_TERMINATE
};
static PIN_Config allPinTable[] = {
    LP_GREEN_LED        | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    LP_RED_LED          | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    SPF_RED_LED         | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    SPF_GREEN_LED       | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    SPF_YELLOW_LED      | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    NODE_RESET_PIN      | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    PANEL_DETECT_PIN    | PIN_INPUT_EN       | PIN_PULLUP    | PIN_IRQ_BOTHEDGES,
    PIN_TERMINATE
};

static PIN_Handle detectPinHandle;
static PIN_State detectPinState;


// CONFIGURATION
PIN_init(allPinTable);
detectPinHandle = PIN_open(&detectPinState, detectPinConfig);
if (!detectPinHandle) {
    while(1);
}
PIN_setConfig(detectPinHandle, PIN_BM_HYSTERESIS, PANEL_DETECT_PIN | PIN_HYSTERESIS);
PIN_Status intRegStatus = PIN_registerIntCb(detectPinHandle, (PIN_IntCb)detectPinCb);


// PIN INTERRUPT CALLBACK
static void detectPinCb(PIN_Handle handle, PIN_Id id) // TODO: this gets called twice on falling edge for some reason
{
    PIN_setInterrupt(handle, PIN_IRQ_DIS);
    microState = (bool)!PIN_getInputValue(PANEL_DETECT_PIN);
    if (!Clock_isActive(detectPinDebounceClockHandle)) {
        Clock_start(detectPinDebounceClockHandle);
    }
}

// DEBOUNCE CLOCK CALLBACK
static void detectPinDebounceClockCb(void)
{
    bool state = (bool)!PIN_getInputValue(PANEL_DETECT_PIN);
    if (microState == state) { // if still held after debounce timeout
        Event_post(singleProgrammerEventHandle, SINGLE_PROGRAMMER_EVENT_DETECT_PIN_CHANGED);
    }

    if (state) {
        PIN_setConfig(detectPinHandle, PIN_BM_IRQ, PANEL_DETECT_PIN | PIN_IRQ_POSEDGE | PIN_BM_HYSTERESIS);
    }
    else {
        PIN_setConfig(detectPinHandle, PIN_BM_IRQ, PANEL_DETECT_PIN | PIN_IRQ_NEGEDGE | PIN_BM_HYSTERESIS);
    }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否使用示波器检查 GPI 引脚并查看高电平到低电平转换期间是否存在抖动?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要在回调中实现一些去抖逻辑。 请参阅我们最新 SDK 中的 pinInterrupt 示例:

    https://dev.ti.com/tirex/explore/node?node=ABSS4vh1RDrfhzsCZ4SVcQ__pTTHBmu__LATEST

    Siri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    YiKai Chen、我已经查看了线路、可以确认在高到低转换期间存在抖动。

    Siri、我的应用中已经有去抖逻辑。 调用回调时、引脚中断会通过 PIN_setInterrupt 调用立即禁用、以防止触发任何其他中断、直到重新启用。 当中断被调用时、一个时钟被启动。 该时钟过期后、将再次检查引脚的状态、以确保状态仍然保持、直到此时引脚中断才被重新启用。 在调用回调之前、似乎已触发中断两次、否则 PIN_setInterrupt 调用应已阻止第二个中断触发。  

    谢谢、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果 在高电平到低电平转换期间出现抖动,则会看到多次触发中断是正常现象。 如果在中断回调中添加了退出逻辑、则在第二次触发中断回调时可以避免处理任何内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否尝试实现我发送给您的示例中所示的退出逻辑。 我在使用此代码时从未遇到过任何问题。

    Siri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    宜开陈,我已实施了去抖逻辑,防止了两火的发生。 这仍然是我希望防止而不是处理的一种错误行为。 很高兴听到这听起来对您来说是正常的、不过、感谢您的深入见解。

    Siri、我尝试了上一次响应之前显示的去抖方法。 它不会阻止再次调用回调。 逻辑是可以两次调用、我只是想可以有一种方法来防止这种情况发生。 我认为这已经解决了、谢谢。