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:在切换不同功率级别的 PA 时出现问题

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1510221/cc1311p3-trouble-switching-pas-for-different-power-levels

器件型号:CC1311P3

工具/软件:

我正在开发支持在不同地区运行的无线电固件。  在本例中、一个区域需要14dBm (低功耗侧)、所有其他区域可以20dBm (高功率侧)运行。  我为天线开关处理程序使用了 LP-CC1311P3的默认实现、并确认在启动无线电时代码进入该模块。  我已经确认了硬件的 GPIO 映射(它们与 LP 不同。

/*
 * ======== rfDriverCallbackAntennaSwitching ========
 * Sets up the antenna switch according to the TX power table PA type.
 *
 * Truth table:
 *
 * Path       DIO9  DIO10 <- See syscfg
 * ========== ===== ===== 
 * Off        0     0
 * HIGH PA    1     0
 * SUB1 GHZ   0     1
 */
void rfDriverCallbackAntennaSwitching(RF_Handle client, RF_GlobalEvent events, void *arg)
{
    if (events & RF_GlobalEventRadioSetup) {
        /* Switch off all paths. */
        GPIO_write(CONFIG_RF_HIGH_PA, 0);
        GPIO_write(CONFIG_RF_SUB1GHZ, 0);

        /* Decode the current PA configuration. */
        RF_TxPowerTable_PAType paType = (RF_TxPowerTable_PAType)RF_getTxPower(client).paType;

        if (paType == RF_TxPowerTable_HighPA) {
            /*
            * Mux GPIOs to RF Core signals:
            * - High PA    --> HIGH PA
            * - LNA enable --> Sub-1 GHz
            */
            GPIO_setConfigAndMux(CONFIG_RF_HIGH_PA, GPIO_CFG_OUTPUT, IOC_PORT_RFC_GPO3);
            GPIO_setConfigAndMux(CONFIG_RF_SUB1GHZ, GPIO_CFG_OUTPUT, IOC_PORT_RFC_GPO0);
        } else {
            /* RF Core active --> Sub-1 GHz */
            GPIO_write(CONFIG_RF_SUB1GHZ, 1);
        }
    }
    else if (events & RF_GlobalEventRadioPowerDown) {
        /* Switch off all paths. */
        GPIO_write(CONFIG_RF_HIGH_PA, 0);
        GPIO_write(CONFIG_RF_SUB1GHZ, 0);

        /* Reset the IO multiplexer to GPIO functionality */
        GPIO_setConfigAndMux(CONFIG_RF_HIGH_PA, GPIO_CFG_OUTPUT, IOC_PORT_GPIO);
        GPIO_setConfigAndMux(CONFIG_RF_SUB1GHZ, GPIO_CFG_OUTPUT, IOC_PORT_GPIO);
    }
}

在运行时、我可以使用开发工具切换运行区域。  这样我就可以验证各个区域的输出功率级别。  在这样做的时候,我提出了一些意见:

1 -首先使用低功耗侧时、它输出约10dBm 而不是14dBm (该区域位于868 MHz 频带)、因此看起来过低。

2 -如果使用高功率侧、然后我们返回低功率、低功率输出非常低(约-20dBm)。  我进行了检查、我认为这是因为、当从高电平切换到低电平时、天线开关回调绝不会将 GPIO 返回到 GPIO 模式(将 GPIO 从高功率选择保留在 RFC 模式中)。  我在 paType 更改时添加了代码来执行此操作、然后看到的功率约为8dBm、而不是10dBm ...因此不知道为什么功率低于我们在低功耗模式下启动时的功率。

3 -使用高功率侧时、它始终输出预期的全功率>= 18.5dBm。  我们只使用了20dBm 设置和高功率 PA。  我们有一个区域在868 MHz 处使用高功率 PA、使用时也会输出全功率。

4 -更改该区域的电源时、不会 在回调中执行 RF_GlobalEventRadioPowerDown 路径、因此我们绝不会将 PA 控制引脚切换回 GPIO 模式。

什么是我的缺失?  是否有方法可以在不断电的情况下从高功率 PA 切换到低功率路径?  是否有一些先决条件、例如在我们需要时重新安装射频内核?  是否有理由使低功耗路径远低于预期?

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

    您好、David:

    我可以询问您在器件配置(CCFG)中对 FORCE_VDDS 进行了什么设置吗? 此设置在编译时设置、需要启用此设置才能实现+20dBm、因此我建议您启用它。

    关于您怀疑的过低值:您如何测量 Tx 输出功率? 对该值进行良好的测量可能很困难。 我建议您从 SmartRF Studio 默认设置开始并测量 Tx 输出功率、请将其用作"校准"。 例如、如果您将其设置为+14 dBm 并测量+12 dBm、则可以放心地说您的测量方法是衰减2dBm。

    还可以在更改 Tx 输出功率时发布代码片段吗?

    谢谢、

    Marie H

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

    下面是用于设置 Tx 功率的代码块。  它用在我们的射频驱动器胶合层中。

    void RF_SetPower(int16_t power_dbmx10)
    {   // The RF library provides a discrete RF_setTxPower() function which can
        // be used directly instead of injecting the data into the
        // RF_cmdPropRadioDivSetup object.  This is convenient since we typically
        // just set that object once at init.
        
        // Starting with this version of the radio, region max power levels
        // are absolute (based on regional requirement, not hardware limitations).
        // Therefore, restrict requested power to max supported in the table.
        // Also, only deal with whole number values (no decimal)
        int8_t power_dbm = power_dbmx10 / 10;
        if(power_dbm > 20)
            power_dbm = 20;
        
        // Find the selected power setting in the power table
        // The table supports 1 dBm increments.  However, finer granularity could
        // be had by manually adjusting the RF_TxPowerTable_Value parameters
        RF_TxPowerTable_Value power_value = RF_TxPowerTable_findValue(txPowerTable_868_pa13_20, power_dbm);
        if(power_value.rawValue != RF_TxPowerTable_INVALID_VALUE)
            RF_setTxPower(RF_ObjPtr, power_value);
    
    // *** Below chunk is for power compensation testing ***
        // // Override the default PA values to test if we can get more...
        // // bias, ibboost, boost, coefficient, ldotrim
        // // Testing at 900 MHz:
        // // 18, 3, 0, 71, 27 -> 18.84 dBm
        // // 19.2 dBm with max bias and the rest left alone
        // uint8_t bias = 18;          // 18, 6 bits
        // uint8_t ibboost = 3;        // 3, 2 bits
        // uint8_t boost = 0;          // 0, 1 bit (low / high drive)
        // uint8_t temp_coeff = 71;    // 71, 7 bits
        // uint8_t ldotrim = 27;       // 27, 6 bits
    
        // // The manual's formula implies bias increase as temperature increases
        // int8_t temp = 25; // °C
        // bias = bias + (((temp - 25) * temp_coeff) / 256);
    
        // RF_TxPowerTable_Value power_value = RF_TxPowerTable_HIGH_PA_ENTRY(bias, ibboost, boost, temp_coeff, ldotrim);
        // RF_setTxPower(RF_ObjPtr, power_value);
    // ***
    
        // The selected Tx Power will not take effect until the next transmission.
        // So, if we are performing a Tx Test, automatically restart it.
        if(RF_OpState == RF_State_TxTest)
            RF_TxTest(RF_OpTxTestMode);
    }

    对强制 VDDR 的深思熟虑。  我忘记了这个选项。  我们有引导加载程序和应用程序、CCFG 已加载引导加载程序、但在 CCFG 中未设置 Force VDDR。  我明天会尝试启用它。

    我使用直接连接到频谱分析仪的电缆测量输出功率。  当设置为20dBm 时、我的测量值为18.5dBm、这是合理/良好的。  低功耗的问题是、当我将功率设置为14dBm 时我们只能得到10dBm 或8dBm (我预计损耗为1-2dBm、而不是4-6dBm)。

    我明天还将再次查看 LP 套件。  我昨天跑了很久、今天就不在办公室了。

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

    我在 syscfg 中将"强制 VDDR 为1"、现在我的电路板输出功率与 LP-CC1311P3匹配以获得14dBm 的功率(未选中"启用高输出功率 PA")。  分析仪上两块电路板的输出功率约为11.7dBm。

    为了能够在运行时在低功耗和高功率 PA 之间切换、我必须修改天线开关功能、以便在低功耗模式下将 GPIO 焊盘恢复到 GPIO 模式。   在将低功耗焊盘设置为高电平之前、我必须调用 GPIO_setConfigAndMux ()(似乎 GPIO_setConfigAndMux ()不应用/保留之前的 GPIO_WRITE ()状态)。

    void rfDriverCallbackAntennaSwitching(RF_Handle client, RF_GlobalEvent events, void *arg)
    {
        if (events & RF_GlobalEventRadioSetup) {
            /* Switch off all paths. */
            GPIO_write(CONFIG_RF_HIGH_PA, 0);
            GPIO_write(CONFIG_RF_SUB1GHZ, 0);
    
            /* Decode the current PA configuration. */
            RF_TxPowerTable_PAType paType = (RF_TxPowerTable_PAType)RF_getTxPower(client).paType;
    
            if (paType == RF_TxPowerTable_HighPA) {
                /*
                * Mux GPIOs to RF Core signals:
                * - High PA    --> HIGH PA
                * - LNA enable --> Sub-1 GHz
                */
                GPIO_setConfigAndMux(CONFIG_RF_HIGH_PA, GPIO_CFG_OUTPUT, IOC_PORT_RFC_GPO3);
                GPIO_setConfigAndMux(CONFIG_RF_SUB1GHZ, GPIO_CFG_OUTPUT, IOC_PORT_RFC_GPO0);
    
                LED_SetFunctionState(LED_Function_HighPA, true);
            } else {
                /* In case HighPA was used previously, switch back to GPIO control */
                GPIO_setConfigAndMux(CONFIG_RF_HIGH_PA, GPIO_CFG_OUTPUT, IOC_PORT_GPIO);
                GPIO_setConfigAndMux(CONFIG_RF_SUB1GHZ, GPIO_CFG_OUTPUT, IOC_PORT_GPIO);
                
                /* RF Core active --> Sub-1 GHz */
                GPIO_write(CONFIG_RF_SUB1GHZ, 1);
    
                LED_SetFunctionState(LED_Function_HighPA, false);
            }
        }
        else if (events & RF_GlobalEventRadioPowerDown) {
            /* Switch off all paths. */
            GPIO_write(CONFIG_RF_HIGH_PA, 0);
            GPIO_write(CONFIG_RF_SUB1GHZ, 0);
    
            /* Reset the IO multiplexer to GPIO functionality */
            GPIO_setConfigAndMux(CONFIG_RF_HIGH_PA, GPIO_CFG_OUTPUT, IOC_PORT_GPIO);
            GPIO_setConfigAndMux(CONFIG_RF_SUB1GHZ, GPIO_CFG_OUTPUT, IOC_PORT_GPIO);
        }
    }