This repository contains driver for the FH101RF tri-band Wake-Up Radio (433MHz, 868/915MHz, 2.4GHz).
The FH101RF RFicient ® Ultra-low Power Wake-Up Receiver is a tri-band receiver for simultaneous reception of OOK modulated signals in the SRD frequency bands 433 MHz, 868 MHz or 915 MHz, and 2.4 GHz, with a sensitivity of typically -75 dBm. It allows continuous monitoring at microwatt power consumption and responds in milliseconds, enabling 24/7 connectivity and up to 10 years of battery life. The integrated ULP receiver operates without a microcontroller, recognizing two wake-up patterns and a 16-bit ID. It generates a control signal to activate application hardware like an MCU, allowing direct addressing of individual RF modules. Data packets are stored in three built-in FIFO buffers, and data events can trigger an IRQ signal for external circuitry, supporting deep-sleep modes for peripherals. RFicient ® uses binary correlators to detect 31-bit preambles, tolerating bit-error rates up to 16 %. – Fraunhofer IIS
If you use this driver in an academic or industrial context, please cite the following publication:
@misc{schultess25_wakem,
author = {Lukas Schulthess and Silvano Cortesi and Michele Magno},
title = {Wakemod: a 6.9uw Wake-Up Radio Module With -72.6dbm Sensitivity for On-Demand Iot},
year = 2025,
doi = {10.48550/ARXIV.2505.21529},
url = {https://arxiv.org/abs/2505.21529},
eprint = {2505.21529},
archiveprefix = {arXiv},
primaryclass = {cs.NI},
DATE_ADDED = {Sun Jun 1 12:42:45 2025},
}The repository is build on top of the datasheet FH101RF_LZE_Datasheet_Revision_1p3b_A_1 and contains:
The YAML specification of the driver, as used by Reginald to create the struct fields
The yaml file can be automatically parsed using Reginald, based on branch schilkp/rust, commit dc4ff0d.
The rust version is built (from within rust/src/) using:
reginald gen -i ../../fh101rf.yaml -o registers.rs rs-structs --enum-derive "Debug" --struct-derive "Debug" --enum-derive "PartialEq" --struct-derive "PartialEq"The C version is built (from within c/) using:
reginald gen -i ../fh101rf.yaml -o fh101rf_reg.h c-funcpackThe markdown datasheet is build (from within /) by using:
reginald gen -i ./fh101rf.yaml -o fh101rf_reg.md md-datasheetThe rust driver consists of lib.rs, device.rs, config.rs, error.rs and registers.rs. registers.rs is the only auto-created file using reginald, and contains the register structs as well as pack/unpack functions.
The C driver consists of fh101rf.c, fh101rf.h and fh101rf_reg.h. fh101rf_reg.h is the only auto-created file using reginald, and contains the register structs as well as pack/unpack functions.
The example projects make automatically use of the drivers described above, and can be used as a reference for the implementation. The following pinout holds:
| Peripheral | Functionality |
|---|---|
| SPI1 | SPI peripheral used for communication |
| PA5 | SCK pin used together with SPI1 |
| PA7 | MOSI pin used together with SPI1 |
| PA6 | MISO pin used together with SPI1 |
| PC9 | CS pin used for SPI |
| PC6 | RST pin |
| PC7 | IRQ pin (GPO1) |
| GPDMA1_CH0 | DMA channel for TX on SPI1 |
| GPDMA1_CH1 | DMA channel for RX on SPI1 |
- Note: The C example does not use the MISO pin, but uses the SPI peripheral in Half-Duplex mode
- Note: The Rust example does use MOSI and MISO pin (SPI in Full-Duplex), thus must be connected as in chapter 6.2 of the datasheet