SX1278 RA-01, RA-02 LoRa library

  1. This code is deprecated. Use this: https://github.com/luk6xff/DevLibs/tree/master/LORA instead.
Committer:
igbt6
Date:
Sat Nov 16 16:34:57 2019 +0000
Revision:
0:4e8ef5758455
SX1278 - RA-01 Lora library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igbt6 0:4e8ef5758455 1 # SX1278 LORA module library
igbt6 0:4e8ef5758455 2
igbt6 0:4e8ef5758455 3
igbt6 0:4e8ef5758455 4 ## Description
igbt6 0:4e8ef5758455 5 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.
igbt6 0:4e8ef5758455 6
igbt6 0:4e8ef5758455 7 ## Usage
igbt6 0:4e8ef5758455 8 Simple snippet how to quickly use the library for LORA communication on mbed platform:
igbt6 0:4e8ef5758455 9 * CLIENT
igbt6 0:4e8ef5758455 10 ```cpp
igbt6 0:4e8ef5758455 11
igbt6 0:4e8ef5758455 12 #include "SX1278/platform/sx1278-mbed.h"
igbt6 0:4e8ef5758455 13
igbt6 0:4e8ef5758455 14 // PINOUT FOR MBED_NUCLEO_L053R8 BOARD
igbt6 0:4e8ef5758455 15 #define SX1278_MOSI PB_15
igbt6 0:4e8ef5758455 16 #define SX1278_MISO PB_14
igbt6 0:4e8ef5758455 17 #define SX1278_SCLK PB_13
igbt6 0:4e8ef5758455 18 #define SX1278_NSS PB_12
igbt6 0:4e8ef5758455 19 #define SX1278_RST PB_1
igbt6 0:4e8ef5758455 20 #define SX1278_DIO0 PA_9
igbt6 0:4e8ef5758455 21 #define SX1278_DIO1 PA_8
igbt6 0:4e8ef5758455 22 #define SX1278_DIO2 PB_10
igbt6 0:4e8ef5758455 23 #define SX1278_DIO3 PB_4
igbt6 0:4e8ef5758455 24 #define SX1278_DIO4 PB_5
igbt6 0:4e8ef5758455 25 #define SX1278_DIO5 PB_3
igbt6 0:4e8ef5758455 26
igbt6 0:4e8ef5758455 27 // Defines
igbt6 0:4e8ef5758455 28 #define DEBUG_ON 1
igbt6 0:4e8ef5758455 29
igbt6 0:4e8ef5758455 30 // Radio LORA settings
igbt6 0:4e8ef5758455 31 #define RF_FREQUENCY RF_FREQUENCY_434_0
igbt6 0:4e8ef5758455 32 #define TX_OUTPUT_POWER 14 // dBm
igbt6 0:4e8ef5758455 33 #define LORA_BANDWIDTH LORA_BANDWIDTH_125kHz
igbt6 0:4e8ef5758455 34 #define LORA_SPREADING_FACTOR LORA_SF8
igbt6 0:4e8ef5758455 35 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
igbt6 0:4e8ef5758455 36 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
igbt6 0:4e8ef5758455 37 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
igbt6 0:4e8ef5758455 38 #define LORA_FIX_LENGTH_PAYLOAD_ON false
igbt6 0:4e8ef5758455 39 #define LORA_FHSS_ENABLED false
igbt6 0:4e8ef5758455 40 #define LORA_NB_SYMB_HOP 4
igbt6 0:4e8ef5758455 41 #define LORA_IQ_INVERSION_ON false
igbt6 0:4e8ef5758455 42 #define LORA_CRC_ENABLED true
igbt6 0:4e8ef5758455 43 #define RX_TIMEOUT_VALUE 8000 // in ms
igbt6 0:4e8ef5758455 44
igbt6 0:4e8ef5758455 45
igbt6 0:4e8ef5758455 46 // Radio events function pointer
igbt6 0:4e8ef5758455 47 static RadioEvents_t RadioEvents;
igbt6 0:4e8ef5758455 48
igbt6 0:4e8ef5758455 49 // Function to be executed on Radio Tx Done event
igbt6 0:4e8ef5758455 50 void OnTxDone(void);
igbt6 0:4e8ef5758455 51
igbt6 0:4e8ef5758455 52 // Function to be executed on Radio Rx Done event
igbt6 0:4e8ef5758455 53 void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
igbt6 0:4e8ef5758455 54
igbt6 0:4e8ef5758455 55 // Function executed on Radio Tx Timeout event
igbt6 0:4e8ef5758455 56 void OnTxTimeout(void);
igbt6 0:4e8ef5758455 57
igbt6 0:4e8ef5758455 58 // Function executed on Radio Rx Timeout event
igbt6 0:4e8ef5758455 59 void OnRxTimeout(void);
igbt6 0:4e8ef5758455 60
igbt6 0:4e8ef5758455 61 // Function executed on Radio Rx Error event
igbt6 0:4e8ef5758455 62 void OnRxError(void);
igbt6 0:4e8ef5758455 63
igbt6 0:4e8ef5758455 64 const char GatewayMsg[] = "Hello FROM LORA GATEWAY!";
igbt6 0:4e8ef5758455 65 const char ClientMsg[] = "Hello FROM LORA CLIENT!";
igbt6 0:4e8ef5758455 66
igbt6 0:4e8ef5758455 67 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 68
igbt6 0:4e8ef5758455 69 // Main
igbt6 0:4e8ef5758455 70 int main()
igbt6 0:4e8ef5758455 71 {
igbt6 0:4e8ef5758455 72 // Radio initialization
igbt6 0:4e8ef5758455 73 RadioEvents.TxDone = OnTxDone;
igbt6 0:4e8ef5758455 74 RadioEvents.RxDone = OnRxDone;
igbt6 0:4e8ef5758455 75 RadioEvents.TxTimeout = OnTxTimeout;
igbt6 0:4e8ef5758455 76 RadioEvents.RxTimeout = OnRxTimeout;
igbt6 0:4e8ef5758455 77 RadioEvents.RxError = OnRxError;
igbt6 0:4e8ef5758455 78 SX1278MbedInit(&RadioEvents,SX1278_MOSI, SX1278_MISO, SX1278_SCLK, SX1278_NSS, SX1278_RST, \
igbt6 0:4e8ef5758455 79 SX1278_DIO0, SX1278_DIO1, SX1278_DIO2, SX1278_DIO3, NC, NC);
igbt6 0:4e8ef5758455 80 SX1278SetChannel(RF_FREQUENCY);
igbt6 0:4e8ef5758455 81
igbt6 0:4e8ef5758455 82 // Verify if SX1278 connected to the the board
igbt6 0:4e8ef5758455 83 while(SX1278Read(REG_VERSION) == 0x00)
igbt6 0:4e8ef5758455 84 {
igbt6 0:4e8ef5758455 85 debug("Radio could not be detected!\n\r");
igbt6 0:4e8ef5758455 86 wait(1);
igbt6 0:4e8ef5758455 87 }
igbt6 0:4e8ef5758455 88
igbt6 0:4e8ef5758455 89 SX1278SetMaxPayloadLength(MODEM_LORA, MAX_PAYLOAD_LENGTH);
igbt6 0:4e8ef5758455 90 SX1278SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
igbt6 0:4e8ef5758455 91 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
igbt6 0:4e8ef5758455 92 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
igbt6 0:4e8ef5758455 93 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
igbt6 0:4e8ef5758455 94 LORA_IQ_INVERSION_ON, 4000);
igbt6 0:4e8ef5758455 95
igbt6 0:4e8ef5758455 96 SX1278SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
igbt6 0:4e8ef5758455 97 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
igbt6 0:4e8ef5758455 98 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
igbt6 0:4e8ef5758455 99 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
igbt6 0:4e8ef5758455 100 LORA_IQ_INVERSION_ON, true);
igbt6 0:4e8ef5758455 101
igbt6 0:4e8ef5758455 102 while(true)
igbt6 0:4e8ef5758455 103 {
igbt6 0:4e8ef5758455 104 SX1278Send((uint8_t*)ClientMsg, sizeof(ClientMsg));
igbt6 0:4e8ef5758455 105 SX1278SetRx(RX_TIMEOUT_VALUE);
igbt6 0:4e8ef5758455 106 SX1278DelayMs(RX_TIMEOUT_VALUE);
igbt6 0:4e8ef5758455 107 debug_if(DEBUG_ON, "> Data sent to the client\n\r");
igbt6 0:4e8ef5758455 108 }
igbt6 0:4e8ef5758455 109 }
igbt6 0:4e8ef5758455 110
igbt6 0:4e8ef5758455 111 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 112 void OnTxDone(void)
igbt6 0:4e8ef5758455 113 {
igbt6 0:4e8ef5758455 114 SX1278SetSleep();
igbt6 0:4e8ef5758455 115 debug_if(DEBUG_ON, "> OnTxDone\n\r");
igbt6 0:4e8ef5758455 116 }
igbt6 0:4e8ef5758455 117
igbt6 0:4e8ef5758455 118 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 119 void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
igbt6 0:4e8ef5758455 120 {
igbt6 0:4e8ef5758455 121 SX1278SetSleep();
igbt6 0:4e8ef5758455 122 debug_if(DEBUG_ON, "> RssiValue: %d\n\r", rssi);
igbt6 0:4e8ef5758455 123 debug_if(DEBUG_ON, "> SnrValue: %d\n\r", snr);
igbt6 0:4e8ef5758455 124 debug_if(DEBUG_ON, "> PAYLOAD: %s\n\r", payload);
igbt6 0:4e8ef5758455 125 debug_if(DEBUG_ON, "> OnRxDone\n\r");
igbt6 0:4e8ef5758455 126 }
igbt6 0:4e8ef5758455 127
igbt6 0:4e8ef5758455 128 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 129 void OnTxTimeout(void)
igbt6 0:4e8ef5758455 130 {
igbt6 0:4e8ef5758455 131 SX1278SetSleep();
igbt6 0:4e8ef5758455 132 debug_if(DEBUG_ON, "> OnTxTimeout\n\r");
igbt6 0:4e8ef5758455 133 }
igbt6 0:4e8ef5758455 134
igbt6 0:4e8ef5758455 135 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 136 void OnRxTimeout(void)
igbt6 0:4e8ef5758455 137 {
igbt6 0:4e8ef5758455 138 SX1278SetSleep();
igbt6 0:4e8ef5758455 139 debug_if(DEBUG_ON, "> OnRxTimeout\n\r");
igbt6 0:4e8ef5758455 140 }
igbt6 0:4e8ef5758455 141
igbt6 0:4e8ef5758455 142 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 143 void OnRxError(void)
igbt6 0:4e8ef5758455 144 {
igbt6 0:4e8ef5758455 145 SX1278SetSleep();
igbt6 0:4e8ef5758455 146 debug_if(DEBUG_ON, "> OnRxError\n\r");
igbt6 0:4e8ef5758455 147 }
igbt6 0:4e8ef5758455 148
igbt6 0:4e8ef5758455 149 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 150
igbt6 0:4e8ef5758455 151 ```
igbt6 0:4e8ef5758455 152
igbt6 0:4e8ef5758455 153 * GATEWAY
igbt6 0:4e8ef5758455 154 ```cpp
igbt6 0:4e8ef5758455 155
igbt6 0:4e8ef5758455 156 #include "SX1278/platform/sx1278-mbed.h"
igbt6 0:4e8ef5758455 157
igbt6 0:4e8ef5758455 158 // PINOUT FOR MBED_NUCLEO_L053R8 BOARD
igbt6 0:4e8ef5758455 159 #define SX1278_MOSI PB_15
igbt6 0:4e8ef5758455 160 #define SX1278_MISO PB_14
igbt6 0:4e8ef5758455 161 #define SX1278_SCLK PB_13
igbt6 0:4e8ef5758455 162 #define SX1278_NSS PB_12
igbt6 0:4e8ef5758455 163 #define SX1278_RST PB_1
igbt6 0:4e8ef5758455 164 #define SX1278_DIO0 PA_9
igbt6 0:4e8ef5758455 165 #define SX1278_DIO1 PA_8
igbt6 0:4e8ef5758455 166 #define SX1278_DIO2 PB_10
igbt6 0:4e8ef5758455 167 #define SX1278_DIO3 PB_4
igbt6 0:4e8ef5758455 168 #define SX1278_DIO4 PB_5
igbt6 0:4e8ef5758455 169 #define SX1278_DIO5 PB_3
igbt6 0:4e8ef5758455 170
igbt6 0:4e8ef5758455 171 // Defines
igbt6 0:4e8ef5758455 172 #define DEBUG_ON 1
igbt6 0:4e8ef5758455 173
igbt6 0:4e8ef5758455 174 // Radio LORA settings
igbt6 0:4e8ef5758455 175 #define RF_FREQUENCY RF_FREQUENCY_434_0
igbt6 0:4e8ef5758455 176 #define TX_OUTPUT_POWER 14 // dBm
igbt6 0:4e8ef5758455 177 #define LORA_BANDWIDTH LORA_BANDWIDTH_125kHz
igbt6 0:4e8ef5758455 178 #define LORA_SPREADING_FACTOR LORA_SF8
igbt6 0:4e8ef5758455 179 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
igbt6 0:4e8ef5758455 180 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
igbt6 0:4e8ef5758455 181 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
igbt6 0:4e8ef5758455 182 #define LORA_FIX_LENGTH_PAYLOAD_ON false
igbt6 0:4e8ef5758455 183 #define LORA_FHSS_ENABLED false
igbt6 0:4e8ef5758455 184 #define LORA_NB_SYMB_HOP 4
igbt6 0:4e8ef5758455 185 #define LORA_IQ_INVERSION_ON false
igbt6 0:4e8ef5758455 186 #define LORA_CRC_ENABLED true
igbt6 0:4e8ef5758455 187 #define RX_TIMEOUT_VALUE 8000 // in ms
igbt6 0:4e8ef5758455 188
igbt6 0:4e8ef5758455 189
igbt6 0:4e8ef5758455 190 // Radio events function pointer
igbt6 0:4e8ef5758455 191 static RadioEvents_t RadioEvents;
igbt6 0:4e8ef5758455 192
igbt6 0:4e8ef5758455 193 // Function to be executed on Radio Tx Done event
igbt6 0:4e8ef5758455 194 void OnTxDone(void);
igbt6 0:4e8ef5758455 195
igbt6 0:4e8ef5758455 196 // Function to be executed on Radio Rx Done event
igbt6 0:4e8ef5758455 197 void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
igbt6 0:4e8ef5758455 198
igbt6 0:4e8ef5758455 199 // Function executed on Radio Tx Timeout event
igbt6 0:4e8ef5758455 200 void OnTxTimeout(void);
igbt6 0:4e8ef5758455 201
igbt6 0:4e8ef5758455 202 // Function executed on Radio Rx Timeout event
igbt6 0:4e8ef5758455 203 void OnRxTimeout(void);
igbt6 0:4e8ef5758455 204
igbt6 0:4e8ef5758455 205 // Function executed on Radio Rx Error event
igbt6 0:4e8ef5758455 206 void OnRxError(void);
igbt6 0:4e8ef5758455 207
igbt6 0:4e8ef5758455 208 const char GatewayMsg[] = "Hello FROM LORA GATEWAY!";
igbt6 0:4e8ef5758455 209 const char ClientMsg[] = "Hello FROM LORA CLIENT!";
igbt6 0:4e8ef5758455 210
igbt6 0:4e8ef5758455 211 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 212
igbt6 0:4e8ef5758455 213 // Main
igbt6 0:4e8ef5758455 214 int main()
igbt6 0:4e8ef5758455 215 {
igbt6 0:4e8ef5758455 216 // Radio initialization
igbt6 0:4e8ef5758455 217 RadioEvents.TxDone = OnTxDone;
igbt6 0:4e8ef5758455 218 RadioEvents.RxDone = OnRxDone;
igbt6 0:4e8ef5758455 219 RadioEvents.TxTimeout = OnTxTimeout;
igbt6 0:4e8ef5758455 220 RadioEvents.RxTimeout = OnRxTimeout;
igbt6 0:4e8ef5758455 221 RadioEvents.RxError = OnRxError;
igbt6 0:4e8ef5758455 222 SX1278MbedInit(&RadioEvents,SX1278_MOSI, SX1278_MISO, SX1278_SCLK, SX1278_NSS, SX1278_RST, \
igbt6 0:4e8ef5758455 223 SX1278_DIO0, SX1278_DIO1, SX1278_DIO2, SX1278_DIO3, NC, NC);
igbt6 0:4e8ef5758455 224 SX1278SetChannel(RF_FREQUENCY);
igbt6 0:4e8ef5758455 225
igbt6 0:4e8ef5758455 226 // Verify if SX1278 connected to the the board
igbt6 0:4e8ef5758455 227 while(SX1278Read(REG_VERSION) == 0x00)
igbt6 0:4e8ef5758455 228 {
igbt6 0:4e8ef5758455 229 debug("Radio could not be detected!\n\r");
igbt6 0:4e8ef5758455 230 wait(1);
igbt6 0:4e8ef5758455 231 }
igbt6 0:4e8ef5758455 232
igbt6 0:4e8ef5758455 233 SX1278SetMaxPayloadLength(MODEM_LORA, MAX_PAYLOAD_LENGTH);
igbt6 0:4e8ef5758455 234 SX1278SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
igbt6 0:4e8ef5758455 235 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
igbt6 0:4e8ef5758455 236 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
igbt6 0:4e8ef5758455 237 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
igbt6 0:4e8ef5758455 238 LORA_IQ_INVERSION_ON, 4000);
igbt6 0:4e8ef5758455 239
igbt6 0:4e8ef5758455 240 SX1278SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
igbt6 0:4e8ef5758455 241 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
igbt6 0:4e8ef5758455 242 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
igbt6 0:4e8ef5758455 243 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
igbt6 0:4e8ef5758455 244 LORA_IQ_INVERSION_ON, true);
igbt6 0:4e8ef5758455 245
igbt6 0:4e8ef5758455 246 while(true)
igbt6 0:4e8ef5758455 247 {
igbt6 0:4e8ef5758455 248 SX1278SetRx(RX_TIMEOUT_VALUE);
igbt6 0:4e8ef5758455 249 }
igbt6 0:4e8ef5758455 250 }
igbt6 0:4e8ef5758455 251
igbt6 0:4e8ef5758455 252 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 253 void OnTxDone(void)
igbt6 0:4e8ef5758455 254 {
igbt6 0:4e8ef5758455 255 SX1278SetSleep();
igbt6 0:4e8ef5758455 256 debug_if(DEBUG_ON, "> OnTxDone\n\r");
igbt6 0:4e8ef5758455 257 }
igbt6 0:4e8ef5758455 258
igbt6 0:4e8ef5758455 259 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 260 void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
igbt6 0:4e8ef5758455 261 {
igbt6 0:4e8ef5758455 262 SX1278Send((uint8_t*)GatewayMsg, sizeof(GatewayMsg));
igbt6 0:4e8ef5758455 263 SX1278SetSleep();
igbt6 0:4e8ef5758455 264 debug_if(DEBUG_ON, "> RssiValue: %d\n\r", rssi);
igbt6 0:4e8ef5758455 265 debug_if(DEBUG_ON, "> SnrValue: %d\n\r", snr);
igbt6 0:4e8ef5758455 266 debug_if(DEBUG_ON, "> PAYLOAD: %s\n\r", payload);
igbt6 0:4e8ef5758455 267 debug_if(DEBUG_ON, "> OnRxDone\n\r");
igbt6 0:4e8ef5758455 268 }
igbt6 0:4e8ef5758455 269
igbt6 0:4e8ef5758455 270 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 271 void OnTxTimeout(void)
igbt6 0:4e8ef5758455 272 {
igbt6 0:4e8ef5758455 273 SX1278SetSleep();
igbt6 0:4e8ef5758455 274 debug_if(DEBUG_ON, "> OnTxTimeout\n\r");
igbt6 0:4e8ef5758455 275 }
igbt6 0:4e8ef5758455 276
igbt6 0:4e8ef5758455 277 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 278 void OnRxTimeout(void)
igbt6 0:4e8ef5758455 279 {
igbt6 0:4e8ef5758455 280 SX1278SetSleep();
igbt6 0:4e8ef5758455 281 debug_if(DEBUG_ON, "> OnRxTimeout\n\r");
igbt6 0:4e8ef5758455 282 }
igbt6 0:4e8ef5758455 283
igbt6 0:4e8ef5758455 284 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 285 void OnRxError(void)
igbt6 0:4e8ef5758455 286 {
igbt6 0:4e8ef5758455 287 SX1278SetSleep();
igbt6 0:4e8ef5758455 288 debug_if(DEBUG_ON, "> OnRxError\n\r");
igbt6 0:4e8ef5758455 289 }
igbt6 0:4e8ef5758455 290 ```
igbt6 0:4e8ef5758455 291
igbt6 0:4e8ef5758455 292
igbt6 0:4e8ef5758455 293 ## Porting to other platform
igbt6 0:4e8ef5758455 294 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.
igbt6 0:4e8ef5758455 295
igbt6 0:4e8ef5758455 296
igbt6 0:4e8ef5758455 297 ## Author
igbt6 0:4e8ef5758455 298 * Lukasz Uszko aka `luk6xff` [luszko@op.pl]