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:传感器 SPI 上的电流消耗高+自动关断放大器;BLE 错误问题

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1579511/cc2340r5-high-current-consumption-on-sensor-spi-auto-shutdown-ble-error-issue

器件型号: CC2340R5

您好 TI 支持团队:

我们通过 SPI 使用传感器、并观察到以下行为:

  • 当传感器处于活动状态并保持 SPI 接口打开时、电流消耗约为 1.3mA

  • 如果我们在每个 SPI 事务后关闭 SPI 接口、则电流会降至约 35µA 、这是预期的。

  • 不过、经过一段时间后、该器件就会出现 自动关闭电源 我们是这样的 无法再通过 BLE 扫描检测到它

似乎在每个事务后关闭 SPI 接口可能会触发意外的关断或深度睡眠条件。

我们希望你在以下方面提供指导:

  • 为什么器件在关闭 SPI 后会自动关闭?

  • 有任何问题吗 建议的序列或配置 µA 在仍实现低功耗(μ A 范围)的同时避免这种行为?

  • 是否有任何与相关的已知问题或勘误表 影响 BLE 可用性的 SPI +传感器交互


其他意见:

我们在以下 SDK 版本中还会遇到与 BLE 相关的错误:

测试的 SDK 版本:

  • 9.11.01.19

  • 9.12.00.19

  • 9.11.00.18

遇到 BLE 错误:

#define bleNoResources     0x15  //!< There are no resources available
#define bleMemAllocError   0x13  //!< Memory allocation error occurred

期待您的指导。

谢谢您、
Sulay

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

    您好、Sulay、

    感谢您联系我们! 这是相当奇怪的行为,不应该发生。我认为这可能是您在任务之间切换上下文的方式的问题,或者可能是缺少上下文切换。  

    您如何以及在哪里调用 spi_transfer()? 您是否更改了 BLE 栈创建的任何任务的优先级?

    此致、

    Tarek D

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

    尊敬的 Tarek D

    感谢您的答复。

    我们尚未修改任何 BLE 栈任务的优先级。
    SPI 事务在中执行S2LP_CORE_SPI.c、在中、我们打开和关闭每个操作的 SPI 接口(和绕过调用)SPI_open()SPI_close()SPI_transfer()。 SPI 用于与通信 S2LP 收发器

    BLE 广播每一次刷新一次 30 秒 、其中我们停止广播BLEAppUtil_advStop() ()、重新初始化 ()、BLEAppUtil_initAdvSet()并重新启动广播 ()BLEAppUtil_advStart()。 广播间隔是 100ms 9.5s. 、具体取决于模式。

    每次事务后关闭 SPI 接口时、电流消耗正确下降至约 35µA 过了一段时间 器件自动关断 并且在 BLE 扫描期间不再可见。
    如果我们使 SPI 持续打开、则不会发生该问题、但电流仍在附近 1.3mA

    有趣的是,当我们 跳过 S2LP 初始化 、尽管我们间歇性地看到以下 BLE 错误、但设备仍能稳定地运行(无关机问题):

    #define bleNoResources   0x15  //!< There are no resources available   #define bleMemAllocError 0x13  //!< Memory allocation error   

    请确认:

    • 这种行为是否可以与 BLE 任务的上下文切换或电源管理冲突相关联?
    • 是否有建议的方法来管理基于 BLE 的应用中的 SPI 初始化/取消初始化、以保持低电流而不会导致不稳定?

    此致、
    Sulay Radadiya

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

    您好、Sulay、

    我认为这种行为与错误的上下文切换有关、或可能在错误的上下文中使用 SPI_TRANSFER。 您能给我提供有关您的用例的更多信息吗? 您是在 BLE 任务中还是在其他任务中调用 SPI 传输? 它是否在中断上下文中调用?

    此致、

    Tarek D

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

    您好 Tarek、

    我们的所有任务都有单独的线程、SPI 传输方式如下 不会 从任何中断上下文调用。 SPI 事务定期执行(大约每 30 秒执行一次)、每个事务仅持续几毫秒。

    此致、

    Sulay Radadiya

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

    您好、Sulay、

    在 8.40 和 9.11 SDK 之间对 SPI 驱动程序进行的更改极小、因此这种行为冲击了我。 关于这个问题、我还有几个问题:

    1-您说您每 30 秒刷新一次广告。 这是如何实现的? 它是从 BLE 任务中进行的、您是否正在使用  BLEAppUtil_advStop 和 BLEAppUtil_advStart 与 BLEAppUtil_invokeFunction 或 BLEAppUtil_invokeFunctionNoData 合并 API 调用? 如果不是、您能尝试将其包装起来、让我知道问题是否仍然存在?

    2-您提到看到以下错误:
    #define bleNoResources   0x15  //!<没有可用资源  #define bleMemAllocError 0x13 //  !<内存分配错误   
    在哪里可以看到这些错误? 您是否还在监视堆和任务大小?

    此外、关于您先前提出的问题:

    如果有建议的方法来管理基于 BLE 的应用中的 SPI 初始化/取消初始化、从而保持低电流而不会导致不稳定?

    通常、如果 SPI 传输依赖于从 BLE 任务接收事件、我们建议调用信标或使用 FreeRTOS API(如 xEventGroupSetBits ()) 将上下文切换到实际进行 SPI 传输的另一个任务。  

    我将等待您的答复! 希望我们能尽快解决这个问题!

    此致、

    Tarek D

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

    感谢您的答复。
    我随附了固件 ZIP 文件 BLEAppUtilTask.c 以便双方更好地理解。 这些信息有助于提供有关我们正在观察的问题的更多背景信息。

    由于这个问题对我们目前的发展来说是十分紧迫的、我们希望这样做 快速跟踪分辨率
    请分享您的 星期五上团队会议的可用性和首选电子邮件 ID 我们可以一起讨论和调试这一点吗?

    期待您的确认。

    https://singaix-my.sharepoint.com/:f:/g/personal/ravindra_parmar_singularityaix_com/EkXjScZRc-tKr5WVUiucN6AB1kJYT777WBaIMqsGffLYfg?e=lW4UY1

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

    您好、Sulay、

    很抱歉、但我不能出席会议。 E2E 是一个论坛、解答有关使用 TI 器件、工具和资源的问题。 如需会议请求和代码审核、请联系负责您账户的 FAE。

    请对我之前提出的答案作出答复、以便我们有希望解决此问题!

    此致、

    Tarek D

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

    1-您说您每 30 秒刷新一次广告。 这是如何实现的? 它是从 BLE 任务中进行的、您是否正在使用 BLEAppUtil_advStop 和 BLEAppUtil_advStart 与 BLEAppUtil_invokeFunction 或 BLEAppUtil_invokeFunctionNoData 合并 API 调用? 如果不是、您能尝试将其包装起来、让我知道问题是否仍然存在?

    我们有针对 BLE、SPI 和主应用运行的单独线程。 我们在主线程中运行一个计时器、每 30 秒我们调用一次  

    BLEAppUtil_enqueueMsg (BLEAPPUTIL_EVT_application、NULL);  将这个情况传递到 BLE 线程。  BLEAPPUTIL_EVT_application 是我们的定制案例在 bleapputiltask.c 文件中添加:

    case BLEAPPUTIL_EVT_APPLICATION:
                  {
                    bStatus_t status = SUCCESS;
    
                    // Stop current advertising
                    status = BLEAppUtil_advStop(peripheralAdvHandle_1);
                    printf("BLEAppUtil_advStop Error Code: %d\n", status);
    
                    // Reinitialize advertising set
                    // start_updated_adv = true;
    
                    advSetInitParamsSet_1.advData = advData2;
                    advSetInitParamsSet_1.advDataLen = sizeof(advData2);
    
                    advSetInitParamsSet_1.scanRespData = scanData2;
                    advSetInitParamsSet_1.scanRespDataLen = sizeof(scanData2);
    
    
                    status = BLEAppUtil_initAdvSet(&peripheralAdvHandle_1, &advSetInitParamsSet_1);
                    printf("BLEAppUtil_initAdvSet Error Code: %d\n", status);
    
                    // Start advertising with new parameters
                    status = BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1);
                    printf("BLEAppUtil_advStart Error Code: %d\n", status);
    
                    break;
                  }

    #define bleNoResources   0x15  //!<没有可用的资源   
    #define bleMemAllocError 0x13  //!<内存分配错误   

    仅在上述代码段中的 printf 观察到上述 2 个错误。

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

    您好、Shivam、

    我认为问题可能与内存分配错误或内存分配不足有关。 即使您对消息进行了正确的排队、内存也没有正确分配。  

    我建议使用  BLEAppUtil_invokeFunction 或 BLEAppUtil_invokeFunctionNoData 绕过 advstop 和 advstart 调用、因为它正确分配了内存、如下面的屏幕截图所示

    我希望这将解决您的问题!

    此致、

    Tarek D

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

    您好 Tarek、

    感谢您的建议。 我尝试按照建议使用 BLEAppUtil_invokeFunction 和 BLEAppUtil_invokeFunctionNoData 绕过 advStop 和 advStart 调用、但不幸的是、问题仍然存在。

    该行为保持不变—即使应用了与正确内存分配相关的更改、也会出现同样的问题。 如果您建议执行任何额外的步骤或调试检查、以便进一步找出原因、敬请告知。

    此致、
    Shivam Singh

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

    您好、Shivam、

    我很抱歉错过了这一点,但是你能 用 BLEAppUtil_invoikeFunction 来包装 BLEAppUtil_initAdvSet 实例 吗? 请告诉我、这是否返回相同的错误代码。

    我还在寻找其他可能的原因。 我们希望很快就能解决这个问题!

    此致、

    Tarek D