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.

[参考译文] CC2652R:连续 BLE 扫描产生损坏的扫描结果

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1259916/cc2652r-continuous-ble-scan-gives-corrupted-scan-results

器件型号:CC2652R

在我们的测试环境中、我们 每2秒就有6000个标签信标。  然后、当 TI2652R1/R7在几秒钟内进行连续扫描或60%或更高占空比时、主机正在通过 UART 接收垃圾位。 然后、我们需要重置无线电以恢复它。

可以使用50多个标签重现此过程、但可能需要几秒钟时间。

 硬件:CC26x2R1 Launch Pad

FW:HOST_TEST 版本:0.2.40.552 00 (SDK:7_10_01_24)

 

此问题已提前报告、希望修复 https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1087555/cc2652r-ble-scan-issue-util_systemerrorevent-sdk-5-20-5-30-and-5-40-00-02

 我们仍然会看到最新 SDK 存在问题。

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

    尊敬的 Sen:

    感谢您与我们联系。

    如前所述、该问题是由 UART 接口提供的吞吐量有限引起的。 这意味着我无法提供修复、而是解决问题的方法。

    之前提出的建议(在您引用的主题中)仍然是准确的。 我假设您应用了与您的用例相关的线索、现在我将为您提供其他线索。

    -首先,你可以考虑在 UART 级别实施某种流量控制,这样就能避免 UART 过度泛滥(导致崩溃)。 注意:这是以可能丢弃一些数据包为代价的。 我建议在文件中实现此目的、 \SOURCE\ti\ble5stack\NPI\NPI\NPI_task.c src 请参阅我在身边执行此操作的方式(未经过全面测试、仅供您参考) /cfs-file/__key/communityserver-discussions-components-files/538/npi_5F00_task.diff

    第二,我理解你的系统的主要任务是收集信标。 但是、您需要传输到主机的最小数据子集是多少? 以不符合 HCI 标准的方式报告信标是否可行? 例如、您可以考虑更改数据包的第一个字节(通常包含 HCI 事件的类型)、并且仅传输对主机有用的元素。 例如、根据此建议、您可以为广告事件设置固定大小的报告、因此您只需要事件的类型(1字节)、 然后、您可以去掉 EventCode (2字节)、DataLength (1字节)、 Event (2字节)、状态(1字节)和 EventID (4字节)。 此外、如果您知道所有广播器都使用相同的广播类型、地址类型、主 PHY、辅助 PHY、AdvSid、 TxPower、directAddrType、DirectAddr、PeriodicAdvInt 和 DataLength、您可以清除更多的字节。
    这是广告报告看起来的样子。 主机在与您的用例类似的用例中通常所需的元素均为绿色(当然、这将取决于您的要求)。

    为了实现这一点、我建议修改文件中的 HCI_tl_aeScanEventCallbackProcess 和 HCI_tl_legacyScanEventCallbackProcess 的内容 \source\ti\ble5stack\iCall\app\iCall_hci_tl.c
    下面介绍了如何修改上述两个回调中的代码(应根据您的确切要求进行调整)。

                        msg->hdr.event  = HCI_EVENT_PACKET; // Keep this
                        msg->hdr.status = 0xFF;             // Keep this
    
                        msg->pktLen = HCI_EVENT_MIN_LENGTH + HCI_ADV_DIRECTED_REPORT_EVENT_LEN; // Reduce this to fit your needs
                        msg->pData  = (uint8*)(msg+1);
    
                        msg->pData[0] = HCI_EVENT_PACKET; // Change this to use a different one (so you can recognize the packet)
                        msg->pData[1] = HCI_LE_EVENT_CODE; // May be removed 
                        msg->pData[2] = HCI_ADV_DIRECTED_REPORT_EVENT_LEN; // May be removed 
    
                        msg->pData[3]  = HCI_BLE_DIRECT_ADVERTISING_REPORT_EVENT;  // May be removed 
                        msg->pData[4]  = extAdvRpt->numRpts; // May be removed 
                        msg->pData[5]  = 1; // May be removed 
    
                        msg->pData[6]  = extAdvRpt->addrType; // Keep this one but change the table index  
                        memcpy(&msg->pData[7], extAdvRpt->addr, B_ADDR_LEN); // Keep this one but change the table index  
                        msg->pData[13] = LL_DEV_ADDR_TYPE_RANDOM; // May be removed 
                        memcpy(&msg->pData[14], extAdvRpt->directAddr, B_ADDR_LEN); // May be removed 
                        msg->pData[20] = extAdvRpt->rssi;
    
                        NPITask_sendToHost((uint8_t *)msg);

    -第三,你可能想考虑购买一个稍大的 RAM 的设备(它只有当你看到一些尖峰在活动,但它不会帮助增加吞吐量)。 为此、可以考虑使用与 CC2652R 引脚对引脚兼容并具有相同软件 API 的 CC2652R7。

    请告诉我您的反馈。

    此致、

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

    感谢  特的精心回答。

    1. 我们将尝试这种方法并更新您的信息。 我只是想知道为什么它没有作为解决方案的一部分实施、以及当数据包被丢弃时主机没有被告知。

    2. 不仅是扫描、在这之后、我们还可以进行发现和连接读/写。 这种方法可能会使问题复杂化。

    3. 我们已经有一些采用 R7的电路板、但确实会 看到这个问题。

      谢谢。

      SEN