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.

[参考译文] CC2541:在连接期间、BLE 堆栈会阻止 GPIO 上的实时中断

Guru**** 2576195 points
Other Parts Discussed in Thread: CC2541

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/588381/cc2541-real-time-interrupts-on-gpio-are-blocked-by-ble-stack-during-a-connection

器件型号:CC2541

在连接或广播期间、BLE 堆栈会阻止 GPIO 上的实时中断。 如果维持 BLE 时序对用例很重要、则这是堆栈的已知行为。  对于我们的应用、优先级是捕获所有 GPIO 边沿、这意味着允许 BLE 连接在任何点断开。 我可以处理广播、但一旦连接、就会出现以下问题。 我正在运行 TI BLE 1.4.1堆栈。  

在附加的图中、黄色表示使用射频观测输出(OBSSEL0)监视的 TX 活动。 红色轨迹线表示 GPIO ISR/处理活动。 具体而言、在 HAL 任务中处理时、调试输出在 ISR 中设置为高电平、而在该任务中设置为低电平。

这是预期的行为(BLE 处于活动状态、直到 GPIO ISR 触发、然后在捕获所有边沿后完全停止)

当阻塞发生时、迹线如下所示...

被阻断的周期在20ms 至100ms 的任何时间内持续、并且大约发生在1%的时间内。  

在实时 GPIO ISR 中、我尝试了各种组合调用以下命令:

HCI_LE_SetAdvEnableCmd (HCI_DISABLE_ADV)

RFST = 0x01;//发送 LLE CMD_SHUTDOWN (立即停止运行)

RFST = 0x0B;//发送 LLE CMD_STOP (正常停止无线电任务)

//重置链路层引擎
LLECTRL &=~0x01;//LLE_EN 设置为低电平
LLECTRL |= 0x01;//LLE_EN 设置为高电平

//禁用射频 ISR 掩码并清除任何标志,以便不屏蔽中断
IEN2 &=~IEN2_RFIE;
S1CON &=~(S1CON_RFIF_1 | S1CON_RFIF_0);

GAPRole_TerminateConnection()

HCI_EXT_DisconnectImmedCmd (uint16 connHandle)

它们都可以改善这种情况、但仅重置链路层引擎即可完全停止阻塞。  但这有时会使 BLE 堆栈处于不可恢复的状态、需要进行复位才能恢复通信。  我已将 GPIO IRQ 优先级设置为高于 RF IRQ、并且此设计中没有其它运行的外设。 我输出 EA 输出以在 GPIO 上进行监控、似乎阻断是由于堆栈或 OSAL 进入临界区并阻断所有 ISR。

那么、问题是如何立即停止 BLE 活动并允许 GPIO ISR 在不受 BLE 堆栈干扰的情况下触发?

或者

在 LLE 复位后、需要重新配置和设置哪些 BLE 参数和寄存器才能实现100%恢复?

感谢所有的想法和想法!!! 谢谢!

[更新]我想在下面添加其他信息。

如果我在 进入 GPIO ISR 的第一个入口调用 HCI_EXT_DisconnectImmedCmd ()、则 BLE 堆栈似乎会阻止 GPIO ISR 大约20ms。  这会导致 ISR 边沿丢失、我需要跟踪所有事件而不会丢失。  该调用会使 BLE 处于功能状态、但对我们的应用来说不可用。  由于 GPIO 活动是异步的、因此我无法执行任何流控制或这样的暂停。 GPIO 需要优先于 BLE 才能捕获活动。  

请参阅下图(黄色表示 BLE TX、红色表示 GPIO 的 ISR) 红色曲线在进入 ISR 时设置为高电平、并在 HAL_Drivers.c 中处理的事件/任务时设置为低电平

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

    器件型号:CC2541

    是否有办法在不调用处理器复位的情况下完全复位 BLE 堆栈。  如果堆栈在操作期间损坏、在没有复位的情况下重新初始化堆栈将非常有用。  

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

    我们的堆栈专家之一将了解这一点。 复活节期间、请允许我们下周早些时候再次与您联系。

    此致、
    Fredrik
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Fredrik! 我期待着再次听到。 如果电话通话更好、请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Marty、

    由于在应用中捕获 GPIO 边沿非常重要、因此我将在捕获 GPIO 事件时完全禁用中断、然后在 GPIO 事件终止后重新启动堆栈。

    禁用所有中断肯定会使链路层调度程序处于不良状态,但这可以通过 HCI_ResetCmd ()来纠正。 请注意、您可能还需要执行 GAP 器件初始化来重置 GAPRole。

    执行上述命令需要一些时间、但会将堆栈重新初始化为已知状态。

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

    感谢您的反馈。 如果在 BLE 重新初始化的中间、GPIO 触发并再次禁用 BLE IRQ、是否可以立即重新启动该重新初始化? 我无法让重新初始化过程阻止 GPIO ISR。

    是否需要估算重新初始化需要多长时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Marty、

    正确、HCI 复位将使用 在 hal_mcu.h (开源代码)中定义的 HAL_disable_interrupts ()禁用中断。

    我将修改这个宏、以永远不允许禁用您的 GPIO 中断。

    GPIO ISR 触发后、我假设堆栈需要重新初始化并启动。

     


    编辑:HAL_disable_interrupts()是一个宏,已经编译到堆栈中,因此不可修改。

    您是否有任何方法知道 GPIO 边沿不会持续一段时间、或者它们是否可以随时发生?  

    我不知道初始化需要多长时间、但它在 ms 范围内。

     

     

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

    好的、这是不幸的... 我不知道 GPIO 何时处于活动/非活动状态以及该时间有多长。  它基于可能会有所不同的人类用途。

    我已经使用以下代码进行测试、这些代码是在 GPIO ISR 连接期间调用的。 我只在初始 GPIO ISR 进入时调用一次:

    //如果处于连接中,则立即禁用 BLE IRQ

    if (get_ConnectedState ()){
      IEN2 &=~IEN2_RFIE;// RFIE = 0
      S1CON=0;
      RFIRQF1 = 0x00;//清除所有射频内核中断标志
      RFIRQF0 = 0x00;//清除所有射频内核中断标志
      bRFForceShutdown = true;

    在 GPIO 转换超时后、 由于以下事件计时器未复位而导致:    

    OSAL_START_timerEx (hal_taskID、GPIO_TIMEOUT_EVT、DEFAULT_GPIO_WINDOW_PERIOD);  

    然后、我在 GPIO_TIMEOUT_EVT 的任务处理程序中执行以下操作:

    //如果 BLE 连接在 GPIO 期间关闭,请重新启用它
    if (bRFForceShutdown){
      IEN2 |= IEN2_RFIE;// RFIE = 1.
      HCI_EXT_DisconnectImmedCmd (gapConnHandle);
      bRFForceShutdown = false;

    然后、这将重新启动广告、并最终连接和发送 GPIO 数据

    我设置了一个测试套件、该测试套件会按照递增的时间延迟发送一系列 GPIO 脉冲。 延时时间会导致 BLE 连接期间发生 GPIO 脉冲、我将延迟增加10ms。  这种延迟扫描旨在查看 GPIO 何时禁用 BLE 的所有可能的时序方案。  在每个 GPIO 脉冲序列之后、我重新启动广告、连接并尝试发送数据。  请参见下图。 红色轨迹线表示 TX 射频观测输出、黄色轨迹表示 GPIO ISR。  有趣的是、即使在禁用射频 IRQ 后、BLE 堆栈仍会触发另一个 TX 脉冲...

    我已经多次运行此代码800步、发现 BLE 堆栈仍然正常工作、我捕获所有 GPIO 转换。  

    您能否确认我的方法在 BLE 堆栈实现中是否可行?

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

    马蒂

    遗憾的是、上述方法可能会导致堆栈出现意外行为。 此应用完全不用于接触射频内核寄存器。 链路层可能唯一能够从 HCI 复位恢复的方法是禁用中断。

    如果我们能够提供 HCI_RESET 完成可能需要多长时间的时间估计、是否会有所帮助?

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

    这将有助于我们知道、如果它大约为1ms、我们可能仍然可以。 但是、如果它需要10s 的 ms、则需要不同的方法。

    是否有可被监控的方法、标志、寄存器或这样的方法来确定堆栈的运行状况/状态? 然后可以使用我的方法、如果堆栈以某种方式损坏、我会调用 HCI_RESET。 这是可行的、因为 GPIO 阻塞的发生将极低。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sean、你是否有机会查看我对问题的关注?