主题中讨论的其他器件:CC1352P7
工具/软件:
存在许多风险
- 频率 : CC1352P7
- SDK 中找到 :SimpleLink SDK 8.30
- 射频模式 :专有低于 1GHz (868MHz)
- 配置 :1 Mbps、350 kHz 偏差、2-GFSK、2.2MHz RX 带宽
我们遇到 TX-RX 命令链问题。 仅 TX 和仅 RX 操作运行良好、但当链接 TX->RX 命令时、即使我们知道远程器件正在传输数据、RX 部分也永远不会接收数据。 我们的协议要求 TX 完成后不久(延迟很小)就会打开 RX 窗口。
测试场景
- 器件 A :发送 请求数据包,然后立即侦听 使用 TX-RX 链的响应数据包
- 器件 B : 正确接收数据包、立即发送 响应数据包
- 问题 :设备 A 完成链 (EVT_CHAIN_DONE)、但从不接收连接请求数据包
static int radio_start_tx_rx_chain(void) {
/* Reset command status */
RF_cmdPropTx.status = 0;
RF_cmdPropRx.status = 0;
/* Configure TX */
RF_cmdPropTx.pPkt = g_radio.current_op.tx_data;
RF_cmdPropTx.pktLen = g_radio.current_op.tx_length;
RF_cmdPropTx.startTrigger.triggerType = TRIG_NOW;
RF_cmdPropTx.startTrigger.pastTrig = 1;
RF_cmdPropTx.pNextOp = (RF_Op*)&RF_cmdPropRx;
RF_cmdPropTx.condition.rule = COND_ALWAYS;
/* Configure RX */
RF_cmdPropRx.maxPktLen = RADIO_MAX_PACKET_LEN;
RF_cmdPropRx.pQueue = &g_radio.rx_data_queue;
RF_cmdPropRx.startTrigger.triggerType = TRIG_NOW;
RF_cmdPropRx.startTrigger.pastTrig = 1;
RF_cmdPropRx.endTrigger.triggerType = TRIG_REL_START;
RF_cmdPropRx.endTime = 8000; // 2ms window
RF_cmdPropRx.pNextOp = NULL;
RF_cmdPropRx.condition.rule = COND_NEVER;
/* Reset RX queue */
g_radio.rx_data_entry.status = DATA_ENTRY_PENDING;
/* Post chain */
g_radio.cmd_handle = RF_postCmd(g_radio.rf_handle,
(RF_Op*)&RF_cmdPropTx,
RF_PriorityNormal,
radio_rf_callback,
RF_EventLastCmdDone);
return (g_radio.cmd_handle >= 0) ? 0 : -1;
}static int radio_start_rx(void) {
/* Reset RX data entry */
g_radio.rx_data_entry.status = DATA_ENTRY_PENDING;
/* Use global RF_cmdPropRx, not cmd_rx_adv */
RF_cmdPropRx.status = 0;
RF_cmdPropRx.maxPktLen = RADIO_MAX_PACKET_LEN;
RF_cmdPropRx.pQueue = &g_radio.rx_data_queue;
/* Configure what gets appended */
RF_cmdPropRx.rxConf.bAutoFlushIgnored = 1;
RF_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
RF_cmdPropRx.rxConf.bIncludeHdr = 1; /* Include length byte */
RF_cmdPropRx.rxConf.bIncludeCrc = 0; /* Don't include CRC */
RF_cmdPropRx.rxConf.bAppendRssi = 1; /* Append RSSI */
RF_cmdPropRx.rxConf.bAppendTimestamp = 1; /* Append timestamp */
RF_cmdPropRx.rxConf.bAppendStatus = 1; /* Append status */
/* Keep RX on for multiple packets */
RF_cmdPropRx.pktConf.bRepeatOk = 1;
RF_cmdPropRx.pktConf.bRepeatNok = 1;
if (g_radio.current_op.rx_timeout_rat > 0) {
RF_cmdPropRx.endTrigger.triggerType = TRIG_REL_START;
RF_cmdPropRx.endTime = g_radio.current_op.rx_timeout_rat;
} else {
RF_cmdPropRx.endTrigger.triggerType = TRIG_NEVER;
}
/* Post RX command directly (no chaining) */
g_radio.cmd_handle = RF_postCmd(g_radio.rf_handle,
(RF_Op*)&RF_cmdPropRx,
RF_PriorityNormal,
radio_rf_callback,
RF_EventRxEntryDone | RF_EventLastCmdDone);
if (g_radio.cmd_handle < 0) {
g_radio.state = RADIO_STATE_IDLE;
return -1;
}
return 0;
}static int radio_start_tx(void) {
/* Prepare TX packet with length byte */
g_radio.tx_packet[0] = g_radio.current_op.tx_length;
memcpy(&g_radio.tx_packet[1], g_radio.current_op.tx_data,
g_radio.current_op.tx_length);
/* Reset global commands */
RF_cmdPropTx.status = 0;
RF_cmdPropRx.status = 0;
RF_cmdPropTx.pPkt = g_radio.current_op.tx_data;
RF_cmdPropTx.pktLen = g_radio.current_op.tx_length;
RF_cmdPropTx.startTrigger.triggerType = TRIG_NOW;
RF_cmdPropTx.startTrigger.pastTrig = 1;
RF_cmdPropTx.pNextOp = NULL;
RF_cmdPropTx.condition.rule = COND_ALWAYS;
/* Post chain */
g_radio.cmd_handle = RF_postCmd(g_radio.rf_handle,
(RF_Op*)&RF_cmdPropTx,
RF_PriorityNormal,
radio_rf_callback,
RF_EventLastCmdDone);
return (g_radio.cmd_handle >= 0) ? 0 : -1;
}问题
- 在与示例不同的专有模式下、TX-RX 链是否需要特定配置?
- 我们是否应该注意 TX END 和 RX START 之间的时序限制?
- 我们是否应该使用 CMD_PROP_TX_ADV/CMD_PROP_RX_ADV 而不是基本命令?
- 链中的 TX 和 RX 之间是否需要最小或最大间隙?
- 最重要的是:是否有任何专有模式下 TX->RX 命令链的参考示例? 我们搜索了 SDK、但只找到了仅 TX 链和仅 RX 操作。
非常感谢有关专有模式的正确 TX-RX 链配置的任何指导。 我们特别需要 RX 在 TX 完成后立即启动、以正确实现我们的协议。






