主题中讨论的其他器件:SysConfig
工具与软件:
您好!
对于内部测试、我需要使用射频内核驱动程序(不含 BLE 堆栈)发送有效的 BLE iBeacon 数据包。 我已经了解了在 syscfg 中配置 rfPacketTx 以在 Custom BLE、1Mbps、BT4中进行传输。 我需要一个示例、说明如何配置该应用并构建 BLE 数据包、以便由 BLE 中央扫描仪拾取。
谢谢!
Igor
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.
工具与软件:
您好!
对于内部测试、我需要使用射频内核驱动程序(不含 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
您好 Jan:
我使用 Silabs 蓝牙 NCP Commander 进行扫描、附带 Silabs MG21开发套件。 在连续扫描模式下、扫描仪设置为观察模式。 GUI 会收集并显示所有被拾取的广播(即使是一次)、并更新已经发现的广播。 为避免丢失 rfPacketTx 数据包的机会、我已将 延迟设置为 100ms。
随附了 SmartRF Studio 的屏幕截图、其中包括通道17 (接收数据时)、通道37 (不接收定制数据包)和 NCP 指挥官视图。
谢谢!
Igor
您好、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); }
您好、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