你好,现在有个这样的问题,就是我这边本来定义装置为传感器使每5分钟会对外发送一次数据,但是我现在想无线修改它的频段和地址,所以要在不对外发送数据的时候将它调成接收器模式,但是一旦调成接收模式,就会进入一个循环一直在里面就无法再对外发送了,请问有什么办法可以使装置有在不对外发送的时候处于接收模式,其它时刻都处于发送模式。接收部分的射频代码和配置参数都在下面:
上图是接收模式同步运行接收参数,接受参数如下:
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.
SDK:simplelink_cc13x0_sdk_1_30_00_06
stack没有
SDK示例:
发送参数:
rfc_CMD_PROP_TX_t RF_cmdPropTx =
{
.commandNo = 0x3801,
.status = 0x0000,
.pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.pktConf.bFsOff = 0x0,
.pktConf.bUseCrc = 0x1,
.pktConf.bVarLen = 0x1,
.pktLen = 0x14,
.syncWord = 0x930B51DE,
.pPkt = 0
};
接收参数:
rfc_CMD_PROP_RX_t RF_cmdPropRx =
{
.commandNo = 0x3802,
.status = 0x0000,
.pNextOp = 0,
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.pktConf.bFsOff = 0x0,
.pktConf.bRepeatOk = 0x0,
.pktConf.bRepeatNok = 0x0,
.pktConf.bUseCrc = 0x1,
.pktConf.bVarLen = 0x1,
.pktConf.bChkAddress = 0x0,
.pktConf.endType = 0x0,
.pktConf.filterOp = 0x0,
.rxConf.bAutoFlushIgnored = 0x0,
.rxConf.bAutoFlushCrcErr = 0x0,
.rxConf.bIncludeHdr = 0x1,
.rxConf.bIncludeCrc = 0x0,
.rxConf.bAppendRssi = 0x0,
.rxConf.bAppendTimestamp = 0x0,
.rxConf.bAppendStatus = 0x1,
.syncWord = 0x930B51DE,
.maxPktLen = 0xFF,
.address0 = 0xAA,
.address1 = 0xBB,
.endTrigger.triggerType = 0x1,
.endTrigger.bEnaCmd = 0x0,
.endTrigger.triggerNo = 0x0,
.endTrigger.pastTrig = 0x0,
.endTime = 0x00000000,
.pQueue = 0,
.pOutput = 0
};
您好,这边收到工程师的回复如下:
首先,您为什么要使用这样的旧版本 SDK?如果您是刚刚开始开发,则应使用最新的 SDK (4.20)。
我们仍然不知道您在开始时使用了哪些示例以及他们在代码中执行了什么操作。它们停留在哪个循环中、不同射频命令的状态是什么?
在 RX 和 TX 之间切换时没有需要特别注意的事项。只要无线电使用 TX 命令完成,您就可以发送 RX 命令、反之亦然。
如果它们需要在 RX 和 TX 之间更改参数频率,则需要执行新的 CMF_SF。如果他们更改1MHz 的频率模式,他们还需要更改设置命令。为了确保新的 setup 命令生效,需要先关闭射频代码,然后再重新启动。
如果您有问题,应该首先尝试获得一个简单的测试程序,以便能够完成您想要执行的任何操作。使用 rfPacketRX 和 rfPacketTX 示例作为起点。
static void rxTaskFunction(UArg arg0, UArg arg1)
{
set_colFreq();
RF_Params_init(&rfParams);
if (RFQueue_defineQueue(&dataQueue, rxDataEntryBuffer,
sizeof(rxDataEntryBuffer),
NUM_DATA_ENTRIES,
MAX_LENGTH + NUM_APPENDED_BYTES))
{
/* Failed to allocate space for all data entries */
while (1)
;
}
/* Modify CMD_PROP_RX command for application needs */
RF_cmdPropRx.pQueue = &dataQueue; /* Set the Data Entity queue for received data */
RF_cmdPropRx.rxConf.bAutoFlushIgnored = 1; /* Discard ignored packets from Rx queue */
RF_cmdPropRx.rxConf.bAutoFlushCrcErr = 1; /* Discard packets with CRC error from Rx queue */
RF_cmdPropRx.maxPktLen = MAX_LENGTH; /* Implement packet length filtering to avoid PROP_ERROR_RXBUF */
RF_cmdPropRx.pktConf.bRepeatOk = 1;
RF_cmdPropRx.pktConf.bRepeatNok = 1;
RF_cmdPropRx.pOutput = (uint8_t*)&rxStatistics; //将接收结构体赋给协议接收结构体,便于接收过程中查看接收状态及信息
/* Request access to the radio */
rfHandle = RF_open(&rfObject, &RF_prop,
(RF_RadioSetup*) &RF_cmdPropRadioDivSetup, &rfParams);
/* Set the frequency */
RF_postCmd(rfHandle, (RF_Op*) &RF_cmdFs, RF_PriorityNormal, NULL, 0);
/* Enter RX mode and stay forever in RX */
RF_runCmd(rfHandle, (RF_Op*) &RF_cmdPropRx, RF_PriorityNormal, &callback,
IRQ_RX_ENTRY_DONE);
while (1)
;
}
上述标红的部分是目前程序中接收模式下会进入的一个循环,所执行的接收参数如下:
rfc_CMD_PROP_RX_t RF_cmdPropRx =
{
.commandNo = 0x3802,
.status = 0x0000,
.pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.pktConf.bFsOff = 0x0,
.pktConf.bRepeatOk = 0x0,
.pktConf.bRepeatNok = 0x0,
.pktConf.bUseCrc = 0x1,
.pktConf.bVarLen = 0x1,
.pktConf.bChkAddress = 0x0,
.pktConf.endType = 0x0,
.pktConf.filterOp = 0x0,
.rxConf.bAutoFlushIgnored = 0x0,
.rxConf.bAutoFlushCrcErr = 0x0,
.rxConf.bIncludeHdr = 0x1,
.rxConf.bIncludeCrc = 0x0,
.rxConf.bAppendRssi = 0x0,
.rxConf.bAppendTimestamp = 0x0,
.rxConf.bAppendStatus = 0x1,
.syncWord = 0x930B51DE,
.maxPktLen = 0xFF,
.address0 = 0xAA,
.address1 = 0xBB,
.endTrigger.triggerType = 0x1,
.endTrigger.bEnaCmd = 0x0,
.endTrigger.triggerNo = 0x0,
.endTrigger.pastTrig = 0x0,
.endTime = 0x00000000,
.pQueue = 0, // INSERT APPLICABLE POINTER: (dataQueue_t*)&xxx
.pOutput = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};
我想请教的问题是,RF_runCmd函数所执行的上面参数,是因为什么原因会一直进入接收模式无法跳出。
您好,
在上面的设置中,启用了位重复模式(bit repeat modes):
RF_cmdPropRx.pktConf.bRepeatOk = 1;
RF_cmdPropRx.pktConf.bRepeatNok = 1;
这意味着无线永远不会退出 RX 模式(运行命令永远不会返回),除非发生错误(没有更多可用数据条目等)。
run 命令是阻塞的,所以使用 post 代替会让代码进入 while 循环。但是,除非发生错误,或者应用程序调用取消命令,否则 RX 不会终止。