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.

[参考译文] LP-CC1352P7:使用 RF_cmdPropTxAdv 时不进行传输

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1415005/lp-cc1352p7-no-transmission-when-using-rf_cmdproptxadv

器件型号:LP-CC1352P7
Thread 中讨论的其他器件:Wi-SUNENERGYTRACESysConfig

工具与软件:

我目前使用的是RF_cmdPropTx SimpleLink 和定制 PHY 这一功能、数据包会正确发送和接收。 但是、当我将配置切换到 Wi-SUN 并使用广播命令(RF_cmdPropTxAdv)传输数据包时、会遇到问题。

以下是我用来传输数据包的函数调用:

RF_runCmd(rfHandle, (RF_Op *)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, RF_EventRxEntryDone);

当命令返回时RF_EventLastCmdDone、表示最后一条命令已成功执行、我在  大多数时间内没有在 SMA 线路上进行信号传输。 我将使用频谱分析仪来确认信号。 尽管我偶尔会观察到信号并且可以在接收器端接收数据包、但它是不一致的。

有人可以帮助确定这是否是 SDK 中的错误、或者我的实现是否存在问题吗? 非常感谢您的帮助!

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

    尊敬的 Saugat:

    从您解释的内容来看、似乎正确执行了 PHY 的选择和数据包的发送。
    在您共享的命令中、我看到"(RF_Op *)&RF_cmdPropRxAdv"我想这是您需要使用 Tx 命令来发送数据的拼写错误?

    请尝试使用Code Composer Studio 中的 EnergyTrace (www.ti.com/.../ENERGYTRACE)来观察是否可以看到所有数据包传输。

    如果您仍遇到问题、请与我分享您的代码和设置以便我可以重新生成。

    此致、
    等等

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

    感谢您的快速响应、但抱歉本应该是 (RF_Op *)&RF_cmdPropTxAdv。  

    我进行了能量跟踪、看起来无线电从未消耗传输数据包所需的电流。 我的当前配置在920 MHz 频率下使用0dBm 输出功率。 在数据表中添加了 a/c 每次传输它应等于~μ A 9mA 电流消耗。 下面是观察到的能量跟踪的屏幕截图(完成5分钟)、  

     .

     

    这是我的 SysConfig 文件。

    /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --board "/ti/boards/LP_CC1352P7_1" --rtos "tirtos7" --product "simplelink_cc13xx_cc26xx_sdk@7.41.00.17"
     * @versions {"tool":"1.18.1+3343"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const CCFG        = scripting.addModule("/ti/devices/CCFG");
    const custom      = scripting.addModule("/ti/devices/radioconfig/custom");
    const rfdesign    = scripting.addModule("/ti/devices/radioconfig/rfdesign");
    const GPIO        = scripting.addModule("/ti/drivers/GPIO");
    const GPIO1       = GPIO.addInstance();
    const RF          = scripting.addModule("/ti/drivers/RF");
    const UART2       = scripting.addModule("/ti/drivers/UART2", {}, false);
    const UART21      = UART2.addInstance();
    const Settings    = scripting.addModule("/ti/posix/tirtos/Settings");
    const BIOS        = scripting.addModule("/ti/sysbios/BIOS");
    const Event       = scripting.addModule("/ti/sysbios/knl/Event");
    const Idle        = scripting.addModule("/ti/sysbios/knl/Idle", {}, false);
    const Idle2       = Idle.addInstance();
    const Mailbox     = scripting.addModule("/ti/sysbios/knl/Mailbox");
    const Error       = scripting.addModule("/ti/sysbios/runtime/Error");
    const SysCallback = scripting.addModule("/ti/sysbios/runtime/SysCallback");
    const Timestamp   = scripting.addModule("/ti/sysbios/runtime/Timestamp");
    
    /**
     * Write custom configuration values to the imported modules.
     */
    CCFG.xoscCapArray            = true;
    CCFG.xoscCapArrayDelta       = 0xC1;
    CCFG.enableBootloader        = true;
    CCFG.dioBootloaderBackdoor   = 15;
    CCFG.levelBootloaderBackdoor = "Active low";
    CCFG.ccfgTemplate.$name      = "ti_devices_CCFG_CCFGCC26XXTemplate0";
    
    custom.prop8                                                               = ["2gfsk100kbps50dev915wsun2b"];
    custom.radioConfig2gfsk100kbps50dev915wsun2b.$name                         = "ti_devices_radioconfig_settings_prop0";
    custom.radioConfig2gfsk100kbps50dev915wsun2b.txPower                       = "0";
    custom.radioConfig2gfsk100kbps50dev915wsun2b.codeExportConfig.$name        = "ti_devices_radioconfig_code_export_param0";
    custom.radioConfig2gfsk100kbps50dev915wsun2b.codeExportConfig.symGenMethod = "Custom";
    
    GPIO1.$hardware = system.deviceData.board.components.LED_GREEN;
    GPIO1.$name     = "CONFIG_GPIO_GLED";
    
    RF.$hardware = system.deviceData.board.components["SKY13317-373LF"];
    
    UART21.$name     = "CONFIG_UART2_0";
    UART21.$hardware = system.deviceData.board.components.XDS110UART;
    
    BIOS.assertsEnabled = false;
    BIOS.heapBaseAddr   = "__primary_heap_start__";
    BIOS.heapEndAddr    = "__primary_heap_end__";
    
    const Clock      = scripting.addModule("/ti/sysbios/knl/Clock", {}, false);
    Clock.tickPeriod = 10;
    
    const Timer = scripting.addModule("/ti/sysbios/family/arm/cc26xx/Timer", {}, false);
    
    Idle2.$name   = "powerIdle";
    Idle2.idleFxn = "Power_idleFunc";
    
    const Semaphore            = scripting.addModule("/ti/sysbios/knl/Semaphore", {}, false);
    Semaphore.supportsPriority = false;
    
    const Swi         = scripting.addModule("/ti/sysbios/knl/Swi", {}, false);
    Swi.numPriorities = 6;
    
    const Task             = scripting.addModule("/ti/sysbios/knl/Task", {}, false);
    Task.checkStackFlag    = false;
    Task.defaultStackSize  = 512;
    Task.idleTaskStackSize = 512;
    Task.numPriorities     = 6;
    
    Error.policy       = "Error_SPIN";
    Error.printDetails = false;
    
    const System           = scripting.addModule("/ti/sysbios/runtime/System", {}, false);
    System.abortFxn        = "System_abortSpin";
    System.exitFxn         = "System_exitSpin";
    System.extendedFormats = "%f";
    System.supportModule   = "SysCallback";
    
    /**
     * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
     * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
     * re-solve from scratch.
     */
    GPIO1.gpioPin.$suggestSolution     = "boosterpack.40";
    RF.rfAntennaPin0.$suggestSolution  = "DIO_28";
    RF.rfAntennaPin1.$suggestSolution  = "DIO_29";
    RF.rfAntennaPin2.$suggestSolution  = "DIO_30";
    UART21.uart.$suggestSolution       = "UART0";
    UART21.uart.txPin.$suggestSolution = "boosterpack.4";
    UART21.uart.rxPin.$suggestSolution = "boosterpack.3";
    Timer.rtc.$suggestSolution         = "RTC0";
    

    这是无线电配置和数据包传输的代码片段。 下面的代码片段在循环上运行、以便在指定的间隔内持续传输。

    RF_Params rfParams;
    RF_Params_init(&rfParams);
    ...
    // Encode the dummy packet
    encode_all(&pkt_demo_pkt, pkt_demo_buf);
    RF_cmdPropTxAdv.pktLen = MSG_LEN_ALL + 2;
    RF_cmdPropTxAdv.pPkt = on_air_pkt_demo;
    RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW;
    ...
    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);
    ...
    on_air_pkt_demo[0] = (uint8_t)(seqNumber >> 8);
    on_air_pkt_demo[1] = (uint8_t)(seqNumber++);
    uint8_t i;
    for (i = 2; i < MSG_LEN_ALL + 2; i++)
    {
        on_air_pkt_demo[i] = pkt_demo_buf[i-2];
    }
    ...
    /* Send sense_nano_on_air_pkt_demo */
    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_cmdPropTxAdv,
                                      RF_PriorityNormal, NULL, 0);
    }
    ...
    switch(terminationReason)
        {
            case RF_EventLastCmdDone:
                // Log last command was execeuted successfully.
                // I have a seperate function to log the outputs in all the termination and command status condition
                break;
            case RF_EventCmdCancelled:
                break;
            case RF_EventCmdAborted:
                break;
            case RF_EventCmdStopped:
                break;
            default:
                while(1);
    }
    
    uint32_t cmdStatus = ((volatile RF_Op*)&RF_cmdPropTxAdv)->status;
    switch(cmdStatus)
    {
        case PROP_DONE_OK:
            break;
        case PROP_DONE_STOPPED:
            break;
        case PROP_DONE_ABORT:
            break;
        case PROP_ERROR_PAR:
            break;
        case PROP_ERROR_NO_SETUP:
            break;
        case PROP_ERROR_NO_FS:
            break;
        case PROP_ERROR_TXUNF:
            break;
        default:
            while(1);
    }
    RF_yield(rfHandle);
    
    sleep(PACKET_INTERVAL);

    我有一个单独的函数、用于记录所有终止和命令状态条件下的输出、每次返回都表示传输成功或  RF_EventLastCmdDone。 根据文档、它只应在成功的数据包传输时返回该值。 非常感谢您的帮助。 谢谢你。  

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

    我 在上一次回复中使用 Energytrace、进行了错误测量、结果显示了错误的电流消耗。 这里是能量跟踪数据、  

    电流消耗似乎准确。 不过仍然没有来自 SMA 线路的信号。  

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

    尊敬的 Saugat:

    在您的最后一次能量跟踪上、我可以看到确实发送了一些消息。

    1.如何在 SMA 上捕捉活动?
    2.您能用 SmartRF Studio 7设置接收器吗(SMARTRFTM-STUDIOCalculation tool | TI.com)?您需要连接另一个支持 Wi-SUN PHY 的 LaunchPad、并在数据包 Rx 中运行该 LaunchPad。 请 与我分享收到的数据包的屏幕截图。

    此致、
    等等

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

    1) 1)为了观察 SMA 线路上的活动、我们目前具有频谱分析仪设置。 我们将 SMA 线路连接到 Siglent SSA3032频谱分析仪、其衰减器为10dB、扫描时间短。 传输时 RF_cmdPropTx 、我们会定期观察到预期的信号、但在 RF_cmdPropTxAdv 上不会观察到预期的信号。 此外、我们还具有另一组 LaunchPad、运行着 Rx 应用来捕获数据包、我们有类似的观察结果。  

    2) 2)根据您的建议、我在我们的 Windows 机器上使用了 SmartRF Studio、其协议配置与在具有高级命令结构 RF_cmdPropTxAdv 的 Tx 应用中设置的相同。 我确实按照预期以正确的间隔在 Tx 端观察到类似的电流消耗曲线、并在 RF Studio 中观察到数据包。 我已经附上了屏幕截图。 我们观察到、误码率真的很高、这是意料之外的。 在运行的几次中、我根本没有收到任何成功的数据包。 我还尝试在 SysConfig 上将数据包长度裁剪到64字节、但未以优先级为准。 问题可能出在无线环境还是我在无线电配置中所做的使误码率如此高的可能性这方面。 此外、这一切都无法正确解释在频谱分析仪上观察到的不可靠信号。  

    感谢你能抽出时间。 期待您的评论。  

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

    我今天也进行了测试、但是我完全无法在 RFPacket Studio 上接收任何数据包。 它仍在以完全相同的配置运行相同的固件。 这是一个截图, .

    平均时间内、我还查看了电流消耗。

    自从我开始测试以来、就像这样。 将会有无线电信号、而不会出现任何问题、我会在 Rx 开发套件中接收数据包以及在频谱分析仪上接收信号一段时间、并会再次停止。 除了使用广播结构或简单无线电数据包结构、我在其中的任何一种模式中都没有明确的模式。

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

    将 rfPacketTX 示例与任何使用高级 TX 命令(例如 Wi-SUN PHY)的 PHY 配合使用时、不应仅将代码中的常规 TX 命令替换为高级命令、并期望该命令能够正常工作。

    如果您查看 TRM 中该命令的文档、就会发现虽然普通 TX 命令期望数据包长度只写入 API、但高级 TX 命令期望将长度作为数据包的一部分写入。

    此外、Wi-SUN PHY 使用802.15.4g 模式、因此数据包具有2字节标头、长度为该标头的11 LSB:

    以 rfPacketTX 为例、例如更改 Wi-SUN 模式#2B 的设置、必须在 rfPacketTX 示例中完成以下更改、这样、才能在 SmartRF Studio 中使用此模式通过另一个器件接收数据包

    /* Packet TX Configuration */
    #define PAYLOAD_LENGTH      30
    
    #define PACKET_INTERVAL     100000  /* Set packet interval to 100000 us or 100 ms */
    
    
    static uint8_t lsbFirst(uint8_t b);
    
    /***** Prototypes *****/
    
    /***** Variable declarations *****/
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    static uint8_t packet[PAYLOAD_LENGTH];
    static uint16_t seqNumber;
    
    /***** 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);
    
        RF_cmdPropTxAdv.pktLen = PAYLOAD_LENGTH;
        RF_cmdPropTxAdv.pPkt = packet;
        RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW;
    
        /* Request access to the radio */
        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)
        {
            uint8_t i;
    
            // Create the packet content (same packet for every iteration)
            // For the advanced TX command the length must manually be written to the packet
    
            packet[0] = PAYLOAD_LENGTH;
            packet[1] = 0x18; // Whitening and 2 bytes CRC enabled
                                // (default in SmartRF Studio for 802.15.4g mode)
    
            packet[2] = lsbFirst((uint8_t)(seqNumber >> 8));
            packet[3] = lsbFirst((uint8_t)(seqNumber++));
    
            for(i = 4; i < PAYLOAD_LENGTH; i++)
            {
                // For the payload, SmartRF Studio uses LSbit first by default for
                // 802.15.4g mode
                packet[i] = lsbFirst(i-3);
             }
    
            RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);
    
            GPIO_toggle(CONFIG_GPIO_GLED);
    
            /* Power down the radio */
            RF_yield(rfHandle);
    
            /* Sleep for PACKET_INTERVAL us */
            usleep(PACKET_INTERVAL);
        }
    }
    
    uint8_t lsbFirst(uint8_t b)
    {
        b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
        b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
        b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
        return b;
    }

    Siri

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

    谢谢、这解决了我的问题。 如前所述、高级数据包格式默认不会添加数据包长度。 因此、它使用我的序列号{0x00}的第一个字节作为数据包长度。 因此、我们将在频谱分析仪上观察到无线电波形上升、而没有观察到信号。