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:rf_postCmd (&rf_cmdPropcs 或&rf_cmdPropTx 或&rf_cmdPropRx)如何检测和处理所有错误情况?

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1416637/cc1310-rf_postcmd-rf_cmdpropcs-or-rf_cmdproptx-or-rf_cmdproprx-how-to-detect-and-handle-all-error-cases

器件型号:CC1310

工具与软件:

你(们)好、

RF_postCmd ()函数调用用户指定的事件处理程序,并使用事件掩码指定感兴趣的事件。 可以轻松地指定和处理良好事件、但如何检测任何/所有错误并处理它们?

下面是在传输数据包之前执行空闲通道评估的示例代码:

void rf_modem_tx_callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
{
    if(e & RF_EventLastCmdDone)
    {
        e &= ~RF_EventLastCmdDone;
        if(RF_cmdPropTx.status == PROP_DONE_OK)
        {
            rf_modem_on_evt(RF_MODEM_EVT_TX_DONE);
        }
        else
        {
            rf_modem_on_evt(RF_MODEM_EVT_TX_TIMEOUT);
        }
    }
    // Unhandled event?
    if(e != 0)
    {
        rf_modem_on_evt(RF_MODEM_EVT_TX_ERROR);
    }
}

bool rf_modem_tx_cca_start(uint8_t * data, uint8_t nr_of_bytes, int8_t rssi_th)
{
    RF_cmdPropCs.status                   = IDLE;
    RF_cmdPropCs.pNextOp                  = (rfc_radioOp_t *)&RF_cmdPropTx;
    RF_cmdPropCs.condition.rule           = COND_STOP_ON_TRUE;
    RF_cmdPropCs.csConf.bEnaRssi          = 1;
    RF_cmdPropCs.csConf.busyOp            = 1;
    RF_cmdPropCs.csConf.idleOp            = 1;
    RF_cmdPropCs.rssiThr                  = rssi_th;
    RF_cmdPropCs.csEndTrigger.triggerType = TRIG_NEVER;

    RF_cmdPropTx.status                   = IDLE;
    RF_cmdPropTx.pktLen                   = nr_of_bytes;
    RF_cmdPropTx.pPkt                     = data;
    RF_cmdPropTx.startTrigger.triggerType = TRIG_NOW;

    rf_modem_cmd_handle = RF_postCmd(rf_modem_handle, (RF_Op *)&RF_cmdPropCs, RF_PriorityNormal, &rf_modem_tx_callback, RF_EventLastCmdDone);    

    return (rf_modem_cmd_handle >= 0);
}

使用 bmEvent = RF_EventLastCmdDone 调用 RF_postCmd。 即使 RF_cmdPropcs 或 RF_cmdPropTx 期间发生了错误、在任何情况下都是否会调用 RF_MODEM_TX_CALLBACK ()?

在某些情况下、可以通过设置多个事件位来调用回调函数吗? 那么、我清除特定事件位的方法是否更安全、以便检测任何未处理的事件?

以下是我接收数据包的示例代码:

static void rf_modem_rx_callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
{
    if(e & RF_EventRxEntryDone)
    {
        rfc_dataEntryGeneral_t * data_entry;
        uint8_t *                packet_data;

        e &= ~RF_EventRxEntryDone;

        data_entry = RFQueue_getDataEntry();

        rf_modem_rx_packet_length = *(uint8_t *)(&data_entry->data);
        packet_data               = (uint8_t *)(&data_entry->data + 1);
        memcpy(rf_modem_rx_packet, packet_data, rf_modem_rx_packet_length);
        rf_modem_on_evt(RF_MODEM_EVT_RX_DONE);

        RFQueue_nextEntry();
    }
    if(e & RF_EventLastCmdDone)
    {
        e &= ~RF_EventLastCmdDone;

        if(rf_modem_rx_packet_length == 0)
        {
            rf_modem_on_evt(RF_MODEM_EVT_RX_TIMEOUT);
        }
    }

    if(e != 0)
    {
        rf_modem_on_evt(RF_MODEM_EVT_RX_ERROR);
    }
}

bool rf_modem_rx_start(uint32_t timeout_ms)
{
    memset(&rf_modem_rx_stats, 0, sizeof(rf_modem_rx_stats));

    RF_cmdPropRx.status                 = IDLE;
    rf_modem_rx_packet_length           = 0;
    RF_cmdPropRx.pktConf.bUseCrc        = 0;
    RF_cmdPropRx.endTrigger.triggerType = TRIG_REL_START;
    RF_cmdPropRx.endTime                = (ratmr_t)timeout_ms * (4e6 / 1000);

    rf_modem_cmd_handle = RF_postCmd(rf_modem_handle, (RF_Op *)&RF_cmdPropRx, RF_PriorityNormal, &rf_modem_rx_callback, RF_EventLastCmdDone | RF_EventRxEntryDone);

    return (rf_modem_cmd_handle >= 0);
}

这是否也是处理所有情况(包括任何错误)的正确/最佳方式?

提前感谢、

Pieter

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

    你(Peter)好

    在 CCA 应用中、我认为回调中要检查的最重要的事情是 TX 是否已运行、如果这是基于 CS 命令的条件的话。

    请查看rfListenBeforeTalk (TI.com)示例作为参考。

    关于 RX、您应该查看rfPacketRx (TI.com)、并查看如何检查不同的事件和状态。

    在您获取回调时、完全可能会设置几个事件位、因此您需要检查要在回调中执行的所有操作。

    Siri

    BR

    Siri

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

    你好、Siri、

    rfListenBeforeTalk 示例和 rfPacketRx 示例使用 RF_runCmd ()而不是 RF_postCmd ()。 这意味着它将阻止、直到它完成(成功或错误)。

    我的问题是、我必须为 RF_postCmd ()指定感兴趣的事件掩码(例如 RF_EventLastCmdDone)。 这意味着回调函数只会针对 RF_EventLastCmdDone 调用、而不会调用其他事件、对吗?

    射频驱动器*始终*是否会在所有情况下生成 RF_EventLastCmdDone (成功或错误)并调用回调函数、以便我知道 RF_postCmd ()已完成?

    我是否必须检查状态字段以确定成功或错误?

    提前感谢、

    Pieter

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

     当链中的最后一条命令完成时(或如果完成单个命令)、您将始终获得 RF_EventLastCmdDone 事件。

    请记住、您可以在回调中细分多个不同的事件、而不仅仅是一个:

    示例:

    RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRx, RF_PriorityNormal, &callback, RF_EventRxEntryDone | RF_EventRxAborted);

    例如、如果您仅订阅  RF_EventLastCmdDone、您将需要检查状态以了解命令结束的原因。

    Siri