sx127x.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016 Unwired Devices <info@unwds.com>
3  * 2017 Inria
4  *
5  * This file is subject to the terms and conditions of the GNU Lesser
6  * General Public License v2.1. See the file LICENSE in the top level
7  * directory for more details.
8  */
9 
60 #ifndef SX127X_H
61 #define SX127X_H
62 
63 #include "xtimer.h"
64 #include "net/netdev.h"
65 #include "periph/gpio.h"
66 #include "periph/spi.h"
67 
68 #ifdef __cplusplus
69 extern "C" {
70 #endif
71 
76 #define SX127X_MODEM_DEFAULT (SX127X_MODEM_LORA)
77 #define SX127X_CHANNEL_DEFAULT (868300000UL)
78 #define SX127X_HF_CHANNEL_DEFAULT (868000000UL)
79 #define SX127X_RF_MID_BAND_THRESH (525000000UL)
80 #define SX127X_XTAL_FREQ (32000000UL)
81 #define SX127X_RADIO_WAKEUP_TIME (1000U)
83 #define SX127X_TX_TIMEOUT_DEFAULT (1000U * 1000U * 30UL)
84 #define SX127X_RX_SINGLE (false)
85 #define SX127X_RX_BUFFER_SIZE (256)
87 #define SX127X_RADIO_TX_POWER (14U)
89 #ifndef SX1272_DEFAULT_PASELECT
90 
94 #define SX1272_DEFAULT_PASELECT (1U)
95 #endif
96 
97 #define SX127X_EVENT_HANDLER_STACK_SIZE (2048U)
98 #define SX127X_IRQ_DIO0 (1<<0)
99 #define SX127X_IRQ_DIO1 (1<<1)
100 #define SX127X_IRQ_DIO2 (1<<2)
101 #define SX127X_IRQ_DIO3 (1<<3)
102 #define SX127X_IRQ_DIO4 (1<<4)
103 #define SX127X_IRQ_DIO5 (1<<5)
109 enum {
114 };
115 
119 enum {
122 };
123 
127 enum {
132 };
133 
137 enum {
145 };
146 
151 #define SX127X_LOW_DATARATE_OPTIMIZE_FLAG (1 << 0)
152 #define SX127X_ENABLE_FIXED_HEADER_LENGTH_FLAG (1 << 1)
153 #define SX127X_ENABLE_CRC_FLAG (1 << 2)
154 #define SX127X_CHANNEL_HOPPING_FLAG (1 << 3)
155 #define SX127X_IQ_INVERTED_FLAG (1 << 4)
156 #define SX127X_RX_CONTINUOUS_FLAG (1 << 5)
157 
162 typedef struct {
163  uint16_t preamble_len;
164  int8_t power;
165  uint8_t bandwidth;
166  uint8_t datarate;
167  uint8_t coderate;
168  uint8_t freq_hop_period;
169  uint8_t flags;
170  uint32_t rx_timeout;
171  uint32_t tx_timeout;
173 
177 typedef struct {
178  uint32_t channel;
179  uint8_t state;
180  uint8_t modem;
183 
187 typedef struct {
188  /* Data that will be passed to events handler in application */
191  uint32_t last_channel;
194 
198 typedef struct {
200  gpio_t nss_pin;
201  gpio_t reset_pin;
202  gpio_t dio0_pin;
203  gpio_t dio1_pin;
204  gpio_t dio2_pin;
205  gpio_t dio3_pin;
206  gpio_t dio4_pin;
207  gpio_t dio5_pin;
209 
213 typedef uint8_t sx127x_flags_t;
214 
219 typedef struct {
225 } sx127x_t;
226 
230 typedef void (sx127x_dio_irq_handler_t)(sx127x_t *dev);
231 
238 void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params);
239 
245 void sx127x_reset(const sx127x_t *dev);
246 
254 int sx127x_init(sx127x_t *dev);
255 
262 
275 uint32_t sx127x_random(sx127x_t *dev);
276 
282 void sx127x_start_cad(sx127x_t *dev);
283 
291 uint8_t sx127x_get_state(const sx127x_t *dev);
292 
301 void sx127x_set_state(sx127x_t *dev, uint8_t state);
302 
309 void sx127x_set_modem(sx127x_t *dev, uint8_t modem);
310 
318 uint8_t sx127x_get_syncword(const sx127x_t *dev);
319 
326 void sx127x_set_syncword(sx127x_t *dev, uint8_t syncword);
327 
335 uint32_t sx127x_get_channel(const sx127x_t *dev);
336 
343 void sx127x_set_channel(sx127x_t *dev, uint32_t freq);
344 
356 uint32_t sx127x_get_time_on_air(const sx127x_t *dev, uint8_t pkt_len);
357 
363 void sx127x_set_sleep(sx127x_t *dev);
364 
370 void sx127x_set_standby(sx127x_t *dev);
371 
377 void sx127x_set_rx(sx127x_t *dev);
378 
384 void sx127x_set_tx(sx127x_t *dev);
385 
393 uint8_t sx127x_get_max_payload_len(const sx127x_t *dev);
394 
401 void sx127x_set_max_payload_len(const sx127x_t *dev, uint8_t maxlen);
402 
410 uint8_t sx127x_get_op_mode(const sx127x_t *dev);
411 
418 void sx127x_set_op_mode(const sx127x_t *dev, uint8_t op_mode);
419 
427 uint8_t sx127x_get_bandwidth(const sx127x_t *dev);
428 
435 void sx127x_set_bandwidth(sx127x_t *dev, uint8_t bandwidth);
436 
444 uint8_t sx127x_get_spreading_factor(const sx127x_t *dev);
445 
452 void sx127x_set_spreading_factor(sx127x_t *dev, uint8_t sf);
453 
461 uint8_t sx127x_get_coding_rate(const sx127x_t *dev);
462 
469 void sx127x_set_coding_rate(sx127x_t *dev, uint8_t coderate);
470 
478 bool sx127x_get_rx_single(const sx127x_t *dev);
479 
486 void sx127x_set_rx_single(sx127x_t *dev, bool single);
487 
495 bool sx127x_get_crc(const sx127x_t *dev);
496 
503 void sx127x_set_crc(sx127x_t *dev, bool crc);
504 
512 uint8_t sx127x_get_hop_period(const sx127x_t *dev);
513 
520 void sx127x_set_hop_period(sx127x_t *dev, uint8_t hop_period);
521 
530 
537 void sx127x_set_fixed_header_len_mode(sx127x_t *dev, bool mode);
538 
546 uint8_t sx127x_get_payload_length(const sx127x_t *dev);
547 
554 void sx127x_set_payload_length(sx127x_t *dev, uint8_t len);
555 
563 uint8_t sx127x_get_tx_power(const sx127x_t *dev);
564 
571 void sx127x_set_tx_power(sx127x_t *dev, int8_t power);
572 
580 uint16_t sx127x_get_preamble_length(const sx127x_t *dev);
581 
588 void sx127x_set_preamble_length(sx127x_t *dev, uint16_t preamble);
589 
596 void sx127x_set_symbol_timeout(sx127x_t *dev, uint16_t timeout);
597 
604 void sx127x_set_rx_timeout(sx127x_t *dev, uint32_t timeout);
605 
612 void sx127x_set_tx_timeout(sx127x_t *dev, uint32_t timeout);
613 
621 bool sx127x_get_iq_invert(const sx127x_t *dev);
622 
629 void sx127x_set_iq_invert(sx127x_t *dev, bool iq_invert);
630 
637 void sx127x_set_freq_hop(sx127x_t *dev, bool freq_hop_on);
638 
639 #ifdef __cplusplus
640 }
641 #endif
642 
643 #endif /* SX127X_H */
644 
uint8_t freq_hop_period
Frequency hop period.
Definition: sx127x.h:168
void sx127x_set_state(sx127x_t *dev, uint8_t state)
Sets current state of transceiver.
SX127X internal data.
Definition: sx127x.h:187
uint8_t sx127x_get_tx_power(const sx127x_t *dev)
Gets the SX127X TX radio power.
gpio_t dio1_pin
Interrupt line DIO1 (Rx timeout)
Definition: sx127x.h:203
void sx127x_set_rx_timeout(sx127x_t *dev, uint32_t timeout)
Sets the SX127X RX timeout.
Definitions low-level network driver interface.
Receiving complete.
Definition: sx127x.h:138
uint8_t sx127x_get_spreading_factor(const sx127x_t *dev)
Gets the SX127X LoRa spreading factor.
uint8_t sx127x_get_bandwidth(const sx127x_t *dev)
Gets the SX127X bandwidth.
void sx127x_init_radio_settings(sx127x_t *dev)
Initialize radio settings with default values.
sx127x_internal_t _internal
Internal sx127x data used within the driver.
Definition: sx127x.h:223
uint8_t sx127x_flags_t
SX127X IRQ flags.
Definition: sx127x.h:213
void sx127x_start_cad(sx127x_t *dev)
Start a channel activity detection.
Radio settings.
Definition: sx127x.h:177
Unable to create DIO handling thread (check amount of free memory)
Definition: sx127x.h:113
Failed to initialize SPI bus or CS line.
Definition: sx127x.h:111
Low-level GPIO peripheral driver interface definitions.
void sx127x_set_crc(sx127x_t *dev, bool crc)
Enable/Disable the SX127X CRC verification mode.
void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params)
Setup the SX127X.
uint8_t modem
Driver model (FSK or LoRa)
Definition: sx127x.h:180
sx127x_params_t params
Device driver parameters.
Definition: sx127x.h:222
xtimer_t rx_timeout_timer
RX operation timeout timer.
Definition: sx127x.h:190
uint8_t sx127x_get_max_payload_len(const sx127x_t *dev)
Gets the maximum payload length.
uint32_t sx127x_get_time_on_air(const sx127x_t *dev, uint8_t pkt_len)
Computes the packet time on air in milliseconds.
spi_t spi
SPI device.
Definition: sx127x.h:199
Channel activity detection complete.
Definition: sx127x.h:144
void sx127x_set_rx_single(sx127x_t *dev, bool single)
Enable/disable the SX127X LoRa RX single mode.
gpio_t nss_pin
SPI NSS pin.
Definition: sx127x.h:200
uint8_t state
Radio state.
Definition: sx127x.h:179
uint8_t sx127x_get_state(const sx127x_t *dev)
Gets current state of transceiver.
uint32_t sx127x_random(sx127x_t *dev)
Generates 32 bits random value based on the RSSI readings.
bool is_last_cad_success
Sign of success of last CAD operation (activity detected)
Definition: sx127x.h:192
gpio_t dio2_pin
Interrupt line DIO2 (FHSS channel change)
Definition: sx127x.h:204
uint32_t channel
Radio channel.
Definition: sx127x.h:178
Receiving CRC error.
Definition: sx127x.h:142
Receiving state.
Definition: sx127x.h:130
void sx127x_set_iq_invert(sx127x_t *dev, bool iq_invert)
Enable/disable the SX127X LoRa IQ inverted mode.
SX127X testing failed during initialization (check chip)
Definition: sx127x.h:112
netdev_t netdev
Netdev parent struct.
Definition: sx127x.h:220
uint8_t datarate
Spreading factor rate, e.g datarate.
Definition: sx127x.h:166
void sx127x_set_channel(sx127x_t *dev, uint32_t freq)
Sets the channel RF frequency.
Low-level SPI peripheral driver interface definition.
uint32_t rx_timeout
RX timeout in symbols.
Definition: sx127x.h:170
gpio_t dio5_pin
Interrupt line DIO5 (not used)
Definition: sx127x.h:207
sx127x_flags_t irq
Device IRQ flags.
Definition: sx127x.h:224
uint8_t coderate
Error coding rate.
Definition: sx127x.h:167
int sx127x_init(sx127x_t *dev)
Initializes the transceiver.
void sx127x_set_modem(sx127x_t *dev, uint8_t modem)
Configures the radio with the given modem.
void sx127x_set_syncword(sx127x_t *dev, uint8_t syncword)
Sets the synchronization word.
gpio_t dio4_pin
Interrupt line DIO4 (not used)
Definition: sx127x.h:206
uint8_t sx127x_get_op_mode(const sx127x_t *dev)
Gets the SX127X operating mode.
void sx127x_set_op_mode(const sx127x_t *dev, uint8_t op_mode)
Sets the SX127X operating mode.
void sx127x_set_sleep(sx127x_t *dev)
Sets the radio in sleep mode.
sx127x_radio_settings_t settings
Radio settings.
Definition: sx127x.h:221
uint16_t sx127x_get_preamble_length(const sx127x_t *dev)
Gets the SX127X preamble length.
void sx127x_set_freq_hop(sx127x_t *dev, bool freq_hop_on)
Sets the SX127X LoRa frequency hopping mode.
void sx127x_set_coding_rate(sx127x_t *dev, uint8_t coderate)
Sets the SX127X LoRa coding rate.
void sx127x_set_standby(sx127x_t *dev)
Sets the radio in stand-by mode.
void sx127x_set_fixed_header_len_mode(sx127x_t *dev, bool mode)
Sets the SX127X to fixed header length mode (explicit mode)
uint32_t tx_timeout
TX timeout in symbols.
Definition: sx127x.h:171
uint32_t last_channel
Last channel in frequency hopping sequence.
Definition: sx127x.h:191
Structure to hold driver state.
Definition: netdev.h:274
Sending state.
Definition: sx127x.h:129
xtimer interface definitions
void sx127x_set_preamble_length(sx127x_t *dev, uint16_t preamble)
Sets the SX127X LoRa preamble length.
xtimer_t tx_timeout_timer
TX operation timeout timer.
Definition: sx127x.h:189
void sx127x_set_rx(sx127x_t *dev)
Sets the radio in reception mode.
void sx127x_set_tx(sx127x_t *dev)
Sets the radio in transmission mode.
void sx127x_set_max_payload_len(const sx127x_t *dev, uint8_t maxlen)
Sets the maximum payload length.
bool sx127x_get_crc(const sx127x_t *dev)
Checks if the SX127X CRC verification mode is enabled.
Sending complete.
Definition: sx127x.h:139
Sending timeout.
Definition: sx127x.h:141
Channel change.
Definition: sx127x.h:143
void() sx127x_dio_irq_handler_t(sx127x_t *dev)
Hardware IO IRQ callback function definition.
Definition: sx127x.h:230
LoRa configuration structure.
Definition: sx127x.h:162
uint8_t sx127x_get_coding_rate(const sx127x_t *dev)
Gets the SX127X LoRa coding rate.
int8_t power
Signal power.
Definition: sx127x.h:164
bool sx127x_get_iq_invert(const sx127x_t *dev)
Checks if the SX127X LoRa inverted IQ mode is enabled/disabled.
void sx127x_reset(const sx127x_t *dev)
Resets the SX127X.
FSK modem driver.
Definition: sx127x.h:120
Idle state.
Definition: sx127x.h:128
uint8_t sx127x_get_syncword(const sx127x_t *dev)
Gets the synchronization word.
gpio_t dio3_pin
Interrupt line DIO3 (CAD done)
Definition: sx127x.h:205
uint8_t sx127x_get_hop_period(const sx127x_t *dev)
Gets the SX127X frequency hopping period.
uint8_t bandwidth
Signal bandwidth.
Definition: sx127x.h:165
Channel activity detection state.
Definition: sx127x.h:131
Initialization was successful.
Definition: sx127x.h:110
void sx127x_set_tx_timeout(sx127x_t *dev, uint32_t timeout)
Sets the SX127X TX timeout.
uint32_t sx127x_get_channel(const sx127x_t *dev)
Gets the channel RF frequency.
xtimer timer structure
Definition: xtimer.h:70
uint16_t preamble_len
Length of preamble header.
Definition: sx127x.h:163
bool sx127x_get_rx_single(const sx127x_t *dev)
Checks if the SX127X LoRa RX single mode is enabled/disabled.
sx127x_lora_settings_t lora
LoRa settings.
Definition: sx127x.h:181
gpio_t dio0_pin
Interrupt line DIO0 (Tx done)
Definition: sx127x.h:202
uint8_t flags
Boolean flags.
Definition: sx127x.h:169
void sx127x_set_hop_period(sx127x_t *dev, uint8_t hop_period)
Sets the SX127X frequency hopping period.
void sx127x_set_spreading_factor(sx127x_t *dev, uint8_t sf)
Sets the SX127X LoRa spreading factor.
void sx127x_set_tx_power(sx127x_t *dev, int8_t power)
Sets the SX127X transmission power.
void sx127x_set_bandwidth(sx127x_t *dev, uint8_t bandwidth)
Sets the SX127X bandwidth.
void sx127x_set_payload_length(sx127x_t *dev, uint8_t len)
Sets the SX127X payload length.
LoRa modem driver.
Definition: sx127x.h:121
bool sx127x_get_fixed_header_len_mode(const sx127x_t *dev)
Gets the SX127X LoRa fixed header length mode.
Receiving timeout.
Definition: sx127x.h:140
SX127X hardware and global parameters.
Definition: sx127x.h:198
void sx127x_set_symbol_timeout(sx127x_t *dev, uint16_t timeout)
Sets the SX127X LoRa symbol timeout.
gpio_t reset_pin
Reset pin.
Definition: sx127x.h:201
unsigned int spi_t
Default type for SPI devices.
Definition: spi.h:105
SX127X device descriptor.
Definition: sx127x.h:219
uint8_t sx127x_get_payload_length(const sx127x_t *dev)
Gets the SX127X payload length.