Overview: EFR32 Power Amplifiers and RAIL#

The EFR32 families of chips each come equipped with Power Amplifiers (PAs) as follows:

  • EFR32xG21

    • A high-power 2.4 GHz PA (for power 20 dBm and lower)**

    • A medium-power 2.4 GHz PA (for power 10 dBm and lower)

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

  • EFR32xG22

    • A high-power 2.4 GHz PA (for power 6 dBm and lower)**

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

  • EFR32xG23x02x

    • A high-power Sub-GHz PA (for power 20 dBm and lower)**

  • EFR32xG23x01x

    • A high-power Sub-GHz PA (for power 14 dBm and lower)**

  • EFR32xG24x02x

    • A high-power 2.4 GHz PA (for power 20 dBm and lower)**

  • EFR32xG24x01x

    • A high-power 2.4 GHz PA (for power 10 dBm and lower)**

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

  • EFR32xG25

    • A single PA for OFDM operation

    • A single PA for Sub-GHz (FSK) operation

  • EFR32xG26x02x

    • A high-power 2.4 GHz PA (for power 20 dBm and lower)**

  • EFR32xG26x01x

    • A high-power 2.4 GHz PA (for power 10 dBm and lower)**

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

  • EFR32xG27x02x

    • A high-power 2.4 GHz PA (for power 4 dBm and lower)**

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

  • EFR32xG27x01x

    • A high-power 2.4 GHz PA (for power 6/8 dBm and lower)**

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

  • EFR32xG28x02x

    • A high-power 2.4 GHz PA (for power 20 dBm and lower)**

    • A high-power Sub-GHz PA (for power 20 dBm and lower)**

  • EFR32xG28x01x

    • A high-power 2.4 GHz PA (for power 14 dBm and lower)**

    • A high-power Sub-GHz PA (for power 14 dBm and lower)**

  • SixG301

    • A high-power 2.4 GHz PA (for power 10 dBm and lower)**

    • A low-power 2.4 GHz PA (for power 0 dBm and lower)

Each of these PAs has a unique number of discrete "power levels", which are simply abstractions of the different register settings that control the active PA. For each PA, the following power levels are available:

  • EFR32xG21

    • High-power 2.4 GHz: 1-180**

    • Medium-power 2.4 GHz: 1-90

    • Low-power 2.4 GHz: 1-64

  • EFR32xG22

    • High-power 2.4 GHz: 0-127**

    • Low-power 2.4 GHz: 0-15

  • EFR32xG23x02x

    • High-power Sub-GHz: 0-240**

  • EFR32xG23x01x

    • High-power Sub-GHz: 0-240**

  • EFR32xG24x02x

    • High-power 2.4 GHz: 0-180**

  • EFR32xG24x01x

    • High-power 2.4 GHz: 0-90**

    • Low-power 2.4 GHz: 0-15

  • EFR32xG25

  • EFR32xG26x02x

    • High-power 2.4 GHz: 0-180**

  • EFR32xG26x01x

    • High-power 2.4 GHz: 0-90**

    • Low-power 2.4 GHz: 0-15

  • EFR32xG27x02x

    • High-power 2.4 GHz: 0-127**

    • Low-power 2.4 GHz: 0-15

  • EFR32xG27x01x

    • High-power 2.4 GHz: 0-127**

    • Low-power 2.4 GHz: 0-15

  • EFR32xG28x02x

    • High-power 2.4 GHz: 0-240**

    • High-power Sub-GHz: 0-240**

  • EFR32xG28x01x

    • High-power 2.4 GHz: 0-240**

    • High-power Sub-GHz: 0-240**

  • SixG301

Note: that the use of 'high', 'medium', and 'low' in the names of these PAs refers to power consumption, not power output. It is possible, for instance, to configure the high-power PA to transmit at a lower dBm output than the low-power PA.

Maximum power/use of these PAs may be restricted by your specific OPN. See the data sheet for more details regarding your particular part.

Although the number of power levels varies across different PAs, for any given PA, a higher power level generally indicates a higher dBm output power. It is important to realize that a PA power level does not always correspond to the same dBm output power across boards and applications.

The power is set using sl_rail_set_tx_power_dbm() which sets the registers by using values provided by a powersetting mapping table. sl_rail_util_pa component provides the newer RAIL 3.0 PA utilities to help convert dBm to hardware-specific PA powersetting values. The ramp time and voltage for the PAs are set by calling sl_rail_util_pa_post_init() after sl_rail_init(). The default values are provided by sl_rail_util_pa_config.h file of the sl_rail_util_pa component. Setting the power takes care of setting a sub-mode (High-power, Low-power) automatically. It is recommended that a channel or PHY is correctly established prior to setting the power through sl_rail_set_tx_power_dbm(). sl_rail_util_pa component also provides sl_railcb_convert_ddbm_to_power_setting_entry() which is used as a callback by RAIL library to get a powersetting value for a certain deci-dBm.

It is recommended to build the applications for the specific boards as it pulls correct board-specific configurations and thus helps to correctly pick a powersetting table among the different options provided. Simplicity Studio automatically takes care of this while building for an OPN. Series 2 modules currently do not work with RAIL 3.0 PA plugin sl_rail_util_pa and instead rail_util_pa plugin should be used. Silicon Labs plans to address this limitation in a near-future release. If a project needs to be used for both SoC and a module, it is recommended to pull in sl_rail_util_compatible_pa which correctly pulls sl_rail_util_pa for SoC and rail_util_pa for module.

The sl_rail_util_pa plugin pulls in the sl_rail_util_pa_tables plugin which provides PA mapping tables that convert between dBm powers and hardware-specific PA power settings. Silicon Labs is moving away from RAIL 2.x's conversion method of curves and towards mapping table that can have more than just power levels. The component provides multiple options for different platforms and chooses one default powersetting mapping table through SL_RAIL_UTIL_PA_TABLE_HEADER.

Multiple PA modes (2.4GHz, Sub-GHz, Linear OFDM) and different options for each PA mode are provided when supported by the platform. For example, EFR32xG25 supports Linear OFDM and Sub-GHz, so it has two different tables to represent each of them. Similarly EFR32xG28 supports 2.4GHz and Sub-GHz and therefore has two different tables to represent each of them. The rest of the series 2 parts and SixG301 support only one band and have one set of powersetting tables.

Each powersetting table can be selected from different options for SL_RAIL_UTIL_PA_TABLE_HEADER, this mainly depends on PAs available on that chip. For example, on EFR32xG24x01x there is a 10 dBm PA and 0 dBm PA, so choices for SL_RAIL_UTIL_PA_TABLE_HEADER are:

  • sl_rail_util_pa_dbm_powersetting_mapping_table_10dbm.h which provides conversions for 10 dBm PA

  • sl_rail_util_pa_dbm_powersetting_mapping_table_0dbm.h which provides conversions for 0 dBm PA

  • sl_rail_util_pa_dbm_powersetting_mapping_table_automode_0_10dbm.h that provides conversions for 0 dBm PA for the range close to 0 dBm and otherwise conversions for 10 dBm PA and automatically switches among them depending on the requested power.

In RAIL 2.x, there was a concept of power level and the power level of the active PA was controlled by the RAIL_GetTxPower() and RAIL_SetTxPower() APIs. RAIL_GetTxPowerDbm() and RAIL_SetTxPowerDbm() also allowed users to interface with dBm output power values, but they were merely utility functions that combine calls to RAIL_ConvertRawToDbm(), RAIL_ConvertDbmToRaw(), RAIL_SetTxPower(), and RAIL_GetTxPower(). They added no new functionality or features on their own. Although these PA power levels add another layer of complexity to PA control, they give the user much more control to account for parasitics and impedance mismatch between the PA and a custom board. These APIs are deprecated in RAIL 3.0.

RAIL 2.x allowed users to assign an exact dBm power to each of the PA power levels for their custom boards through the functions RAIL_ConvertDbmToRaw() and RAIL_ConvertRawToDbm(). Note that these functions convert between raw power levels and deci-dBm, or dBm * 10, to allow for higher precision dBm values. Though Silicon Labs provides a default implementation for these functions to do the conversion, the user can also override these functions with other algorithms, ranging from a highly precise but space-intensive lookup table for all possible PA-power level combinations, to less robust solutions such as a lookup table containing only a few power levels that correspond to the dBm output power levels of interest (see Alternative Methods to Convert between Power Levels and dBm Output Power for more information on creating custom conversion functions).

For the default conversion function implementation in RAIL 2.x, Silicon Labs used an 8-segment, piecewise linear curve fit of the mapping between PA power levels and dBm output powers to convert between these quantities. On EFR32xG21 and EFR32xG23 chips, there was one curve for each PA. On EFR32xG22 and EFR32xG24 chips, there was one curve for the high-power 2.4GHz PA. For these PAs, this method provided a good balance between accuracy across power levels, computational speed, and code size. The conversion for low-power 2.4GHz on EFR32xG22 and EFR32xG24, which have fewer than 20 possible values, was handled with a simple lookup table.

The section [Piecewise Linear Curve Fits](./02-generating-the-piecewise-linear-segment- data-used-for-conversion.md) focuses on how to generate the curve data (slopes and y-intercepts) for a custom application, similar to the default values currently found in pa_curves_efr32xg2x.h in RAIL 2.8 and earlier versions and in sl_rail_util_pa_curves.h in RAIL 2.9 and later versions. In other words, it assumes that the existing methodologies found in RAIL_ConvertDbmToRaw() and RAIL_ConvertRawToDbm() are appropriate for your application and will not be over-written, but that the parameters for these functions need to be adjusted for the custom board.

This application note is not intended for use with Silicon Labs’ pre-certified Wireless SiP and PCB modules. The power amplifiers on these parts have been calibrated specifically to adhere to certain regulations. Trying to alter these calibrations in software will cause the RAIL library to assert and lock the chip, preventing further use until Silicon Labs’ default libraries are restored.

In the following procedures, use the railtest and pa_customer_curve_fits.py script from RAIL 2.5 or higher in Proprietary Flex SDK version 2.4.0 or higher, even if you are developing in an earlier Proprietary Flex SDK 2.x version. Improvements to the app and script that will subtly improve results. If you have already generated the CSV files from the procedure in Piecewise Linear Curve Fits, you can simply re-run the newer pa_customer_curve_fits.py on the existing CSVs. There is no need to re-generate the CSVs by running the sweep again.