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.

[参考译文] CC2642R:重复扫描切换后发生零星的多角色 (CC2642R) 状态故障 (Error_raiseX 0x360)- SDK 6.30.0.84

Guru**** 2680515 points

Other Parts Discussed in Thread: CC2642R

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1592288/cc2642r-sporadic-multi-role-cc2642r-state-failure-error_raisex-0x360-after-repeated-scan-toggle---sdk-6-30-0-84

器件型号: CC2642R

1、 硬件和软件环境

  • 芯片: TI CC2642R

  • SDK/堆栈版本: simplelink_cc13x2_26x2_SDK_6.30.00.84

  • 角色: 多角色(中央器件/扫描仪和外设/广告发送器同时)

2. 场景和重现的步骤

  1. 开始广告: GapAdv_enable()调用成功。

  2. 启动扫描: GapScan_enable()调用成功。

  3. 切换扫描: 我们反复呼叫、GapScan_disable()然后按GapScan_enable()

  4. 出现问题: 故障是 非常零星的 。 它可以发生在后面 1. 或经过尽可能多的循环 10 个或以上 周期(有时需要很长的时间才能达到)。 这种不一致性强烈表明 A 竞态条件 未处理的状态转换 可在 BLE 堆栈/RTOS 内快速切换无线电状态。

3、实际问题/症状

故障发生时、设备 软锁定 由于 RTOS/Stack 中的致命、不可恢复异常。 系统进入 Error_SPIN通过调用无限循环Error_raiseX

  • 症状: 最大电流量 [明确说明症状:例如停止执行应用程序代码、停止广播/扫描、需要硬复位]

  • 错误跟踪: 在软锁定点 (Error_raiseX) 观察到以下特定的调试器跟踪:

成正比 数据值
id 0x00000360
a0 3.
a1 87710.

 4.Bar chart 详细参数配置

A.广告参数(来自中的) strAdvParamGapAdv_create

参数 数据值 注释
eventProps 19 组合可连接、可扫描等的属性
primIntMin 67 ≅41.875ms
primIntMax 68 42.5ms
filterPolicy GAP_ADV_WL_POLICY_ANY_REQ 允许来自任何设备的连接/扫描请求。
primPhy GAP_ADV_PRIM_PHY_1MBPS 在 LE 1M PHY 上进行广播。
secPhy GAP_ADV_SEC_PHY_1MBPS LE 1M PHY 上的扩展广播辅助数据包(如果使用)。

事件屏蔽 (GapAdv_setEventMask):

enuEvtMask = GAP_ADV_EVT_MASK_START_AFTER_ENABLE | 
             GAP_ADV_EVT_MASK_END_AFTER_DISABLE | 
             GAP_ADV_EVT_MASK_SET_TERMINATED | 
             GAP_ADV_EVT_MASK_SCAN_REQ_NOT | 
             GAP_ADV_EVT_MASK_END

B.扫描参数 () GapScan_enable

参数 数据值 注释
u8FilterPolicy 1. 仅扫描白名单设备。
u8ScanType 0 被动扫描。
u16ScanInterval 80 50ms。
u16ScanWindow 48 30mS。

Scanning_steps.txt 

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

    您好、Marco、

    谢谢你。 您使用的是原始 6.30.00.84、还是对其应用了任何补丁、如果是、是哪一个?


    此致、
    François μ s。

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

    您好!

    你到底想达到什么目的? 如果您的目标是持续扫描设备、而不是重复调用 GapScan_disable 函数、只能在回调中调用 GAP_EVT_SCAN_DISABLED 事件的 GapScan_enable 函数。

    如果您还没有在这里,我建议您阅读有关扫描的用户指南 : dev.ti.com/.../gap-cc13xx_cc26xx.html

    此致、
    Lea

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

    尊敬的 Lea:

    感谢您的建议。

    连续扫描模型(在回调中重新启用扫描)GAP_EVT_SCAN_DISABLED对于需要始终侦听的设备很有用。

    但是、我们的要求不同:

    • 目标:实现发现 — 连接-冗余

    • 序列:当我们收到要连接的设备通告时、必须立即停止扫描仪GapScan_disable() ()、继续连接、然后重新启用扫描以查找其他设备或保持发现冗余。

    GapScan_disable()无论当前扫描持续时间或超时如何、该序列都需要在过滤和选择目标器件时立即调用。

    此致、
    Marco

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

    您好 Francois、

    感谢您询问增补程序;这是一个重要的细节。

    检查 Git 日志后,我可以确认我们没有使用原始的未打补丁的 SDK v6.30.0.84。 我们在基本 SDK 的基础上集成了多个更新到代码库中。

    具体而言、应用了以下补丁/更新:

    1. 时间同步补丁:直接 TI 补丁应用于 SDK 6.30.0.84 以实现时间同步功能 (Apply TI patch on SDK 6.30.0.84 for time synchronisation feature)。

    2. dtm 命令补丁:应用了一个补丁、以在 Commit note 调用 PTM 模式时支持另外两个命令。 我们在标准的直接测试模式 (DTM) 下运行、我们确认此补丁与 DTM 功能相关。

    3. 新的 TI 汇总补丁:稍后集成了 SDK v6.30.0.84 的新 TI 汇总补丁。

    此致、
    Marco

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

    您好!

    您不必调用 GapScan_disable 来启动与已扫描设备的连接。 您可以在 GAP_EVT_SCAN_DISABLED 事件回调中启动连接。

    此致、
    Lea

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

    尊敬的 Lea:

    我们知道、在某些配置中、我们可以让扫描超时或使用定期扫描来依赖该回调。

    但是、我们需要强调、我们的扫描参数是为连续操作设置的

    • u16Duration = 0U

    • u16Period = 0U

    由于我们的扫描器配置为无限期(连续)运行、因此我们的应用程序满足要求的唯一方法明确调用、即在选择连接设备后立即停止扫描器GapScan_disable()。 我们不能依赖超时或定期停止。

    因此、GapScan_disable()GapScan_enable()在我们的用例中、必须遵循后面的重复快速切换序列。

    此致、
    Marco

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

    您好、

    由于您提到您仍然会调用 scan_disable、因此您将 在堆栈中收到 GAP_EVT_scan_disabled、然后您可以在回调处重新启用扫描。 如果遵循该实施、您是否仍然会看到问题?