Universal wireless communication library for embedded devices
Find a file
Paul Lietar ab41bcac00 [CC1101] Correctly wait for packet end on blocking receive.
When using a blocking receive, I was getting non-sensical packet length
and garbage data, whereas IRQ mode was working fine. This was happening
despite what looked like a workaround for this in the code which would
read the length twice.

I tracked it down to the receive function trying to read the data too
early, before the packet had even been received. The receive function
would wait for the GDO0 pin to become low, then assume the packet was
ready and read off the data.

However, the GD0 pin is set by the `startReceive` as inverted and,
according to the datasheet, in a mode which "asserts when sync word has
been received, and de-asserts at the end of the packet". In other words,
taking into account the inversion, GDO0 becomes low at the start of the
packet and high at the end of it.

Therefore the receive function would actually try to read the packet
data as soon as the packet had started, rather than wait until the end,
explaining the garbage data.

I suspect that with a slow MCU and a fast transmission rate, the
previous workaround of reading the length field twice may have delayed
the data read just enough to allow the packet to be fully received, but
this does not work in the general case.

This commit updates the logic by first waiting for a low signal,
followed by a high one. This is actually the exact same logic used in
the blocking transmit implementation, but inverted to account for the
INV flag set on GDO0. The commit also removes the past workaround, since
it should not be necessary anymore.
2024-01-13 17:18:23 +00:00
.github [CI] Fixed STM32WL not skipped properly 2023-11-18 16:36:46 +01:00
examples [LoRaWAN] Update examples 2024-01-13 00:15:52 +01:00
extras [MOD] Fixed missing cast (#776) 2023-06-26 19:41:12 +02:00
src [CC1101] Correctly wait for packet end on blocking receive. 2024-01-13 17:18:23 +00:00
.gitignore Update gitignore 2023-05-06 17:59:55 +01:00
.gitmodules Revert "Moved gitmodule file to tock example" 2023-08-31 16:33:06 +02:00
CMakeLists.txt Fix tabs 2023-12-30 23:03:16 +01:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2020-09-12 14:01:38 +02:00
CONTRIBUTING.md Update to 5.0.0 2021-11-14 11:43:43 +01:00
Doxyfile [STM32WLx] Only build on compatible STM32 boards 2023-01-10 18:09:55 +01:00
keywords.txt Merge pull request #918 from StevenCellist/master 2024-01-13 16:27:00 +01:00
library.json Bump version to 6.3.0 2023-11-29 17:31:00 +01:00
library.properties Bump version to 6.3.0 2023-11-29 17:31:00 +01:00
license.txt Rename LICENSE to license.txt 2018-04-18 20:35:49 +02:00
README.md [SX123x] Added support for SX1233 (#898) 2023-12-09 15:34:56 +01:00
SECURITY.md Create SECURITY.md 2020-09-12 14:03:31 +02:00
uncrustify.cfg Added uncrustify config file 2023-01-22 19:13:06 +01:00

RadioLib Build Status PlatformIO Registry

One radio library to rule them all!

Universal wireless communication library for embedded devices

See the Wiki and FAQ for further information. See the GitHub Pages for detailed and up-to-date API reference.

RadioLib allows its users to integrate all sorts of different wireless communication modules, protocols and even digital modes into a single consistent system. Want to add a Bluetooth interface to your LoRa network? Sure thing! Do you just want to go really old-school and play around with radio teletype, slow-scan TV, or even Hellschreiber using nothing but a cheap radio module? Why not!

RadioLib natively supports Arduino, but can run in non-Arduino environments as well! See this Wiki page and examples/NonArduino.

RadioLib was originally created as a driver for RadioShield, but it can be used to control as many different wireless modules as you like - or at least as many as your microcontroller can handle!

Supported modules:

  • CC1101 FSK radio module
  • LLCC68 LoRa module
  • nRF24L01 2.4 GHz module
  • RF69 FSK/OOK radio module
  • RFM2x series FSK modules (RFM22, RM23)
  • RFM9x series LoRa modules (RFM95, RM96, RFM97, RFM98)
  • Si443x series FSK modules (Si4430, Si4431, Si4432)
  • STM32WL integrated microcontroller/LoRa module
  • SX126x series LoRa modules (SX1261, SX1262, SX1268)
  • SX127x series LoRa modules (SX1272, SX1273, SX1276, SX1277, SX1278, SX1279)
  • SX128x series LoRa/GFSK/BLE/FLRC modules (SX1280, SX1281, SX1282)
  • SX123x FSK/OOK radio modules (SX1231, SX1233)

Supported protocols and digital modes:

  • AX.25 using 2-FSK or AFSK for modules:
    SX127x, RFM9x, SX126x, RF69, SX1231, CC1101, RFM2x and Si443x
  • RTTY using 2-FSK or AFSK for modules:
    SX127x, RFM9x, SX126x, RF69, SX1231, CC1101, nRF24L01, RFM2x, Si443x and SX128x
  • Morse Code using 2-FSK or AFSK for modules:
    SX127x, RFM9x, SX126x, RF69, SX1231, CC1101, nRF24L01, RFM2x, Si443x and SX128x
  • SSTV using 2-FSK or AFSK for modules:
    SX127x, RFM9x, SX126x, RF69, SX1231, CC1101, RFM2x and Si443x
  • Hellschreiber using 2-FSK or AFSK for modules:
    SX127x, RFM9x, SX126x, RF69, SX1231, CC1101, nRF24L01, RFM2x, Si443x and SX128x
  • APRS using AFSK for modules:
    SX127x, RFM9x, SX126x, RF69, SX1231, CC1101, nRF24L01, RFM2x, Si443x and SX128x
  • POCSAG using 2-FSK for modules:
    SX127x, RFM9x, RF69, SX1231, CC1101, nRF24L01, RFM2x and Si443x
  • LoRaWAN using LoRa for modules:
    SX127x, RFM9x, SX126x and SX128x
    • NOTE: LoRaWAN support is currently in beta, feedback via Issues and Discussions is appreciated!

Supported Arduino platforms:

  • Arduino

    • AVR - Arduino Uno, Mega, Leonardo, Pro Mini, Nano etc.
    • mbed - Arduino Nano 33 BLE and Arduino Portenta H7
    • megaAVR - Arduino Uno WiFi Rev.2 and Nano Every
    • SAM - Arduino Due
    • SAMD - Arduino Zero, MKR boards, M0 Pro etc.
    • Renesas - Arduino Uno R4
  • Adafruit

    • SAMD - Adafruit Feather M0 and M4 boards (Feather, Metro, Gemma, Trinket etc.)
    • nRF52 - Adafruit Feather nRF528x, Bluefruit and CLUE
  • Espressif

  • Intel

  • SparkFun

    • Apollo3 - Sparkfun Artemis Redboard
  • ST Microelectronics

  • MCUdude

    • MegaCoreX - megaAVR-0 series (ATmega4809, ATmega3209 etc.)
    • MegaCore - AVR (ATmega1281, ATmega640 etc.)
  • Raspberry Pi

  • Heltec

    • CubeCell - ASR650X series (CubeCell-Board, CubeCell-Capsule, CubeCell-Module etc.)
  • PJRC

    • Teensy - Teensy 2.x, 3.x and 4.x boards

The list above is by no means exhaustive - RadioLib code is independent of the used platform! Compilation of all examples is tested for all platforms officially supported prior to releasing new version. In addition, RadioLib includes an internal hardware abstraction layer, which allows it to be easily ported even to non-Arduino environments.