Fine control of the RFSENSE detection threshold
RFSENSE is an ultra-low energy RF detector peripheral available on many Silicon Labs EFR32 devices. It allows the device to remain in deep sleep modes (EM2 to EM4) and wake up when RF energy above a specified threshold is detected. This feature is useful for applications where minimizing power consumption is critical, such as battery-powered devices that only need to wake up when a relevant RF signal is present.
Key Features:
- Wake from Deep Sleep: RFSENSE can wake the device from EM2, EM3, or EM4 modes upon detecting RF energy.
- Wideband Detection: It detects energy in a wide frequency range (100 MHz – 5 GHz), filtered only by the RF front-end matching network. This means it can be triggered by any strong RF signal in the band, not just the intended protocol or frequency.
- Modes of Operation:
- Legacy Mode: Triggers a wakeup if RF energy is present for a configured duration. This is the only mode supported on Series 1 devices.
- Selective Mode: (Available on newer devices like EFR32xG22 and later) Detects a specific OOK (On-Off Keying) preamble and sync word pattern, reducing false wakeups from unrelated RF sources. The wakeup packet is Manchester coded, with a 1-byte preamble and 1–4 byte sync word, typically sent at 1 kbps on 2.45 GHz. This mode is more robust in noisy environments and allows for targeted wakeup by a specific transmitter.
Configuration and Default detection thresholds:
In Selective mode, RFSENSE mode uses 0.5 kbps Manchester encoded OOK detection which allows the chip to wake up upon detecting particular preamble and sync word pattern sent using OOK.
To configure RFSENSE you need to add one include to your project and declare a structure:
#include "rail.h"
RAIL_RfSenseSelectiveOokConfig_t rfsense_config = {
.band=RAIL_RFSENSE_2_4GHZ,
.syncWordNumBytes=2,
.syncWord=0xB16F, ,
.cb=NULL
};
the band definition will trigger the default sensitivity threshold
- Low sensitivity: RAIL_RFSENSE_2_4GHZ_LOW_SENSITIVITY
- High sensitivity: RAIL_RFSENSE_2_4GHZ
see device datasheet for corresponding dBm.
Then you need to start the selective RFsense using:
RAIL_StartSelectiveOokRfSense(railHandle, *rfsense_config);
Fine tune detection threshold:
2025.6.1 SiSDK added a way to control the Threshold in a finer way. If you use that method, you need to qualify its performance on your hardware because only default thresholds described above are characterized.
The RAIL header to include is different for this method.
The structure definition is the same and using RAIL_RFSENSE_2_4GHZ band the threshold is set with sl_rail_rf_sense_high_sensitivity_value.
The units are platform-dependent and range from 0 (highest sensitivity) to 254 (lowest sensitivity)
Therefore, to start the selective RFsense you'll need:
#include "sl_rail.h"
RAIL_RfSenseSelectiveOokConfig_t rfsense_config = {
.band=RAIL_RFSENSE_2_4GHZ,
.syncWordNumBytes=2,
.syncWord=0xB16F, ,
.cb=NULL
};
...
sl_rail_rf_sense_high_sensitivity_value = 35; // set your threshold, default value is 63
RAIL_StartSelectiveOokRfSense(railHandle, *rfsense_config);