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.

CC1310: CC1310双向通讯

Part Number: CC1310

你好,现在有个这样的问题,就是我这边本来定义装置为传感器使每5分钟会对外发送一次数据,但是我现在想无线修改它的频段和地址,所以要在不对外发送数据的时候将它调成接收器模式,但是一旦调成接收模式,就会进入一个循环一直在里面就无法再对外发送了,请问有什么办法可以使装置有在不对外发送的时候处于接收模式,其它时刻都处于发送模式。接收部分的射频代码和配置参数都在下面:

上图是接收模式同步运行接收参数,接受参数如下:

  • 您好,

    感谢您的对TI产品的关注!为更加有效地解决您的问题,我需要多一些时间查看这个问题,稍后会为您解答。

  • 您好,

    请提供有关您使用的 SDK、stack(如果有)、SDK 中的代码示例以及在 RX 和 TX 之间修改的设置的详细信息。还需要有关如何完成更改的详细信息。

  • 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 命令生效,需要先关闭射频代码,然后再重新启动。

    您可以参考如下内容:(+) CC1310: CC1310 Examples. Change of the frequency by end program user. - Sub-1 GHz forum - Sub-1 GHz - TI E2E support forums

    如果您有问题,应该首先尝试获得一个简单的测试程序,以便能够完成您想要执行的任何操作。使用 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 不会终止。

  • 你好,那个我看了下我代码里面

    RF_cmdPropRx.pktConf.bRepeatOk = 0;
    RF_cmdPropRx.pktConf.bRepeatNok = 0;

    这两个参数是等于0的呀没有等于1呀

  • 您好,

    收到您的跟进消息,帮您同步工程师,有消息联系您。

  • 您好,收到工程师的回复:

    正如工程师十天前说的,希望您应该首先尝试操作一个简单的测试程序,以便能够完成您想要执行的任何操作。可以使用 rfPacketRX 和 rfPacketTX 示例作为起点。如果未能使其正常工作,我们应该很容易对其进行相同的测试,并尝试找出他们做错了什么。

    我们需要最终能够重现问题,才能够帮助到您。关于您所提供的信息片段是不够的。

    您这边能用 rfPacketRX 和 rfPacketTX 示例作为起点尝试做出一个能达到您想要目的的测试程序吗?