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.

[参考译文] CC1311P3:CC1311P3–RF_postCmd () 在背对背 TX(1024 B @ 19 200 波特)期间返回 RF_ALLOC 错误、RF_CancelCmd () 并不总是恢复

Guru**** 2644585 points

Other Parts Discussed in Thread: CC1311P3

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1586688/cc1311p3-cc1311p3-rf_postcmd-returns-rf_alloc-error-during-back-to-back-tx-1024-b-19-200-baud-and-rf_cancelcmd-doesn-t-always-recover

器件型号: CC1311P3

我正在使用 CC1311P3 并尝试持续传输 1024 字节 每一次 1 秒 AT 19 200 波特
每一秒、我使用准备两个 TX 数据包 循环缓冲器 然后将它们邮寄到射频驱动器RF_postCmd()、以进行背对背传输。

几个周期后、开始接收数据 RF_ALLOC_ERROR 从。 RF_postCmd()发生这种情况后、无法对新的射频命令排队、射频驱动程序似乎停止响应。

下面是传输代码的简化版本:

// Copy UART data into RF circular buffer
rf_ctrl_isr_store_data(&input[RF_DATA_RD_POS], RF_cmdPropTxAdv_cst.pktLen);

uint8_t index = rf_circ_buffer.read_index;
if (rf_circ_buffer.slots[index].state != SLOT_EMPTY)
{
    RF_cmdPropTxAdv_cst.pPkt = &rf_circ_buffer.slots[index].data;
}
rf_circ_buffer.slots[index].state = SLOT_EMPTY;
rf_circ_buffer.read_index = (rf_circ_buffer.read_index + 1) % BUFFER_SLOT_COUNT;

// Post TX command
RF_CmdHandle cmdHandle = RF_postCmd(rfHandle,
                                    (RF_Op*)&RF_cmdPropTxAdv_cst,
                                    RF_PriorityNormal,
                                    NULL,
                                    0);

START_TYPE = TRIG_NOW;  

  • 消息流 CMD_PROP_TX_ADV

  • 每个数据包使用唯一的缓冲槽

  • 未使用回调处理程序—TX 每秒重复一次

  • 射频驱动器最终返回 RF_ALLOC_ERROR

检测到错误后、我会尝试通过清除并生成射频核心平稳恢复:

RF_cancelCmd(rfHandle, RF_CMDHANDLE_FLUSH_ALL, 1);
RF_yield(rfHandle);

但是、这并不总是能恢复无线电—有时器件会保持卡滞状态(无法再继续恢复 TX)、直到完整的 RF_Close/RF_open 周期或系统复位为止。

您能否帮助提供有关此问题的解决方案?  

谢谢、
四 B

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

    尊敬的 Theiv:  

    由于您使用的是 RF_postCmd、我相信您在通过 rcore 访问循环缓冲区时可能会遇到竞态条件。

    我建议您改用 RF_runCmd、它会阻止、直到在您的用例中完成 TX;或者使用 RF_postCmd 中的回调来取消阻止信标(例如,在 RF_EventCmdDone 上)。

    此致、

    Arthur

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

    嗨 Arthur ,没有,到目前为止我们看不到任何竞争条件,顺便说一下,我们给了循环缓冲深度为 10 个条目,这确保了在指向同一个缓冲区之前,我们假设射频内核执行了以前指向的同一缓冲区索引的 TX 操作。  

    此外、我们已经尝试使用回调方法、在该方法中、我们已经看到在经过 24 次 TX 触发后、我们观察到射频内核在主线程中未处于活动状态。  

    //回调时使用的方法  

    void txDoneCb (RF_handle h、RF_CmdHandle ch、RF_EventMask e)

    /*设置要通过 UART 读取的最大字节数*/
    size_t bytesToRead = MAX_LENGTH;
    IF (E 和 RF_EventLastCmdDone)

    uint8_t index = rf_circ_buffer.read_index;

    if (rf_circ_buffer.slots[index].state!= slot_empty)

    rf_cmdPropTxAdv_cst.ppkt =&rf_circ_buffer.slots[index].data;
    }

    rf_circ_buffer.slots[index].state = slot_empty;
    rf_circ_buffer.read_index =(rf_circ_buffer.read_index+1)%buffer_slot_count;

    RF_CmdHandle cmdHandle;

    cmdHandle = RF_postCmd (rfHandle、(RF_Op*)&RF_cmdPropTxAdv_CST、RF_PriorityHighest、txDoneCb、RF_EventLastCmdDone);

    if (cmdHandle == RF_ALLOC_ERROR)

    #if 0
    RF_CancelCmd (rfHandle、cmdHandle、1);
    RF_pendCmd (rfHandle、cmdHandle、RF_EventCmdCanceled);
    #endif

    如果是 1
    RF_CancelCmd (rfHandle、RF_CMDHANDLE_FLUX_ALL、2);
    rfHandle);
    RadioBusy = false;
    #endif
    }
    暴露

    CNT++;
    }

    RadioBusy = false;
    }
    /*恢复 UART 读取*/
    STATUS = UART2_READ (UART、&INPUT、bytesToRead、NULL);
    }


    // T ADV CMD  
    RF_cmdPropTxAdv_CST.pktLen = 0;
    RF_cmdPropTxAdv_CST.startTriggerType = TRIG_NOW;
    RF_cmdPropTxAdv_CST.startTrigger.pastTrig = 1;
    RF_cmdPropTxAdv_CST.StartTime = 0;


    // TX ADV 触发方法

    RF_Ctrl_isr_store_data (&input[RF_DATA_RD_POS]、RF_cmdPropTxAdv_CST.pktLen);

    uint8_t index = rf_circ_buffer.read_index;
    if (rf_circ_buffer.slots[index].state!= slot_empty)

    rf_cmdPropTxAdv_cst.ppkt =&rf_circ_buffer.slots[index].data;
    }
    rf_circ_buffer.slots[index].state = slot_empty;
    rf_circ_buffer.read_index =(rf_circ_buffer.read_index+1)%buffer_slot_count;


    IF(RadioBusy)

    /*恢复 UART 读取*/
    STATUS = UART2_READ (UART、&INPUT、bytesToRead、NULL);
    返回;
    }

    RadioBusy = true;


    cmdHandle = RF_postCmd (rfHandle、(RF_Op*)&RF_cmdPropTxAdv_CST、RF_PriorityHighest、txDoneCb、RF_EventLastCmdDone);

    谢谢、
    专题 B

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

    尊敬的 Theiv:

    感谢您的信息。 我仍然认为、您可能会提交更多可以在给定时间处理的命令。

    我建议您在单独的线程中转到 RF_postCmd、并在从 txDoneCb 发布的信标上挂起。 例如: LP-CC1312R7:如何切换射频 SEC/Tx — 射频和微波论坛-射频和微波 — TI Rx 支持论坛

    此致、

    Arthur