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.

[参考译文] CC1352P7:RF_postCmd 和 RF_runCmd 使用 RFC_CMD_PROP_TX_t 命令发送不同的数据包

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1347575/cc1352p7-rf_postcmd-and-rf_runcmd-transmits-different-packets-using-rfc_cmd_prop_tx_t-command

器件型号:CC1352P7

我尝试在 Simplelink 音频 SDK 中实现 rfAudioTx 示例等流式应用、但我发现在运行 RFC_CMD_PROP_TX_t 时、以下两种方法出现了不同的行为:

1.使用 RF_runCmd:

RF_EventMask terminationReason = RF_EventCmdAborted | RF_EventCmdPreempted;
while(( terminationReason & RF_EventCmdAborted ) && ( terminationReason & RF_EventCmdPreempted ))
{
    // Re-run if command was aborted due to SW TCXO compensation
    terminationReason = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTx,
                                  RF_PriorityNormal, NULL, 0);
}

2.使用 RF_postCmd:

RF_CmdHandle cmdHandle = RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropTx, RF_PriorityNormal, txDoneCB, 0);
if (cmdHandle == RF_ALLOC_ERROR) {
   printf0("Error in Radio");
    while (1);
}

但是数据包接收仅在 RF_runCmd 中能够很好地工作、RF_postCmd 在数据包接收中提供不同的结果

我没有 在这两个方面更改任何与 RF_cmdPropTx 命令相关的内容、我无法弄清这种不同行为背后的原因。

如果需要提供有关此查询的更多信息、请告诉我

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

    尊敬的 Devansh:

    rf_runCmd ()等待发布的命令完成后再返回。  

    您是否可以在 RF_postCmd ()后面添加 RF_pendCmd ()来检查问题是否消失。 这实际上等同于运行命令。  

    因为您还为 postCmd 调用添加了回调函数。 有趣的是、添加 pend 命令是否即使在存在回调的情况下也解决了该问题。

    此致、

    SID

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

    尊敬的 Sid:

    感谢您的响应、我使用 RF_postCmd 和 RF_pendCmd 检查了它、它运行得很好、但我希望异步调用在这段时间内运行命令、我将获得新的数据包在后续调用中发送。 您可以查看 simplelink 音频 SDK 中 rfAudioTx 中提供的类似示例。 我想我有这个问题、如果你看看这个例子、

        while(1)
        {
            events = Event_pend(eventHandle, Event_Id_NONE, ALL_EVENTS, BIOS_WAIT_FOREVER);
    
            if(events)
            {
    
                if(events & AUDIO_DATA_READY_EVENT)
                {
                    /* Get a frame from the input buffers */
                    AudioHAL_readBufGet(tlv320Handle, (void *)audioIn);
                    int32_t encLen = 0;
    
                    Packetizer_encodeFrame(packetizerHdl, audioIn, txBitStream, &encLen);
    
                    /* Enqueue for transmission over air */
                    enqueueTxFrame(txBitStream, encLen);
                }
    
                if (events & AUDIO_READY_TO_SEND_EVENT)
                {
    
                    /* Are we already in TX? If that is the case just skip ahead */
                    if (radioActive == FALSE)
                    {
                        /* RF packet to send out */
                        uint8_t packet[TX_FRAME_SIZE];
    
                        /* Try to get a frame from the queue */
                        getTxFrame(&packet[1],&packet[0]);
    
    
                        /* If size is larger then 0, we got a frame */
                        if (packet[0] > 0) {
    
                            /* TX
                            * We have to send the Frame in two parts as the RF driver does not support data length
                            * higher than 255 bytes (each frame is 320 bytes long)
                            */
                            /* Configure the radio packet */
                            RF_cmdPropTx.pktLen = TX_FRAME_SIZE;
                            RF_cmdPropTx.pPkt = packet;
                            RF_cmdPropTx.startTrigger.triggerType = TRIG_NOW;
    
                            RF_CmdHandle cmdHandle = RF_scheduleCmd(rfHandle, (RF_Op*)&RF_cmdPropTx, &schParams, txDoneCB, NULL);
    
                            if (cmdHandle == RF_ALLOC_ERROR) {
                               while (1);
                            }
    
                            radioActive = TRUE;
                       }
                    }
                }
    
                if(events & RF_TX_DONE_EVENT){
    
                    /* One frame has been sent out */
                    numberOfSentPackets++;
                    if (!(numberOfSentPackets % TX_LED_TOGGLE_FREQUENCY)){
                        GPIO_toggle(Board_GPIO_LED1);
                    }
                }
            }
        }

    在此事件循环中、  

    在  getTxFrame 中修改包(&packet[1]、&packet[0]); 可能会遇到射频驱动器尚未准备好发送我们所获取的即时数据包的情况、因此我们会得到一些随机数据。虽然有趣的是、无论我收到的是什么虚假数据、这些数据在多个测试中都没有发生变化、但无论它是错误的、它始终是相同的。

    目前、我发现了使用循环缓冲区的权变措施、如下所示:

    if (circ_packet){
        getTxFrame(&packet0[1], &packet0[0]);
        packet = &packet0[0];
    } else {
        getTxFrame(&packet1[1], &packet1[0]);
        packet = &packet1[0];
    }

    您能否查看 rfAudioTx 示例并告诉我是否错过了什么?

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

    尊敬的 Devansh:

    如果我正确理解情况、则会 在一个字节的数据就绪后触发 AUDIO_READY_TO_SEND_EVENT。 请检查您是否可以延迟该活动、无论它发布在何处。  

    此外、您是否正在尝试将音频 TX 示例迁移到最新的 SDK?

    此致、

    SID  

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

    尊敬的 Sid:

    我也在思考同样的想法,有机会拖延它可以解决,但这不会是稳健的解决方案。 我使用 List_List (List.h)实现了循环缓冲区、这似乎是更好的解决方案、现在我能够在帧之间无任何延迟地接收音频

    之前、我不知道 rfAudioTx 示例、因此我制作了与示例中给出的程序类似的程序、我使用循环缓冲器在 I2S 和 Radio 之间传递数据。  

    我做了一些改动后测试了 rfAudioTx 和 rfAudioRx,它现在可以很好地与 ADPCM 编解码器一起工作,Opus 编解码器有一些问题,由于文件结构的变化,我无法使用最新的 SDK 进行编译,但我会再试一次。 另外、我正在尝试将 Codec2移植到 CC1352/4。

    此致

    D·坦纳