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#
Selective RF Sense can be started with the API RAIL_StartSelectiveOokRfSense()
instead of the legacy RAIL_StartRfSense()
. The API takes a config
parameter of type RAIL_RfSenseSelectiveOokConfig_t
that sets up the desired RFSENSE Selective mode sync word configuration. After this function is called, the interrupt is enabled and the device can enter sleep mode.
On the transmit side, calling RAIL_ConfigRfSenseSelectiveOokWakeupPhy()
switches the radio config to the special wakeup PHY. Next, configure the wakeup packet using RAIL_SetRfSenseSelectiveOokWakeupPayload()
so that it matches the configuration on the RX side. Finally, use RAIL_StartTx()
(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.