SX1278 RA-01, RA-02 LoRa library

  1. This code is deprecated. Use this: https://github.com/luk6xff/DevLibs/tree/master/LORA instead.

README.md

Committer:
igbt6
Date:
2019-11-16
Revision:
0:4e8ef5758455

File content as of revision 0:4e8ef5758455:

# SX1278 LORA module library


## Description 
The library was tested with [MBED](https://www.mbed.com) platform on RA-01 and RA-02 boards from AI-Thinker. It should work for all LORA SX127x chips from SEMTECH.

## Usage
Simple snippet how to quickly use the library for LORA communication on mbed platform:
* CLIENT
```cpp

#include "SX1278/platform/sx1278-mbed.h"

// PINOUT FOR MBED_NUCLEO_L053R8 BOARD
#define SX1278_MOSI  PB_15
#define SX1278_MISO  PB_14
#define SX1278_SCLK  PB_13
#define SX1278_NSS   PB_12
#define SX1278_RST   PB_1
#define SX1278_DIO0  PA_9
#define SX1278_DIO1  PA_8
#define SX1278_DIO2  PB_10
#define SX1278_DIO3  PB_4
#define SX1278_DIO4  PB_5
#define SX1278_DIO5  PB_3

// Defines
#define DEBUG_ON 1

// Radio LORA settings
#define RF_FREQUENCY                                RF_FREQUENCY_434_0
#define TX_OUTPUT_POWER                             14      // dBm
#define LORA_BANDWIDTH                              LORA_BANDWIDTH_125kHz
#define LORA_SPREADING_FACTOR                       LORA_SF8
#define LORA_CODINGRATE                             LORA_ERROR_CODING_RATE_4_5
#define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT                         5         // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON                  false
#define LORA_FHSS_ENABLED                           false  
#define LORA_NB_SYMB_HOP                            4     
#define LORA_IQ_INVERSION_ON                        false
#define LORA_CRC_ENABLED                            true
#define RX_TIMEOUT_VALUE                            8000      // in ms


// Radio events function pointer
static RadioEvents_t RadioEvents;

// Function to be executed on Radio Tx Done event
void OnTxDone(void);

// Function to be executed on Radio Rx Done event
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);

// Function executed on Radio Tx Timeout event
void OnTxTimeout(void);

// Function executed on Radio Rx Timeout event
void OnRxTimeout(void);

// Function executed on Radio Rx Error event
void OnRxError(void);

const char GatewayMsg[] = "Hello FROM LORA GATEWAY!";
const char ClientMsg[] = "Hello FROM LORA CLIENT!";

//-----------------------------------------------------------------------------

// Main
int main()
{
    // Radio initialization
    RadioEvents.TxDone = OnTxDone;
    RadioEvents.RxDone = OnRxDone;
    RadioEvents.TxTimeout = OnTxTimeout;
    RadioEvents.RxTimeout = OnRxTimeout;
    RadioEvents.RxError = OnRxError;
    SX1278MbedInit(&RadioEvents,SX1278_MOSI, SX1278_MISO, SX1278_SCLK, SX1278_NSS, SX1278_RST, \
                    SX1278_DIO0, SX1278_DIO1, SX1278_DIO2, SX1278_DIO3, NC, NC);
    SX1278SetChannel(RF_FREQUENCY);

    // Verify if SX1278 connected to the the board
    while(SX1278Read(REG_VERSION) == 0x00)
    {
        debug("Radio could not be detected!\n\r");
        wait(1);
    }

    SX1278SetMaxPayloadLength(MODEM_LORA, MAX_PAYLOAD_LENGTH);
    SX1278SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                        LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                        LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
                        LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
                        LORA_IQ_INVERSION_ON, 4000);
 
    SX1278SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                        LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
                        LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
                        LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
                        LORA_IQ_INVERSION_ON, true);

    while(true)
    {
        SX1278Send((uint8_t*)ClientMsg, sizeof(ClientMsg));
        SX1278SetRx(RX_TIMEOUT_VALUE);
        SX1278DelayMs(RX_TIMEOUT_VALUE);
        debug_if(DEBUG_ON, "> Data sent to the client\n\r");
    }
}

//-----------------------------------------------------------------------------
void OnTxDone(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnTxDone\n\r");
}

//-----------------------------------------------------------------------------
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> RssiValue: %d\n\r", rssi);
    debug_if(DEBUG_ON, "> SnrValue: %d\n\r", snr);
    debug_if(DEBUG_ON, "> PAYLOAD: %s\n\r", payload);
    debug_if(DEBUG_ON, "> OnRxDone\n\r");
}

//-----------------------------------------------------------------------------
void OnTxTimeout(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnTxTimeout\n\r");
}
 
//-----------------------------------------------------------------------------
void OnRxTimeout(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnRxTimeout\n\r");
}
 
//-----------------------------------------------------------------------------
void OnRxError(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnRxError\n\r");
}

//-----------------------------------------------------------------------------

```

* GATEWAY
```cpp

#include "SX1278/platform/sx1278-mbed.h"

// PINOUT FOR MBED_NUCLEO_L053R8 BOARD
#define SX1278_MOSI  PB_15
#define SX1278_MISO  PB_14
#define SX1278_SCLK  PB_13
#define SX1278_NSS   PB_12
#define SX1278_RST   PB_1
#define SX1278_DIO0  PA_9
#define SX1278_DIO1  PA_8
#define SX1278_DIO2  PB_10
#define SX1278_DIO3  PB_4
#define SX1278_DIO4  PB_5
#define SX1278_DIO5  PB_3

// Defines
#define DEBUG_ON 1

// Radio LORA settings
#define RF_FREQUENCY                                RF_FREQUENCY_434_0
#define TX_OUTPUT_POWER                             14      // dBm
#define LORA_BANDWIDTH                              LORA_BANDWIDTH_125kHz
#define LORA_SPREADING_FACTOR                       LORA_SF8
#define LORA_CODINGRATE                             LORA_ERROR_CODING_RATE_4_5
#define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT                         5         // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON                  false
#define LORA_FHSS_ENABLED                           false  
#define LORA_NB_SYMB_HOP                            4     
#define LORA_IQ_INVERSION_ON                        false
#define LORA_CRC_ENABLED                            true
#define RX_TIMEOUT_VALUE                            8000      // in ms


// Radio events function pointer
static RadioEvents_t RadioEvents;

// Function to be executed on Radio Tx Done event
void OnTxDone(void);

// Function to be executed on Radio Rx Done event
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);

// Function executed on Radio Tx Timeout event
void OnTxTimeout(void);

// Function executed on Radio Rx Timeout event
void OnRxTimeout(void);

// Function executed on Radio Rx Error event
void OnRxError(void);

const char GatewayMsg[] = "Hello FROM LORA GATEWAY!";
const char ClientMsg[] = "Hello FROM LORA CLIENT!";

//-----------------------------------------------------------------------------

// Main
int main()
{
    // Radio initialization
    RadioEvents.TxDone = OnTxDone;
    RadioEvents.RxDone = OnRxDone;
    RadioEvents.TxTimeout = OnTxTimeout;
    RadioEvents.RxTimeout = OnRxTimeout;
    RadioEvents.RxError = OnRxError;
    SX1278MbedInit(&RadioEvents,SX1278_MOSI, SX1278_MISO, SX1278_SCLK, SX1278_NSS, SX1278_RST, \
                    SX1278_DIO0, SX1278_DIO1, SX1278_DIO2, SX1278_DIO3, NC, NC);
    SX1278SetChannel(RF_FREQUENCY);

    // Verify if SX1278 connected to the the board
    while(SX1278Read(REG_VERSION) == 0x00)
    {
        debug("Radio could not be detected!\n\r");
        wait(1);
    }

    SX1278SetMaxPayloadLength(MODEM_LORA, MAX_PAYLOAD_LENGTH);
    SX1278SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                        LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                        LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
                        LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
                        LORA_IQ_INVERSION_ON, 4000);
 
    SX1278SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                        LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
                        LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
                        LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
                        LORA_IQ_INVERSION_ON, true);

    while(true)
    {
        SX1278SetRx(RX_TIMEOUT_VALUE);
    }
}

//-----------------------------------------------------------------------------
void OnTxDone(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnTxDone\n\r");
}

//-----------------------------------------------------------------------------
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
{
    SX1278Send((uint8_t*)GatewayMsg, sizeof(GatewayMsg));
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> RssiValue: %d\n\r", rssi);
    debug_if(DEBUG_ON, "> SnrValue: %d\n\r", snr);
    debug_if(DEBUG_ON, "> PAYLOAD: %s\n\r", payload);
    debug_if(DEBUG_ON, "> OnRxDone\n\r");
}

//-----------------------------------------------------------------------------
void OnTxTimeout(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnTxTimeout\n\r");
}
 
//-----------------------------------------------------------------------------
void OnRxTimeout(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnRxTimeout\n\r");
}
 
//-----------------------------------------------------------------------------
void OnRxError(void)
{
    SX1278SetSleep();
    debug_if(DEBUG_ON, "> OnRxError\n\r");
}
```


## Porting to other platform
If you want to port this library on other platform, the only thing you have to do is define HW/Platform dependent functions as it is done in `platform/sx1278-mbed.cpp` file.


## Author
* Lukasz Uszko aka `luk6xff` [luszko@op.pl]