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.

[参考译文] LAUNCHXL-CC1352R1:如何检查接收到的射频消息

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1131187/launchxl-cc1352r1-how-to-check-for-received-rf-message

器件型号:LAUNCHXL-CC1352R1

我正在尝试编写一个程序来处理两个设备之间的消息、这两个设备可能会随时发送消息。 我正在尝试了解如何检查并了解我的 CC1352R1 TI 板是否收到了来自另一 TI 板的射频消息。 通常、我使用以下函数调用使电路板处于射频接收模式: RF_EventMask terminationReason = RF_runCmd (rfHandle、(RF_OP*)&RF_cmdPropRx、RF_PriorityNormal、&callback、RF_EventRxEntryDone); 但是、在收到 RF 消息之前、我不能执行任何操作。

我希望能够检查射频队列状态或有某种方法知道已收到射频消息。 这是可行的吗? 即使 RF_runCMD()函数未使用 RF_cmdPropRx 命令调用,射频内核是否具有保存接收到的射频消息的内部缓冲器或数据结构?

同样、是否有办法对 UART2接收缓冲器执行同样的操作? 换句话说、要知道何时在 UART2缓冲器上接收到数据?

编辑:

我使用的是 SDK 版本 CC13xx_CC26xx_6_10_00_29

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

    在 rfPacketRX 示例中、您将 在每次收到数据包时输入回调。  

    该示例始终处于 RX 中、并且 RF_runCmd 处于阻塞状态、这意味着您在 RX 终止之前不会通过此函数。  

    由于 RF_cmdPropRx.pktConf.bRepeatOk = 1、除非您遇到某种错误(溢出等)、否则 RX 不会终止

     您可以使用 RF_postCmd (非阻塞)、而不是使用阻塞 RF_runCmd。 您还可以设置 RF_cmdPropRx.pktConf.bRepeatOk = 0;

    然后、您可以执行如下操作:

    static bool packetReceived = false;
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        /* Open LED pins */
        ledPinHandle = PIN_open(&ledPinState, pinTable);
        if (ledPinHandle == NULL)
        {
            while(1);
        }
    
        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 */
        /* Set the Data Entity queue for received data */
        RF_cmdPropRx.pQueue = &dataQueue;
        /* Discard ignored packets from Rx queue */
        RF_cmdPropRx.rxConf.bAutoFlushIgnored = 1;
        /* Discard packets with CRC error from Rx queue */
        RF_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
        /* Implement packet length filtering to avoid PROP_ERROR_RXBUF */
        RF_cmdPropRx.maxPktLen = MAX_LENGTH;
        RF_cmdPropRx.pktConf.bRepeatOk = 0; // Turn off repeat mode so that RX will end when a packet is received
        RF_cmdPropRx.pktConf.bRepeatNok = 1;
    
        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);
    
        while (1)
        {
            RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropRx, RF_PriorityNormal, &callback, RF_EventRxEntryDone);
    
            // Do other stuff until a packet has been received
            while (!packetReceived)
            {
    
                PIN_setOutputValue(ledPinHandle, Board_PIN_LED1, !PIN_getOutputValue(Board_PIN_LED1));
                CPUdelay(5000000);
            }
            packetReceived = false;
        }
    }
    
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventRxEntryDone)
        {
            /* Toggle pin to indicate RX */
            PIN_setOutputValue(ledPinHandle, Board_PIN_LED2,
                               !PIN_getOutputValue(Board_PIN_LED2));
    
            /* Get current unhandled data entry */
            currentDataEntry = RFQueue_getDataEntry();
    
            /* Handle the packet data, located at &currentDataEntry->data:
             * - Length is the first byte with the current configuration
             * - Data starts from the second byte */
            packetLength      = *(uint8_t*)(&currentDataEntry->data);
            packetDataPointer = (uint8_t*)(&currentDataEntry->data + 1);
    
            /* Copy the payload + the status byte to the packet variable */
            memcpy(packet, packetDataPointer, (packetLength + 1));
    
            RFQueue_nextEntry();
    
            packetReceived = true;
        }
    }

    上面的代码将进入 RX 模式、然后开始切换 LED、直到接收到数据包。

    然后、它将重新进入 RX 并重复执行。

    UART 驱动程序可在阻塞模式和回调模式下使用(接收到内容时会收到中断)。

    有关更多详细信息、请查看 UART2驱动程序文档。

    UART2.h 文件参考(TI.com)

    Siri

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

    谢谢 Siri、这非常有帮助。 非阻塞命令似乎是一条很好的前进路径。 您通常知道接收射频消息的内核与正在运行的回调之间需要多长时间吗?

    此外、是否有可能错过在此模式下运行的 RF 消息? RF 内核是否将所有收到的消息存储在代码中创建的队列中? 如果已填充此队列并收到新消息、会发生什么情况? 我假设这应该由用户在代码中处理。

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

    要确定从无线电退出 RX 到进行回调的时间、可以在 引脚上输出 CPE_GPO0信号、并测量从该引脚取消置位到 Board_PIN_LED2切换的时间。  

    如何输出该信号如下所述:

    将射频内核信号路由到物理引脚- SimpleLink CC13XX/CC26XX SDK 专有射频用户指南5.20.00文档

    首先,总是有可能漏掉射频数据包,因为在将数据包发送到您的时,您无法控制哪些干扰设备将在空中:-)

    我发布的代码不使用重复模式(RF_cmdPropRx.pktConf.bRepeatOk = 0)、因此无线电在发送数据包时退出 RX、然后再次进入 RX。

    您可以再次启用重复模式(如原始示例中)、但使用 POST 而不是运行。 接收到数据包后、对讲机将保持 RX 状态、因此使用此方法时、您需要确保  处理射频队列的速度足够快、以使任何溢出情况失效。

    如果对讲机连续接收多个数据包、并且 MCU 被占用了更高优先级的任务、因此无法处理 RX 回调、通常会发生这种情况。

    Siri