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:数据包长度不限的射频 RX

Guru**** 2338670 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/1495400/cc1311p3-rf-rx-with-unlimited-packet-length

器件型号:CC1311P3

工具/软件:

您好、

我们在射频设计中使用了 CC1311P3。 我们有一个用例可以实现数据包长度不受限制的连续接收。 请告知我们 CC1311P3、是否可以在检测到配置的前导码和同步字时进行无限长度的连续数据接收。

请告知我们是否可以 在任何模式下从2FSK 解调器接收所有数据、而无需检查同步字。 在这种情况下、我们不需要任何基带解码。

谢谢!

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

    该器件支持无限长度、这可以通过将  CMD_PROP_RX/CMD_PROP_RX_ADV 中的 maxPktLen 设置为0来实现。

    使用不受限制的长度时、需要使用部分读取条目来读出数据。

    在找到同步字之前、对讲机不会开始接收、但通过将同步长度设置为最小值、器件很可能在您进入 RX 后因噪声触发、并且它将开始接收。

    我们尚未对此进行任何测试、因为从电源干扰的角度来看、持续接收是不正常的、而且您也无法知道您收到的数据中是否存在位错误。  

    Siri

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

    尊敬的 Siri:

    感谢您的快速响应。

    我们已经在 rfUARTBridge 示例工程中使用 CCS 尝试了上述方法、但当我们将  maxPktLen 配置为0时、不会接收到 RF_EventRxEntryDone。  

    我们甚至在 SmartRF Studio 中尝试了相同的配置、并观察到相同的行为-完全没有收到 RX 数据包。

    请提供任何其他详细信息以帮助我们缩小此用例的范围。

    谢谢!  

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

    我使用了 rfPacketRX 示例并对其进行了修改、以使用部分读取条目和无限数据包长度模式。

    我将同步字设置为8位。

    我看到的是、它可能需要几秒钟才能开始接收某个内容、然后我 以固定速率获得 RF_EventRxEntryDone 中断、只要我处理队列即可。

    如果我想让它开始紧张地填充数据条目、我必须要做的是降低同步保留、以便它立即在噪声中找到一个"同步"字、然后开始接收。

    但是、为了能够接收 SoM 有用的数据、您需要从要发送的数据中搜索真正的同步字。

    如果您仅同步噪声、 接收器将与噪声进行位同步、因此当您感兴趣的真实数据出现时、您将无法正确接收、因为您的不与您触发的噪声进行位同步。

    我会假设您要接收的数据具有某种可用于位同步的位模式?

    我进行了一个测试、其中传输连续的前导码并使用该前导码的8位作为同步字

    您可以看到、partail 读取缓冲区中接收到前导码:

    代码如下所示:

    /* Standard C Libraries */
    #include <stdlib.h>
    
    /* TI Drivers */
    #include <ti/drivers/rf/RF.h>
    #include <ti/drivers/GPIO.h>
    
    /* Driverlib Header files */
    #include DeviceFamily_constructPath(driverlib/rf_prop_mailbox.h)
    
    /* Board Header files */
    #include "ti_drivers_config.h"
    
    /* Application Header files */
    #include "RFQueue.h"
    #include <ti_radio_config.h>
    
    /***** Prototypes *****/
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    
    /***** Variable declarations *****/
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    #define PARTIAL_RX_ENTRY_HEADER_SIZE    12
    #define DATA_BUFFER_SIZE                20
    
    /* Buffer which contains all Data Entries for receiving data.
     * Pragmas are needed to make sure this buffer is 4 byte aligned (requirement from the RF Core) */
    #if defined(__GNUC__)
    static uint8_t rxDataEntryBuf1[PARTIAL_RX_ENTRY_HEADER_SIZE + DATA_BUFFER_SIZE] __attribute__((aligned(4)));
    static uint8_t rxDataEntryBuf2[PARTIAL_RX_ENTRY_HEADER_SIZE + DATA_BUFFER_SIZE] __attribute__((aligned(4)));
    #else
    #error This compiler is not supported.
    #endif
    
    rfc_dataEntryPartial_t* partialReadEntry1 = (rfc_dataEntryPartial_t*)&rxDataEntryBuf1;
    rfc_dataEntryPartial_t* partialReadEntry2 = (rfc_dataEntryPartial_t*)&rxDataEntryBuf2;
    rfc_dataEntryPartial_t* currentReadEntry = (rfc_dataEntryPartial_t*)&rxDataEntryBuf1;
    
    // Receive dataQueue for RF Core to fill in data
    static dataQueue_t dataQueue;
    static uint8_t* packetDataPointer;
    
    /***** Function definitions *****/
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
        partialReadEntry1->length = DATA_BUFFER_SIZE + 4;
        partialReadEntry1->config.type = DATA_ENTRY_TYPE_PARTIAL;
        partialReadEntry1->status = DATA_ENTRY_PENDING;
    
        partialReadEntry2->length = DATA_BUFFER_SIZE + 4;
        partialReadEntry2->config.type = DATA_ENTRY_TYPE_PARTIAL;
        partialReadEntry2->status = DATA_ENTRY_PENDING;
    
        partialReadEntry1->pNextEntry = (uint8_t*)partialReadEntry2;
        partialReadEntry2->pNextEntry = (uint8_t*)partialReadEntry1;
    
        dataQueue.pCurrEntry = (uint8_t*)partialReadEntry1;
        dataQueue.pLastEntry = NULL;
    
        RF_cmdPropRx.syncWord = 0x55555555;
        RF_cmdPropRx.pQueue = &dataQueue;
        RF_cmdPropRx.maxPktLen = 0;
        RF_cmdPropRadioDivSetup.formatConf.nSwBits = 8;
    
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRx, RF_PriorityNormal, &callback, RF_EventRxEntryDone);
    
        while(1);
    }
    
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventRxEntryDone)
        {
            GPIO_toggle(CONFIG_GPIO_RLED);
    
            // Get a pointer to the first byte
            packetDataPointer = &currentReadEntry->rxData;
            //---------------------------------------------------------------------------
            // Implement code for handling the incoming data
            // .
            // .
            // .
            // .
            //---------------------------------------------------------------------------
            currentReadEntry->status = DATA_ENTRY_PENDING;
            currentReadEntry = (rfc_dataEntryPartial_t*)currentReadEntry->pNextEntry;
    
        }
    }

    Siri

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

    尊敬的 Siri:

    感谢您提供代码参考。 这帮助我们接收了一个1024字节的数据包。 但是、我们无法接收  用于连续传输的后续 RF_EventRxEntryDone 中断。  

    请建议我们如何持续接收更长的数据包。

    谢谢!

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

    我恐怕我不明白你是如何测试的,什么是失败的。

    我发送给您的代码在数据包大小方面没有任何限制。

    它将在 RX 中持续存在、每次填充 RX 条目(RF_EventRxEntryDone)时、您都将收到回调。

     将 DATA_BUFFER_SIZE 设置为20时、这意味着、如果您使用50kbps 设置运行此示例、您将每3.2ms 在回调中看到一次 LED 切换。

    • 除非您这样做、否则 Rx 不会被终止  
    • 取消正在进行的 RX cmmand
    • 使用 SET_LEN 命令停止 RX
    • 您未正确处理 RX 队列、因此没有更多可用条目可用于存储 RX 命令状态下的传入数据、即 PROP_ERROR_RXFULL)

    我发送给您的测试代码简单地展示了如何将无线电设置为连续 RX。

    如果终止 RX、则需要清理缓冲区和队列、并通过再次运行 RX 命令重新启动 RX。

    Siri

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

    尊敬的 Siri:

    我们使用了您提供的确切配置。 但是、 对于每个 RF_runCmd、我们都会收到两次 RX done 中断(RF_EventRxEntryDone )。 仅当 再次调用 RF_runCmd 时、才收到后续中断。

    您能否就这一行为提供进一步的澄清?

    谢谢

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

    我怕我不明白你的意思。

    对于我之前提供的 hte 代码示例、您 每接收到20个字节就会获得一次 RF_EventRxEntryDone 中断、并且由于您使用无限模式、这永远不会停止。

    请记住、在调试无限模式时、您不能在代码中设置任何断点、因为这会暂停 MCU (同时射频内核仍在运行)、并且无线电将在愿意提供两个数据条目后溢出、因为您在 MCU 暂停时不会释放数据条目。

    Siri