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.

[参考译文] CC2340R5:代码进入 ICall 中止模式时出现问题

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1471847/cc2340r5-issue-facing-in-code-is-going-in-icall-abord-mode

器件型号:CC2340R5

工具与软件:

您好!

我们使用的是 CC2340R5器件、该器件在基于事件的模式下充当外设。 当我们按下设备上的某个按钮时、它会开始广播1秒。 但是、如果我们在1秒内按下另一个按钮或同一按钮、则会进入 ICall 中止状态。 请您告知我们此问题的可能原因吗?"

请查看我随附的图片、并提供解决方案。

谢谢、此致

Balaji Wankhede

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

    尊敬的 Balaji Wankhede:

    如果按钮按下得太快、可能在第一次按下按钮期间仍在进行一些处理、这是导致问题的原因。 您能否分享一下您在 GPIO/按钮中断/回调中正在执行的操作?

    此致、

    1月

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

    您好 Jan:

    感谢您的答复。

    我想说的是、按下按钮后、我们会在持续1秒的时间内进行广播、但在我们必须执行某些操作的情况下、此时它仍然在运行。在这种情况下、它将进入 iCall_abort 状态、因此请为此提供建议的解决方案。否则、我们必须使用看门狗释放此状态、如果从中止状态释放、则提供您对此问题的响应。

    我已随附在我的代码中所做的更改、请检查一下、如果有任何错误、请告诉我。

    按钮初始化和回调:

    bStatus_t ButtonModule_init (void)

    Button_Params 参数;

    button_init();
    Button_Params_(T&params);

    //设置按钮参数
    params.buttonEventMask = button_ev_clicked | button_EV_LONGCLICKED;
    params.buttonCallback = Button_Callback_ c;
    params.debounceDuration = button_debounce_duration;

    // Button2_handle = button_open (CONFIG_Button_1、&params);//CONFIG_SW1
    // Button1_handle = button_open (config_button_0、&params);
    Button2_handle = button_open (CONFIG_SW2、&params);
    button3_handle = button_open (CONFIG_SW3、&params);
    Button1_handle = button_open (CONFIG_SW1、&params);

    if (Button2_handle == NULL || button3_handle == NULL || Button1_handle == NULL)

    返回失败;
    }

    返回成功;
    }

    按钮回调:

    void Button_Callback_ c( Button_Handle buttonHandle, Button_Event buttonEvents )

    buttonpresstime = button_getLastPressedDuration (buttonHandle);

    if (buttonHandle == Button1_handle)

    Battery_Voltage = BatteryMonitor_getVoltage ();
    if (buttonpresstime > 100 && buttonpresstime < 2000)

    BLEAppUtil_invokeFunctionNoData ((InvokeFromBLEAppUtilContext_t) start_adv_for_find_me);
    }
    if (buttonpresstime > 2000 && buttonpresstime < 15000)

    BLEAppUtil_invokeFunctionNoData ((InvokeFromBLEAppUtilContext_t) start_adv_for_Folly_me);
    }
    }

    }

    void start_adv_for_find_me (void)

    BLEAppUtil_advStart (peripheralAdvHandle_1、&advSetStartParamsSet_1);
    BLEAppUtil_advStart (peripheralAdvHandle_2、&advSetStartParamsSet_2);


    }

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

    您好!

    看着你的代码,似乎如果在那1秒内再次按下按钮,你调用 advStart()是正确的吗?

    此致、

    1月

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

    您好、Jan:

    我怀疑当他在一秒钟内按下按钮时、先前触发的广播集仍处于活动状态。 因此、在未正确停止正在进行的广播的情况下再次调用 BLEAppUtil_advStart 可能会导致冲突。

    为了解决这个问题、我建议在调用 BLEAppUtil_advStart 之前调用 BLEAppUtil_advStop。 这可确保在启动新广播之前关闭任何活动的广播句柄、从而防止重叠的广播会话。

    实施此更改已解决该问题。 如果您有任何其他建议、或者采用不同的方法更合适、请告诉我。

    将此标记为已解决。

    此致、

    Megh