LoLRa project – Transmitting LoRa packets without radio using CH32V003, ESP8266, or ESP32-S2 MCU

The LoLRa project is a firmware-only LoRa transmission open-source project that works without a Semtech radio and instead relies on an I2S or SPI interface (so not exactly bit-banging) to transmit data with microcontrollers such as WCH CH32V003, or Espressif Systems ESP8266 and ESP32-S2 microcontrollers.

LoRa is a proprietary protocol by Semtech, but people have been trying to reverse-engineer the LoRa PHY for years, and this culminated with a LoRa GNU Radio SDR implementation last year. But CNLohr found out you don’t even need a radio to send LoRa packets and you can instead use SPI or I2S interfaces from general-purpose microcontrollers to send packets that can be decoded by commercial off-the-shelf LoRa gateways and other chips.


The current implementation is designed for the  ITU Region 2 (aka The Americas) targeting the 902-928MHz frequency band, but the code could be changed for Region 1 (EU, Russia, Africa) to target 863-870MHz or Region 3 (Australia, China, India) to target 920-923MHz.

The implementation relies on harmonics and aliasing, meaning the primary frequency components emitted by your microcontroller are going to be in portions of the RF spectrum where RF transmissions are banned. So you should filter your output or perform tests in an area where you are unlikely to leak significant RF. CNLohr further notes that the overall EIRP output is generally under 300uW across the whole spectrum spread out over hundreds of emission frequencies, but there is virtually no way a device deliberately transmitting on these frequencies could ever pass FCC part 15 compliance, even with filtering.

LoLRa works with two major modes:

  1. Transmission using a tunable PLL, creating a square wave, then using a harmonic (the 13th harmonic in the case of the ESP32-S2), and finally transmitting the signal out a clock-out pin.
  2. Direct synthesis on a bitstream.  A  more versatile method that can work on a wider range of microcontrollers.

It’s an incredible feat, but note that it’s not something that can be commercially used because it would not pass FCC compliance, and only a few nanoWatts are used out of the few microWatts used for the transmission. The range is also shorter than with Semtech transceivers, but it was tested up to a 2.5 km range with an ESP32-S2  using a TTGO Lora32 board as the receiver.

You’ll find the source code and more details about the implementation on GitHub, and if you prefer visual explanations you can always watch the video below.

Thanks to Zoobab for the tip.

Share this:

Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress

ROCK Pi 4C Plus
Notify of
The comment form collects your name, email and content to allow us keep track of the comments placed on the website. Please read and accept our website Terms and Privacy Policy to post a comment.
itchy n scratchy
itchy n scratchy
14 days ago

A similar approach is being taken by pirip:

14 days ago

Oh, sorry, I would have sent the announcement to you if I had thought you would be interested! I’m one of the people mentioned at the end of the video.

Khadas VIM4 SBC