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.

[参考译文] CC1312R7:CC1312不连续发送数据

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1328075/cc1312r7-cc1312-discontinuous-transmit-data

器件型号:CC1312R7

大家好、

我想使用 CC1312打印连续数据。 但我无法获得我想要的结果。 总发送时间花费2.25ms (255字节)。 但每255字节 之后、TX 就会关闭。 重新开放时间大约为175us。

1) 1)这是 CC1312的 RX/TX 开关时间吗?

2) 2)如果是、我只能在发送模式下使用 CC1312吗? 我的意思是、我在下面分享的光谱图像清晰可见。

在下面的频谱图像中、发送的信号似乎在255字节末尾完全关闭 TX 链(-60dbm 是最低点)。 我唯一想到的是 CC1312的开关时间。

注:我永远不会在应用程序中使用 RECEIVE。

此致

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

    首先、如果切换到使用高级 TX 命令、则可以传输比255字节更长的数据包。 它接受的长度 为2个字节、而不是1个字节。

    但是、如果您需要执行连续 TX、则需要将数据包长度设置为无限、并使用 TX 队列来处理数据。

    以下文章包含一个示例、您可以将其用作进行此操作的起点:

    (+) CC1310:CMD_PROP_TX_ADV 示例-低于1GHz 论坛-低于1GHz - TI E2E 支持论坛

    Siri

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

    您好@Siri  

    感谢您的回复。

    数据传输有所改进、但仍然没有完全连续的时间数据传输。 每次 PAYLOAD_LENGTH 复位时、RF_TX 会关闭。  实际上、我想做的只是传输数据。 它会持续传输(TX)我提供的有效载荷数据。 而不会在时域中停止 TX 线路。

    辛塞莱里

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

    我运行了链接的示例、没有出现任何问题。

    数据调试器将按照所述进行背靠背发送:

    #include <stdlib.h>
    #include <unistd.h>
    
    #include <ti/drivers/rf/RF.h>
    #include <ti/drivers/GPIO.h>
    
    #include DeviceFamily_constructPath(driverlib/rf_prop_mailbox.h)
    
    #include "ti_drivers_config.h"
    #include <ti_radio_config.h>
    #include DeviceFamily_constructPath(driverlib/rf_data_entry.h)
    
    #define PACKET_INTERVAL     500000  /* Set packet interval to 500000 us or 500 ms */
    #define TX_BUFFERS_TO_SEND  100
    
    
    /***** Variable declarations *****/
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    /* The buffer below contains a packet that is sent back-to-back TX_BUFFERS_TO_SEND every PACKET_INTERVAL. */
    static uint8_t txSyncPacket[] = {
                                    /**********************************************/
                                    0x55, 0x55, 0x55, 0x55,         // Preamble
                                    0x93, 0x0B, 0x51, 0xDE,         // Sync Word
                                    0x03,                           // Length byte
                                    0xCC, 0x00, 0xFF                // 3 bytes payload
                                    /**********************************************/
                                };
    
    static rfc_dataEntryPointer_t txEntry;
    static dataQueue_t txQueue;
    
    volatile uint8_t packetSent = false;
    static uint8_t packetCounter = 0;
    
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    
    
    /***** Function definitions *****/
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF);
        GPIO_setConfigAndMux(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW, IOC_PORT_RFC_GPO0);
    
        txEntry.pNextEntry = (uint8_t*)&txEntry;
        txEntry.status = DATA_ENTRY_PENDING;
        txEntry.config.type = DATA_ENTRY_TYPE_PTR;
        txEntry.pData = (uint8_t*)txSyncPacket;
        txEntry.length = sizeof(txSyncPacket);
    
        RF_cmdPropTxAdv.pPkt = (uint8_t*)&txQueue;
        RF_cmdPropTxAdv.pktLen = 0;
        RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW;
        RF_cmdPropTxAdv.startTrigger.pastTrig = 1;
        RF_cmdPropTxAdv.startTime = 0;
        RF_cmdPropTxAdv.syncWord = 0x55555555; // cannot turn off sync so make it part of preamble
    
        txQueue.pCurrEntry = (uint8_t*)&txEntry;
        txQueue.pLastEntry = NULL;
    
        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)
        {
            packetCounter = 0;
            txQueue.pCurrEntry = (uint8_t*)&txEntry;
    
            /* Send packet */
            RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, &callback, RF_EventTxEntryDone);
            while(!packetSent);
            packetSent = false;
            usleep(PACKET_INTERVAL);
        }
    }
    
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventTxEntryDone)
        {
            packetCounter++;
    
            if (packetCounter == (TX_BUFFERS_TO_SEND - 1))
            {
                txQueue.pLastEntry = txQueue.pCurrEntry;
            }
        }
        else if (e & RF_EventLastCmdDone)
        {
            packetSent = true;
        }
    }

    当通过引脚发送数据以进行验证时、我会输出进入调制器的二进制数据信号:

    Siri

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

    您好@Siri:

    感谢您的回复。 我认为我的问题是同步字节。 我将它们作为虚拟帧给出。 我认为我需要将数据包的前4个字节添加到同步中。 这很合理。 我将进行尝试并在此处写下结果。

    您好@Siri

    我尝试了您给出的示例代码。 结果仍然相同。 是否有机会将射频输出端连接到频谱分析仪? 在 Spectrum 中、您将观察到在零跨度模式下射频输出瞬间变化。  这正是我的问题。 我没有看到连续时间 TX 流。

    我分享了频谱图像、以便大家更清楚地了解。 我在代码中放置一个500ms 的等待。 以便看得更清楚。 在我需要的输出功率下为500ms RF_OUT、500ms RF_OUT 关闭??? 因此我无法生成连续的数据包流。 代码与您的示例完全相同。

    辛塞莱里

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

    如果你实际看看我发送的代码、就会看到它不是连续发送的。 它背靠背发送数据包(其间无延迟)、并发送100个数据包(TX_BUFFER_TO_SEND 100 )。

    在最初的问题中、您询问了如何在不需要每255字节重新启动 TX 的情况下发送数据包、我向您展示了如何执行该操作。

    如果您需要超过100个数据包、则需要增大  TX_Buffers_to_send。

    如果要连续发送、则必须重写代码才能实现。

    我发送的逻辑分析仪图显示了(来自我的示例)每个数据包都会在数据包之间毫无延迟地发送。

    Siri

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

    这是一个很好的讨论,谢谢。  是否可以使用 CC1312R7连续传输数据? 根据我的实验、我认为存在硬件 RX/TX 开关时间。  我不能让这个时间消失。 我想我应该能够告诉芯片进行传输。 但该怎么做呢?

    辛塞莱里

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

    是的、您可以连续传输数据。  

    这正是我在上一篇文章中所写的内容:

    "如果你想连续发送、你必须重写代码才能执行此操作。"

    如果您像这样更改我给出的代码、它将永久传输:

    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        txEntry.pNextEntry = (uint8_t*)&txEntry;
        txEntry.status = DATA_ENTRY_PENDING;
        txEntry.config.type = DATA_ENTRY_TYPE_PTR;
        txEntry.pData = (uint8_t*)txSyncPacket;
        txEntry.length = sizeof(txSyncPacket);
    
        RF_cmdPropTxAdv.pPkt = (uint8_t*)&txQueue;
        RF_cmdPropTxAdv.pktLen = 0;
        RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW;
        RF_cmdPropTxAdv.startTrigger.pastTrig = 1;
        RF_cmdPropTxAdv.startTime = 0;
        RF_cmdPropTxAdv.syncWord = 0x55555555; // cannot turn off sync so make it part of preamble
    
        txQueue.pCurrEntry = (uint8_t*)&txEntry;
        txQueue.pLastEntry = NULL;
    
        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_cmdPropTxAdv, RF_PriorityNormal, NULL, RF_EventTxEntryDone);
    
        while(1);
    }

    为何您想了解 RX/TX 开关时间?

    已声明不使用 RX、而需要连续的 TX。

    Siri  

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

    您好@Siri:

    我发现了问题的根源。 如果您按照"rf_runCmd"函数操作、您将看到您关闭所有中断例程、时钟源、加载射频广播所需的参数、然后再次打开这些参数。 我不知道做这些有多必要。 我想我必须从头开始编写一个像 RF_runCmd 这样的函数并测试它的准确性。 最好能从德克萨斯州的 FAS 获得有关这一问题的意见。

    辛塞莱里

     

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

    不确定具体意思、绝对没有理由修改 RF_runCmd。

    你可以运行我在上一个帖子中共享的确切代码、它会启动 TX 而永不终止。

    我已经用我们的官方司机测试了您的要求,一切都是按预期开始的。

    我们将不支持对驱动程序进行任何修改。

    Siri