esp-idf driver for SX1276
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Morgan 'ARR\!' Allen e8b52e7c78 (hopefully) basic sensible default radio settings 12 months ago
include (hopefully) basic sensible default radio settings 12 months ago
main consistently name _spreadfactor and update config object call _set call 1 year ago
.gitlab-ci.yml no tests at the moment 3 years ago
CMakeLists.txt oh yeah, make idf compat 3 years ago
Makefile initial commit.... after 6 months 5 years ago add datarate calculation, could probably be useful. right? 3 years ago initial commit.... after 6 months 5 years ago

ESP32 LoRa (SX127*)

Provides SPI driver for SX1276/SX1278 LoRa radio


Designed to be used as an esp-idf component. Suggested usage is with git submodule

git submodule add components/esp32-lora/
git submodule init
git submodule update


Uses built in KConfig for configuration. Run make menuconfig and find config under Component config -> LORA32. Defaults targeted to TTGO LoRa OLED boards.


This is the most basic usage. Setting up the LoRa instance, setting it's receive handler, running init then sending a message.

  #include <stdio.h>
  #include <string.h>

  #include "esp32-lora.h";

  lora32_cfg_t lora;

  static void handle_lora_receive(uint8_t size) {
    char *message = malloc(size+1);

    lora32_read_data(&lora, message);

    // ensure null termination
    message[size] = '\0';
    printf("msg: %s\n", message);

  void app_main() {
    lora = lora32_create();
    lora.receive = &handle_lora_receive;


    lora32_send(&lora, "Hello, LoRa", 11);


static lora32_cfg_t lora32_create()

Creates a new LoRa instance.

uint8_t lora32_init(lora32_cfg_t *config)

Initialized LoRa instance. This configures GPIOs, SPI, LoRa radio and receive handlers.

Returns 1 on success.

void lora32_set_bandwidth(lora32_cfg_t *lora, enum bandwidth bw)

Set operating bandwidth. Accepts enum bandwidth B78, B104, B156, B208, B3125, B417, B625, B125, B250, B500 or 0-9

void lora32_set_coding_rate(lora32_cfg_t *lora, uint8_t d)

Set Coding Rate.

Accepts 5-8.

uint8_t lora32_data_available(lora32_cfg_t *lora)

Returns number of bytes available in FIFO buffer.

void lora32_send(lora32_cfg_t *config, uint8_t *data, uint8_t len)

Transmits data over the LoRa radio. Puts DIO0 into TXDONE mode.

void lora32_set_spreadfactor(lora32_cfg_t *lora, uint8_t factor)

Sets LoRa Spread Factor.

Accepts 6-12.

double lora32_calc_datarate(lora32_cfg_t *lora);

Returns data rate in Bits Per Second (bps) for given lora32_cfg_t configuration.

void lora32_dump_regs(lora32_cfg_t *lora)

Dumps all registers from SX1276.

void lora32_read_data(lora32_cfg_t *lora, uint8_t *data)

Reads data out of FIFO buffer. This would typically be called after the callback received is triggered.

void lora32_enable_continuous_rx(lora32_cfg_t *lora)

Enables continuous receive mode. If a receive callback has been setup, it will be trigger on any incoming data until either an OP_MODE or DIO0 mode are change.

void lora32_enable_single_rx(lora32_cfg_t *lora)

  • NOTE This requires DIO1 for complete functionality.
  • NOTE Implenentation incomplete.

Enables single receive mode. Will either trigger RXDONE on DIO0 or RXTIMEOUT on DIO1

void lora32_enable_cad(lora32_cfg_t *lora)

Enables Channel Activity Detection. Will trigger callback cad_done with bool detected on completion. If activity was detected, it will also trigger cad_detected


lora32_cfg_t provides several callbacks based on DIO0 interrupts. Most functionality is provided through these, favoring async operations over syncronous polling.

lora32_cfg_t->receive(uint8_t size)

Triggered from RXCONTINUOUS and RXSINGLE modes. Provides the number of bytes available. Should be followed up with a call to lora32_read_data to retrieve data from FIFO buffer.


Triggers after call to lora32_send completes, as long as DIO0 mode has not been changed.

lora32_cfg_t->cad_done(bool detected)

Triggers after call to lora32_enable_cad completes (ie times out) or channel activity is detected. bool detected will reflect these two states.


Triggers after call to lora32_enable_cad successfully detects channel activity.