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:使用 rfPacketTx 应用传输 BLE iBeacon 数据包

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1461155/cc2652r-transmit-ble-ibeacon-packet-with-rfpackettx-app

器件型号:CC2652R
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

对于内部测试、我需要使用射频内核驱动程序(不含 BLE 堆栈)发送有效的 BLE iBeacon 数据包。 我已经了解了在 syscfg 中配置 rfPacketTx 以在 Custom BLE、1Mbps、BT4中进行传输。 我需要一个示例、说明如何配置该应用并构建 BLE 数据包、以便由 BLE 中央扫描仪拾取。

谢谢!

Igor

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

    您好、Igor、

    除了必要的 SysConfig 更改之外、我还对 rfPacketTx.c 文件进行了简单修改、以便它发送不可连接的 BLE 广播。  请注意、没有相应更改任何评论。  我已在 Smart RF Studio 内验证接收到这些数据包、请确定这是否也适合您的应用。   如果需要进一步修改、您还可以参考 rflib API 文档。

    e2e.ti.com/.../8623.rfPacketTx.c

    此致、
    Ryan

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

    Ryan、您好!

    感谢您提供示例代码。 如果在数据通道17上进行传输、我已经运行该文件、并且可以在 SmartRF Studio 中看到数据。 如果我更改为广播信道、则 常规 BLE 扫描仪无法看到有效载荷。 我已经附上了 SysConfig 的屏幕截图。

    谢谢!

    Igor

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

    尊敬的 Igor:

    我懂了。 您能描述您的扫描仪设置吗? 是只发送一个数据包还是持续发送数据包? 如果您使用的是智能手机扫描仪、则该应用可能不会报告单个广播、并且需要多个广播。

    此致、

    1月

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

    您好 Jan:

    我使用 Silabs 蓝牙 NCP Commander 进行扫描、附带 Silabs MG21开发套件。 在连续扫描模式下、扫描仪设置为观察模式。 GUI 会收集并显示所有被拾取的广播(即使是一次)、并更新已经发现的广播。 为避免丢失 rfPacketTx 数据包的机会、我已将 延迟设置为 100ms。

    随附了 SmartRF Studio 的屏幕截图、其中包括通道17 (接收数据时)、通道37 (不接收定制数据包)和 NCP 指挥官视图。

    谢谢!

    Igor

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

    您好!

    明白了。 感谢您的深入分析! 您能否确认 CC2652实际上正在传输? 您可以通过检查功耗或将射频输出连接到频谱分析仪来验证这一点。

    此致、

    1月

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

    您好、Jan:

    我自己使用作为 LaunchPad 的 LED 切换确认、它没有崩溃或卡在调试器中。 遗憾的是、我无法检查功耗或使用频谱分析仪。  

    但我同意、当通道发生更改时、它可能无法传输、但其行为会完全相同。 我将尝试检测代码中的 switch 语句、然后查看是否出现任何错误。

    谢谢!

    Igor

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

    尊敬的 Igor:

    听起来不错! 一旦您有机会进行修改并重新测试、请告知我们。

    此致、

    1月

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

    您好、Jan:

    我在所有错误情况下添加了 while (1)、代码正在运行。 我想它在传输。

    .

            switch(terminationReason)
            {
                case RF_EventLastCmdDone:
                    // A stand-alone radio operation command or the last radio
                    // operation command in a chain finished.
                    break;
                case RF_EventCmdCancelled:
                    // Command cancelled before it was started; it can be caused
                // by RF_cancelCmd() or RF_flushCmd().
                    while(1);
                    break;
                case RF_EventCmdAborted:
                    // Abrupt command termination caused by RF_cancelCmd() or
                    // RF_flushCmd().
                    while(1);
                    break;
                case RF_EventCmdStopped:
                    // Graceful command termination caused by RF_cancelCmd() or
                    // RF_flushCmd().
                    break;
                default:
                    // Uncaught error event
                    while(1);
            }
    
            uint32_t cmdStatus = ((volatile RF_Op*)& RF_cmdBleAdvNc_bt5le1madvnc_1)->status;
            switch(cmdStatus)
            {
                case BLE_DONE_OK:
                    // Packet transmitted successfully
                    break;
                case BLE_DONE_STOPPED:
                    // received CMD_STOP while transmitting packet and finished
                    // transmitting packet
                    break;
                case BLE_DONE_ABORT:
                    // Received CMD_ABORT while transmitting packet
                    while(1);
                    break;
                case BLE_ERROR_PAR:
                    // Observed illegal parameter
                    while(1);
                    break;
                case BLE_ERROR_NO_SETUP:
                    // Command sent without setting up the radio in a supported
                    // mode using CMD_PROP_RADIO_SETUP or CMD_RADIO_SETUP
                    while(1);
                    break;
                case BLE_ERROR_NO_FS:
                    // Command sent without the synthesizer being programmed
                    while(1);
                    break;
                case BLE_ERROR_TXUNF:
                    // TX underflow observed during operation
                    while(1);
                    break;
                default:
                    // Uncaught error event - these could come from the
                    // pool of states defined in rf_mailbox.h
                    while(1);
            }

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

    谢谢 Igor、

    我还观察到按预期每500ms 唤醒一次的情况、以及一个指示无线电传输的电流分布

    Jan 和我将尝试进一步评估无线数据包是否按预期频率发送。

    此致、
    Ryan

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

    您好、Ryan 和 Jen、感谢您的支持。 期待了解您的调查结果。

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

    尊敬的 Igor:

    我只是想提供快速更新。 我们再现了您在我方报告的行为。 在信道17上广播效果不错、但 SmartRF 接收器似乎未拾取其他信道。 我们将继续对此进行研究、并尽快提供更新。

    此致、

    1月

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

    您好、Jan:

    我比较了 rfPacketTx SysConfig 生成的 ti_radio_config.c 文件和 Smart RF Studio 7设置之间的 BLE 命令参数、此时我发现 ti_radio_config.c 保持相同的 RFC_CMD_BLE_ADV_NC_t whitening.init 值、而 Smart RF Studio 7会为每个通道更改该值。

    我将 Debug/syscfg/ti_radio_config.c 文件复制到 rfPacketTx 的主目录、从 SysConfig 编辑器("显示生成的文件"视图)中构建了 ti_radio_config.c、并手动编辑了 whitening.init 的值、以反映 Smart RF Studio 7相同通道中显示的值。  重新构建并运行 rfPacketTx 后、我发现至少通道18正常工作、而以前没有。  因此、这似乎是 Prop 射频 SysConfig 错误。

    对于广播通道37、我注意到  RFC_CMD_BLE_ADV_NC_t 通道值在生成的 ti_radio_config.c 和 Smart RF Studio 7设置之间存在差异。  因此、您可能也需要更改该值。  您可以使用上面概述的步骤或在 rfPacketTx.c 文件中实施更改

    // PSEUDO-CODE FOR ADVERTISING CHANNEL 37
    
    RF_cmdBleAdvNc_bt5le1madvnc_0.channel = 0x25;
    RF_cmdBleAdvNc_bt5le1madvnc_0.whitening.init = 0x65;
    RF_cmdBleAdvNc_bt5le1madvnc_0.whitening.bOverride = 1;
    
    RF_cmdFs_bt5le1madvnc_0.frequency = 0x0962;

    此致、
    Ryan

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

    您好、Ryan、

    感谢您的更新! 我已经应用了您对代码的更改、我可以在 SmartRF Studio 中看到来自 rfPacketTx 的广播、如下面的屏幕截图所示(Mac 中填充了0x66、有效载荷为0xCC)。 但是,我的低效扫描仪仍然无法接收这些广告。 已通过 Nordic 监听器+ Wireshark 验证、但广告仍未被接收。 我是否在配置中丢失了一些东西?

    谢谢!

    Igor

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

    您好、Ryan、

    我有另一个更新。 广告似乎在摇摆、并且正在传输。

    不确定为什么不会选择所有广播(在有效载荷末尾添加了序列号、代码如下所示)。 我并不期望100%的 advs 会被选中,但有很多差距。 附加了 Wireshark 的屏幕截图。 最后一列"数据"是序列号。

    谢谢!

    Igor

    static uint8_t packet[] = { 0x02, 0x01, 0x06,
                                0x06, 0x08, 0x54, 0x49, 0x53, 0x49, 0x4D,
                                0x04, 0xFF, 0xCC, 0xCC, 0x00};
    static uint16_t seqNumber;
    static uint16_t baddr[3] = {0x6666, 0x6666, 0x6666};
    
    /***** Function definitions *****/
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF);
    
        RF_cmdBleAdvNc_bt5le1madvnc_1.pParams->advLen = sizeof(packet);
        RF_cmdBleAdvNc_bt5le1madvnc_1.pParams->pAdvData = packet;
        RF_cmdBleAdvNc_bt5le1madvnc_1.pParams->pDeviceAddress = baddr;
        //RF_cmdBleAdvNc_bt5le1madvnc_1.channel = 17;
        RF_cmdBleAdvNc_bt5le1madvnc_1.startTrigger.triggerType = TRIG_NOW;
    
        RF_cmdBleAdvNc_bt5le1madvnc_1.channel = 0x25;
        RF_cmdBleAdvNc_bt5le1madvnc_1.whitening.init = 0x65;
        RF_cmdBleAdvNc_bt5le1madvnc_1.whitening.bOverride = 1;
    
        RF_cmdFs_bt5le1madvnc_1.frequency = 0x0962;
    
        /* Request access to the radio */
    #if defined(DeviceFamily_CC26X0R2)
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioSetup, &rfParams);
    #else
        rfHandle = RF_open(&rfObject, &RF_prop_bt5le1madvnc_1, (RF_RadioSetup*)&RF_cmdBle5RadioSetup_bt5le1madvnc_1, &rfParams);
    #endif// DeviceFamily_CC26X0R2
    
        /* Set the frequency */
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs_bt5le1madvnc_1, RF_PriorityNormal, NULL, 0);
    
        while(1)
        {
            /* Create packet with incrementing sequence number and random payload */
            packet[sizeof(packet) - 1] = seqNumber++;
    
            /* Send packet */
            RF_EventMask terminationReason = RF_EventCmdAborted | RF_EventCmdPreempted;

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

    Ryan、您好、频道37上的广告好像不错。 我没有对其进行正确测试。

    我尝试更改配置以在其他广播信道上进行传输、但无法接收广播。 我已在通道39的代码中进行以下更改:

        RF_cmdBleAdvNc_bt5le1madvnc_1.channel = 0x27;
        RF_cmdFs_bt5le1madvnc_1.frequency = 2480;

    我在普通扫描仪或智能工作室都看不到广告。

    谢谢、Igor

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

    尊敬的 Igor:

    很高兴您能在第37频道上看到广告! 关于通道38、您是否也复制/粘贴 SmartRF 生成的射频配置?

    此致、

    1月

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

    大家好、Jan、Ryan、

    我设法从 SmartRF Studio 中提取频道39的频率设置、然后我可以看到广播。 我想我的问题现在已经解决了。  

    感谢您的帮助!

    Igor