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.

[参考译文] CC1352P:使用自定义 PHY 设置时、EasyLink 不会更改频率

Guru**** 2610945 points
Other Parts Discussed in Thread: SYSCONFIG, CC1352P

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1127363/cc1352p-easylink-does-not-change-frequency-when-using-custom-phy-settings

器件型号:CC1352P
Thread 中讨论的其他器件:SysConfig

您好!

在基于 EasyLink 的项目中、我使用2.4GHz 频带(250kbps、125kHz 偏差、2-GFSK)的预定义 PHY 设置开发了源代码。  初始化 EasyLink 后、我更改频率、并且始终正常工作。 但是、将默认 PHY 更改为自定义 PHY 设置后、频率更改不再成功。 这是我用于初始化和更改频率的(简化的)代码:

static macInit(macParams_t * params)
{
    // Initialize the EasyLink parameters to their default values
    EasyLink_Params easyLink_params;
    EasyLink_Params_init(&easyLink_params);
    
    /*
     * Initialize EasyLink with the settings found in ti_easylink_config.h
     * Modify EASYLINK_PARAM_CONFIG in ti_easylink_config.h to change the default
     * PHY
     */
    if(EasyLink_init(&easyLink_params) != EasyLink_Status_Success)
    {
        macCleanUp();
        return Mac_Status_Error;
    }
    
    
    if (changeGroup(params->groupId) != Mac_Status_Success)
    {
        macCleanUp();
        return Mac_Status_Error;
    }
}


static Mac_Status_t changeGroup(TtngpMacGroupId_t groupId)
{
    EasyLink_abort();

    if (EasyLink_setFrequency(TTNGPMAC_GROUPID2FREQ_HZ((int) groupId)) != EasyLink_Status_Success)
    {
        return Mac_Status_Error;
    }

    currentGroupId = groupId;

    return Mac_Status_Success;
}

在调试过程中、我发现  EasyLink_setFrequency  函数中的 CMF_FS 命令在运行后的状态为0x0808、转换为 ERROR_NO_FS ("在未配置频率同步的情况下尝试使用 Rx 或 Tx 的操作")。

EasyLink_Status EasyLink_setFrequency(uint32_t ui32Frequency)
{
    EasyLink_Status status = EasyLink_Status_Cmd_Error;
    uint16_t centerFreq, fractFreq;

    if ( (!configured) || suspended)
    {
        return EasyLink_Status_Config_Error;
    }
    
    .
    .
    .
    
    RF_EventMask result;
    if (rfModeMultiClient)
    {
        /* Run command */
        result = RF_runScheduleCmd(rfHandle, (RF_Op*)&EasyLink_cmdFs,
                &schParams_prop, 0, EASYLINK_RF_EVENT_MASK);
    }
    else
    {
        /* Run command */
        result = RF_runCmd(rfHandle, (RF_Op*)&EasyLink_cmdFs,
                RF_PriorityNormal, 0, EASYLINK_RF_EVENT_MASK);
    }

    if((result & RF_EventLastCmdDone) && (EasyLink_cmdFs.status == DONE_OK))
    {
        status = EasyLink_Status_Success;
    }

    Semaphore_post(busyMutex);

    return status;
}

EasyLink_init 函数中、我也找不到我使用的自定义 PHY 设置和预定义 PHY 设置之间的任何可疑不同行为。 我使用的是 SimpleLink CC13xx CC26xx 6.10.0.29版和 SysConfig 1.12.0。 硬件是 CC1352P-2板。

请提供有关此错误的任何提示。

此致、

Alex

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

    您好、Alexander、

    您是否可以共享 ti_radio_config.h/.c 文件以及 EasyLink 配置文件?

    此致、

    Arthur

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

    当然、在这里

    e2e.ti.com/.../ti_5F00_easylink_5F00_config.ce2e.ti.com/.../ti_5F00_easylink_5F00_config.he2e.ti.com/.../0647.ti_5F00_radio_5F00_config.ce2e.ti.com/.../7633.ti_5F00_radio_5F00_config.h

    如果您需要更多信息、请告诉我。

    此致、

    Alex

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

    尊敬的 Alex:

    在 ti_EasyLink_config.h 中、我看到 EasyLink_Param_config 仍设置为"EasyLink_Phy_2_4_250kbps2gfsk"、除非它们具有相同的名称、否则它们似乎不是您的最新设置。

    此外、我们还可以使用.c 文件吗?

    此致、

    Arthur

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

    尊敬的 Arthur:

    感谢你的答复。 在发布设置之前、我似乎忘记了更改设置(因为我在预定义的无线电设置上继续工作、直到我们找出错误)。

    e2e.ti.com/.../3362.ti_5F00_easylink_5F00_config.ce2e.ti.com/.../5807.ti_5F00_easylink_5F00_config.h

    e2e.ti.com/.../3404.ti_5F00_radio_5F00_config.ce2e.ti.com/.../7128.ti_5F00_radio_5F00_config.h

    关于.c 文件:它们已附加、但会自动作为源代码包括、即使我将它们作为文件包含也是如此。 因此、如果您不介意、请从上面复制.c 文件的内容。

    此致、

    Alex

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

    Hei Alexander、

    我使用以下来源复制了您的设置(基于 rfEasyLinkTx)、其中我每隔一个数据包更新一次频率:

    /*
     * Copyright (c) 2017-2018, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    /*
     *  ======== rfEasyLinkTx.c ========
     */
     /* Standard C Libraries */
    #include <stdlib.h>
    
    /* XDCtools Header files */
    #include <xdc/std.h>
    #include <xdc/runtime/Assert.h>
    #include <xdc/runtime/Error.h>
    #include <xdc/runtime/System.h>
    
    /* BIOS Header files */
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    #include <ti/sysbios/knl/Semaphore.h>
    #include <ti/sysbios/knl/Clock.h>
    
    /* TI-RTOS Header files */
    #include <ti/drivers/GPIO.h>
    
    /* Board Header files */
    #include "ti_drivers_config.h"
    
    /* EasyLink API Header files */
    #include "easylink/EasyLink.h"
    
    /* Application header files */
    #include <ti_radio_config.h>
    
    /* Undefine to not use async mode */
    #define RFEASYLINKTX_ASYNC
    
    #define RFEASYLINKTX_TASK_STACK_SIZE    1024
    #define RFEASYLINKTX_TASK_PRIORITY      2
    
    #define RFEASYLINKTX_BURST_SIZE         10
    #define RFEASYLINKTXPAYLOAD_LENGTH      30
    
    Task_Struct txTask;    /* not static so you can see in ROV */
    static Task_Params txTaskParams;
    static uint8_t txTaskStack[RFEASYLINKTX_TASK_STACK_SIZE];
    
    static uint16_t seqNumber;
    
    #ifdef RFEASYLINKTX_ASYNC
    static Semaphore_Handle txDoneSem;
    #endif //RFEASYLINKTX_ASYNC
    
    #ifdef RFEASYLINKTX_ASYNC
    void txDoneCb(EasyLink_Status status)
    {
        if (status == EasyLink_Status_Success)
        {
            /* Toggle GLED to indicate TX */
            GPIO_toggle(CONFIG_GPIO_GLED);
        }
        else if(status == EasyLink_Status_Aborted)
        {
            /* Toggle RLED to indicate command aborted */
            GPIO_toggle(CONFIG_GPIO_RLED);
        }
        else
        {
            /* Toggle GLED and RLED to indicate error */
            GPIO_toggle(CONFIG_GPIO_GLED);
            GPIO_toggle(CONFIG_GPIO_RLED);
        }
    
        Semaphore_post(txDoneSem);
    }
    #endif //RFEASYLINKTX_ASYNC
    
    static void rfEasyLinkTxFnx(UArg arg0, UArg arg1)
    {
        uint8_t txBurstSize = 0;
        uint32_t absTime;
        uint8_t freqFlag = false;
    
    #ifdef RFEASYLINKTX_ASYNC
        /* Create a semaphore for Async */
        Semaphore_Params params;
        Error_Block eb;
    
        /* Init params */
        Semaphore_Params_init(&params);
        Error_init(&eb);
    
        /* Create semaphore instance */
        txDoneSem = Semaphore_create(0, &params, &eb);
        if(txDoneSem == NULL)
        {
            System_abort("Semaphore creation failed");
        }
    
    #endif //TX_ASYNC
    
        // Initialize the EasyLink parameters to their default values
        EasyLink_Params easyLink_params;
        EasyLink_Params_init(&easyLink_params);
    
        /*
         * Initialize EasyLink with the settings found in ti_easylink_config.h
         * Modify EASYLINK_PARAM_CONFIG in ti_easylink_config.h to change the default
         * PHY
         */
        if(EasyLink_init(&easyLink_params) != EasyLink_Status_Success)
        {
            System_abort("EasyLink_init failed");
        }
    
        /*
         * If you wish to use a frequency other than the default, use
         * the following API:
         * EasyLink_setFrequency(868000000);
         */
    
        while(1) {
    
            if (freqFlag)
            {
                EasyLink_setFrequency(878000000);
                freqFlag = false;
            }
            else
            {
                EasyLink_setFrequency(868000000);
                freqFlag = true;
            }
    
            EasyLink_TxPacket txPacket =  { {0}, 0, 0, {0} };
    
            /* Create packet with incrementing sequence number and random payload */
            txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
            txPacket.payload[1] = (uint8_t)(seqNumber++);
            uint8_t i;
            for (i = 2; i < RFEASYLINKTXPAYLOAD_LENGTH; i++)
            {
              txPacket.payload[i] = rand();
            }
    
            txPacket.len = RFEASYLINKTXPAYLOAD_LENGTH;
    
            /*
             * Address filtering is enabled by default on the Rx device with the
             * an address of 0xAA. This device must set the dstAddr accordingly.
             */
            txPacket.dstAddr[0] = 0xaa;
    
            /* Add a Tx delay for > 500ms, so that the abort kicks in and brakes the burst */
            if(EasyLink_getAbsTime(&absTime) != EasyLink_Status_Success)
            {
                // Problem getting absolute time
            }
            if(txBurstSize++ >= RFEASYLINKTX_BURST_SIZE)
            {
              /* Set Tx absolute time to current time + 1s */
              txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(1000);
              txBurstSize = 0;
            }
            /* Else set the next packet in burst to Tx in 100ms */
            else
            {
              /* Set Tx absolute time to current time + 100ms */
              txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(100);
            }
    
    #ifdef RFEASYLINKTX_ASYNC
            EasyLink_transmitAsync(&txPacket, txDoneCb);
            /* Wait 300ms for Tx to complete */
            if(Semaphore_pend(txDoneSem, (300000 / Clock_tickPeriod)) == FALSE)
            {
                /* TX timed out, abort */
                if(EasyLink_abort() == EasyLink_Status_Success)
                {
                    /*
                     * Abort will cause the txDoneCb to be called and the txDoneSem
                     * to be released, so we must consume the txDoneSem
                     */
                   Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER);
                }
            }
    #else
            EasyLink_Status result = EasyLink_transmit(&txPacket);
    
            if (result == EasyLink_Status_Success)
            {
                /* Toggle GLED to indicate TX */
                GPIO_toggle(CONFIG_GPIO_GLED);
            }
            else
            {
                /* Toggle GLED and RLED to indicate error */
                GPIO_toggle(CONFIG_GPIO_GLED);
                GPIO_toggle(CONFIG_GPIO_RLED);
            }
    #endif //RFEASYLINKTX_ASYNC
        }
    }
    
    void txTask_init() {
    
        Task_Params_init(&txTaskParams);
        txTaskParams.stackSize = RFEASYLINKTX_TASK_STACK_SIZE;
        txTaskParams.priority = RFEASYLINKTX_TASK_PRIORITY;
        txTaskParams.stack = &txTaskStack;
        txTaskParams.arg0 = (UInt)1000000;
    
        Task_construct(&txTask, rfEasyLinkTxFnx, &txTaskParams, NULL);
    }
    
    /*
     *  ======== main ========
     */
    int main(void)
    {
        /* Call driver init functions. */
        Board_initGeneral();
        GPIO_init();
    
        GPIO_setConfig(CONFIG_GPIO_RLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        GPIO_write(CONFIG_GPIO_RLED, CONFIG_GPIO_LED_OFF);
        GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF);
    
        txTask_init();
    
        /* Start BIOS */
        BIOS_start();
    
        return (0);
    }
    

    我在该项目中也定义了两个 PHY (自定义868、预分频2.4)。

    它看起来工作正常、因为我可以在两个板上接收数据包、这两个板根据各自的接收频率进行了调整。

    我的问题是、每次您想更改频率时是否有理由重新初始化 EasyLink 堆栈? 您可以如上面的示例所示即时更改频率。

    此致、

    Arthur

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

    尊敬的 Arthur:

    感谢你的答复。 也许我没有充分说明我的应用和我想要实现的目标。

    在我的应用中、我使用多个频率 对网络中的不同节点组进行多路复用、因此组1使用一个频率、组2再次使用另一个频率。 我在共享代码中所做的只是初始化 EasyLink、然后切换到该节点的默认组(即频率)。 稍后、我还希望能够在运行时切换频率、但现在、即使切换到初始频率也不起作用、正如我在原始帖子中提到的那样。

    因此、每次我想更改频率时、我都不会重新初始化 EasyLink 堆栈、错误就在我第一次调用 EasyLink_init 和第一次调用 EasyLink_setFrequency 之后发生。

    然后、我的后续问题是 CMD_FS 操作的状态可能为 0x0808的原因、这意味着频率合成器尚未配置、即使我(成功)事先调用了 EasyLink_init 也是如此。

    在给定此错误的情况下、我  进一步检查了 EasyLink_init 的行为、发现 EasyLink 初始化函数中的 cmdF 操作已经失败。 遗憾 的是、运行 cmdF 操作时没有执行错误处理、因此我添加了一个简单的 if 语句、以在运行后检查 cmdF 状态。 实际上、当使用自定义 PHY 和250kbps 预定义 PHY 时、它具有相同的状态(ERROR_NO_FS)、其状态为 DONE_OK (已完成)、请参阅下面的代码(来自  EasyLink_init)。

    EasyLink_Status EasyLink_init(EasyLink_Params *params)
    {
        if (params == NULL)
        {
            EasyLink_Params_init(&EasyLink_params);
        } else
        {
            memcpy(&EasyLink_params, params, sizeof(EasyLink_params));
        }
        
        .
        .
        .
    
            //Set the frequency
            (void)RF_runScheduleCmd(rfHandle, (RF_Op*)&EasyLink_cmdFs, &schParams_prop, 0, //asyncCmdCallback,
                    EASYLINK_RF_EVENT_MASK);
        }
        else
        {
            //Set the frequency
            (void)RF_runCmd(rfHandle, (RF_Op*)&EasyLink_cmdFs, RF_PriorityNormal, 0, //asyncCmdCallback,
                    EASYLINK_RF_EVENT_MASK);
        }
    
        /* With Custom Phy:      EasyLink_cmdFs.status = ERROR_NO_FS 
         * With pre-defined Phy: EasyLink_cmdFs.status = DONE_OK
         */
        if (EasyLink_cmdFs.status == ERROR_NO_FS)
        {
            return EasyLink_Status_Config_Error;
        }
    
        //Create a semaphore for blocking commands
        Semaphore_Params semParams;
        Error_Block eb;
        
        .
        .
        .
    }

    我还测试了您的代码、它可以正常工作。 我可以分享我的整个项目、但如果可能的话、我希望它不会公开。

    感谢您的参与。

    此致、

    Alex

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

    尊敬的 Alex:

    感谢您的澄清。 我想我知道为什么您的自定义 phy 失败了。

    在比较我们各自的无线电配置文件时,我看到您的“RF_Mode”对象设置为“RF_MODE_Oprietary _2_4”,而不是 “RF_MODE_AUTO”。 这看起来像是一个可能的错误。

    我实际上成功地重现了这个文件生成错误。 您可以使用 SysConfig 通过设置以下参数来修复它:

    这看起来像是 SysConfig 中的一个错误、我将尝试对其进行修改。 您能否尝试同时进行这种操作并让我知道结果?

    此致、

    Arthur

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

    尊敬的 Arthur:

    感谢你的答复。 我不确定我是否理解正确、但您显示的设置不会使用自定义 PHY 设置、而是使用始终有效的预定义设置。 我很确定我在这里遗漏了一些东西。

    此外、我从您的帖子中了解到、对于自定义 PHY、我应该使用 RF_MODE_AUTO 而不是 RF_MODE_ProprietY_2_4。 如何手动更改.rfMode 属性? 我无法直接在文件中执行该操作、因为每次我构建项目时都会新建该文件。 我也无法从编译中排除该文件、因为它将完全消失。

    此外、我发现非常 奇怪的是、所有这些 RF_MODE 定义似乎都具有在 rf_mailbox.h 中定义的相同值

    /// \name RF mode values
    /// Defines used to indicate mode of operation to radio core.
    ///@{
    #define RF_MODE_AUTO             0x00
    #define RF_MODE_BLE              0x00
    #define RF_MODE_IEEE_15_4        0x00
    #define RF_MODE_PROPRIETARY_2_4  0x00
    #define RF_MODE_PROPRIETARY      RF_MODE_PROPRIETARY_2_4
    #define RF_MODE_MULTIPLE         0x00
    ///@}

    这是正常的吗?

    此致、

    Alex

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

    您好、Alexander、

    事实上,这似乎不是这样。

    仅供参考,您可以禁用文件生成,一旦使用以下菜单生成文件:

    只需复制要保留在项目中其他位置的文件、然后取消勾选要保留修改的文件。

    您看到的 RF_MODE 定义实际上是出于向后兼容性的原因、因此对 CC1352P 没有任何影响

    此致、

    Arthur

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

    您好、Alexander、

    我设法重现了频率设置问题。 实际上、在 radio_config.c 文件中、rf_cmdPropRadioDivSetup 结构的 txPower 字段设置为0xFFFF。 您可以尝试将其设置为0x7212吗?

    SysConfig/EasyLink 中的高 PA 设置似乎存在问题、这可能是错误。

    此致、

    Arthur

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

    尊敬的 Arthur:

    谢谢、就是这样。 正如 您所说、在 RF_cmdPropRadioDivSetup 结构中、.txPower 为0xFFFF。 我还复制了该值的初始设置方式、结果是在我在 SysConfig 中启用高 PA 时设置该值、请参阅下图。 由于  CC1352P 板目前都不支持专有无线电上的高 PA、因此可以将其禁用。

    这可能只是我的 SysConfig 版本(1.12.0)的问题、但也可能是通过当前最新版本(1.13.0)修复的问题。

    再次感谢你。

    此致、

    Alex