RF Sense on EFR32xG22#
RF Sense is a low-power feature available on EFR32 Wireless MCU devices, except on EFR32xG23. With it, the radio can sense the presence of RF energy and "wake up" an MCU from EM2 (or any other) power mode. In practice, RF Sense provides an ultra-low power interrupt source that runs on the ULFRCO clock.
Since the RFSENSE block implements a wide band circuit, it can detect energy in a broad frequency range between 100MHz and 5GHz - filtered only by the matching network of the RF front end. On one hand this is an advantage, as there is no need for additional PCB components to support the feature. However, there is a drawback: the wake-on-RF capability is responsive to any unfiltered interferer signals.
EFR32xG22 devices include an enhanced RF Sense module, which improves performance as compared to the EFR32 Series 1 implementation in multiple ways:
RF Sense works below 0oC.
RF Sense works even when voltage is scaled down.
In addition to legacy behavior, the EFR32xG22 introduces "Selective Mode" RF Sense.
Legacy Mode#
In Legacy (Energy Detection) mode, EFR32xG22 RF Sense is fully compatible with the feature in Series 1 devices. This means that if the RF Sense module detects energy for a configured duration, it generates an interrupt.
Selective Mode#
Selective mode mitigates the unfiltered nature of RF Sense. Instead of simply detecting energy for a given time period, it detects "a pattern of energy" - which is essentially an On-Off Keying (OOK) packet. The packet is Manchester-coded and uses a fixed 1 kbps bitrate, 1 B preamble, and 1-4 B sync word (no payload is added, see additional details below). This packet can be transmitted by any 2.4 GHz OOK-capable device, including most EFR32 wireless MCUs.
Setting Up Selective RF Sense#
Start Selective RF Sense by calling the API sl_rail_start_selective_ook_rf_sense()
instead of the legacy sl_rail_start_rf_sense().
The API takes a p_config parameter of type sl_rail_rf_sense_selective_ook_config_t*, which sets up the desired RFSENSE Selective mode sync word configuration.
After you call this function, the interrupt is enabled, and the device can enter sleep mode.
On the transmit side, call sl_rail_config_rf_sense_selective_ook_wakeup_phy() to switch the radio configuration to the special wakeup PHY. Next, configure the wakeup packet by calling sl_rail_set_rf_sense_selective_ook_wakeup_payload() so that it matches the configuration on the RX side. Finally, sl_rail_start_tx(), or any other TX API, to send the wakeup packet. See Selective Mode Transmit Example Without Using API for an illustration.
Selective RF Sense (RX and TX) can be performed in RAILtest as well, see RAILtest User’s Guide for details.
Note: On EFR32xG21 devices, you cannot transmit the Wakeup Packet due to the lack of OOK support.
The Wakeup Packet#
The wakeup packet is a fixed-configuration OOK packet with the following settings:
Starts with a 1 B preamble (always 0x55).
Followed by a 1-4 B sync word.
No payload required.
Both the preamble and sync word are transmitted LSB first.
1 kcps chiprate (Manchester coded)/500 bps bitrate (useful data rate).
Recommended carrier is 2.45 GHz (EFR32 radios use this frequency).
Selective Mode Transmit Example Without Using API#
Assume you select 0xb16e as your sync word, and you want to transmit it with only a signal generator (or a simple radio with MSB-first byte handling and no Manchester coder).
First, flip the endianness of both preamble and sync word: 0x55 becomes 0xaa and 0xb16e becomes 0x768d.
The full packet is then 0xaa768d, which after Manchester coding becomes 0x99996a6995a6.
Configuring this encoded packet and transmitting on 2.45 GHz with high enough TX power should wake up a device configured for selective RF Sense with the 0xb16e sync word.