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
"power levels" not supported; instead dBm is converted to powerSetting (see section dBm-to-powerSetting Mode)
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
"power levels" not supported; instead dBm is converted to powerSetting (see section dBm-to-powerSetting Mode)
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.