Loading...
Searching...
No Matches
sx127x.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Unwired Devices <info@unwds.com>
3 * SPDX-FileCopyrightText: 2017 Inria
4 * SPDX-License-Identifier: LGPL-2.1-only
5 */
6
7#pragma once
8
57
58#include "timex.h"
59#include "ztimer.h"
60#include "net/netdev.h"
61#include "periph/gpio.h"
62#include "periph/spi.h"
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
72#define SX127X_MODEM_DEFAULT (SX127X_MODEM_LORA)
73#define SX127X_CHANNEL_DEFAULT (868300000UL)
74#define SX127X_HF_CHANNEL_DEFAULT (868000000UL)
75#define SX127X_RF_MID_BAND_THRESH (525000000UL)
76#define SX127X_XTAL_FREQ (32000000UL)
77#define SX127X_RADIO_WAKEUP_TIME (1U)
78
79#define SX127X_TX_TIMEOUT_DEFAULT (30 * MS_PER_SEC)
80#define SX127X_RX_SINGLE (false)
81#define SX127X_RX_BUFFER_SIZE (256)
82#define SX127X_RADIO_TX_POWER (14U)
83
84#define SX127X_EVENT_HANDLER_STACK_SIZE (2048U)
85#define SX127X_IRQ_DIO0 (1 << 0)
86#define SX127X_IRQ_DIO1 (1 << 1)
87#define SX127X_IRQ_DIO2 (1 << 2)
88#define SX127X_IRQ_DIO3 (1 << 3)
89#define SX127X_IRQ_DIO4 (1 << 4)
90#define SX127X_IRQ_DIO5 (1 << 5)
92
101#ifndef SX127X_DIO_PULL_MODE
102#define SX127X_DIO_PULL_MODE (GPIO_IN_PD)
103#endif
105
109enum {
114};
115
119enum {
122};
123
127enum {
132};
133
137enum {
145};
146
154enum {
157};
158
163#define SX127X_LOW_DATARATE_OPTIMIZE_FLAG (1 << 0)
164#define SX127X_ENABLE_FIXED_HEADER_LENGTH_FLAG (1 << 1)
165#define SX127X_ENABLE_CRC_FLAG (1 << 2)
166#define SX127X_CHANNEL_HOPPING_FLAG (1 << 3)
167#define SX127X_IQ_INVERTED_FLAG (1 << 4)
168#define SX127X_RX_CONTINUOUS_FLAG (1 << 5)
170
174typedef struct {
175 uint16_t preamble_len;
176 int8_t power;
177 uint8_t bandwidth;
178 uint8_t datarate;
179 uint8_t coderate;
181 uint8_t flags;
182 uint32_t rx_timeout;
183 uint32_t tx_timeout;
185
189typedef struct {
190 uint32_t channel;
191 uint8_t state;
192 uint8_t modem;
195
199typedef struct {
200 /* Data that will be passed to events handler in application */
203 uint32_t last_channel;
206
210typedef struct {
211 spi_t spi;
212 gpio_t nss_pin;
213 gpio_t reset_pin;
214 gpio_t dio0_pin;
215 gpio_t dio1_pin;
216 gpio_t dio2_pin;
217 gpio_t dio3_pin;
218 gpio_t dio4_pin;
219 gpio_t dio5_pin;
220#if defined(SX127X_USE_TX_SWITCH) || defined(SX127X_USE_RX_SWITCH)
221 gpio_t rx_switch_pin;
222 gpio_t tx_switch_pin;
223#endif
224 uint8_t paselect;
226
230typedef uint8_t sx127x_flags_t;
231
243
248
257void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params, uint8_t index);
258
264int sx127x_reset(const sx127x_t *dev);
265
274
281
294uint32_t sx127x_random(sx127x_t *dev);
295
302
312bool sx127x_is_channel_free(sx127x_t *dev, uint32_t freq, int16_t rssi_threshold);
313
321int16_t sx127x_read_rssi(const sx127x_t *dev);
322
330uint8_t sx127x_get_state(const sx127x_t *dev);
331
338void sx127x_set_state(sx127x_t *dev, uint8_t state);
339
346void sx127x_set_modem(sx127x_t *dev, uint8_t modem);
347
355uint8_t sx127x_get_syncword(const sx127x_t *dev);
356
363void sx127x_set_syncword(sx127x_t *dev, uint8_t syncword);
364
372uint32_t sx127x_get_channel(const sx127x_t *dev);
373
380void sx127x_set_channel(sx127x_t *dev, uint32_t freq);
381
393uint32_t sx127x_get_time_on_air(const sx127x_t *dev, uint8_t pkt_len);
394
401
408
415
422
431
438void sx127x_set_max_payload_len(const sx127x_t *dev, uint8_t maxlen);
439
447uint8_t sx127x_get_op_mode(const sx127x_t *dev);
448
455void sx127x_set_op_mode(const sx127x_t *dev, uint8_t op_mode);
456
464uint8_t sx127x_get_bandwidth(const sx127x_t *dev);
465
472void sx127x_set_bandwidth(sx127x_t *dev, uint8_t bandwidth);
473
482
490
499
506void sx127x_set_coding_rate(sx127x_t *dev, uint8_t coderate);
507
516
523void sx127x_set_rx_single(sx127x_t *dev, bool single);
524
532bool sx127x_get_crc(const sx127x_t *dev);
533
540void sx127x_set_crc(sx127x_t *dev, bool crc);
541
549uint8_t sx127x_get_hop_period(const sx127x_t *dev);
550
557void sx127x_set_hop_period(sx127x_t *dev, uint8_t hop_period);
558
567
575
584
591void sx127x_set_payload_length(sx127x_t *dev, uint8_t len);
592
600uint8_t sx127x_get_tx_power(const sx127x_t *dev);
601
608void sx127x_set_tx_power(sx127x_t *dev, int8_t power);
609
618
625void sx127x_set_preamble_length(sx127x_t *dev, uint16_t preamble);
626
633void sx127x_set_symbol_timeout(sx127x_t *dev, uint16_t timeout);
634
641void sx127x_set_rx_timeout(sx127x_t *dev, uint32_t timeout);
642
649void sx127x_set_tx_timeout(sx127x_t *dev, uint32_t timeout);
650
659
666void sx127x_set_iq_invert(sx127x_t *dev, bool iq_invert);
667
674void sx127x_set_freq_hop(sx127x_t *dev, bool freq_hop_on);
675
676#ifdef __cplusplus
677}
678#endif
679
Definitions low-level network driver interface.
Low-level GPIO peripheral driver interface definitions.
struct netdev netdev_t
Forward declaration for netdev struct.
Definition netdev.h:285
void sx127x_set_rx(sx127x_t *dev)
Sets the radio in reception mode.
uint8_t sx127x_get_coding_rate(const sx127x_t *dev)
Gets the SX127X LoRa coding rate.
uint8_t sx127x_get_op_mode(const sx127x_t *dev)
Gets the SX127X operating mode.
uint16_t sx127x_get_preamble_length(const sx127x_t *dev)
Gets the SX127X preamble length.
bool sx127x_is_channel_free(sx127x_t *dev, uint32_t freq, int16_t rssi_threshold)
Checks that channel is free with specified RSSI threshold.
bool sx127x_get_iq_invert(const sx127x_t *dev)
Checks if the SX127X LoRa inverted IQ mode is enabled/disabled.
void sx127x_set_tx_power(sx127x_t *dev, int8_t power)
Sets the SX127X transmission power.
uint8_t sx127x_get_max_payload_len(const sx127x_t *dev)
Gets the maximum payload length.
void sx127x_set_sleep(sx127x_t *dev)
Sets the radio in sleep mode.
void sx127x_set_bandwidth(sx127x_t *dev, uint8_t bandwidth)
Sets the SX127X bandwidth.
void sx127x_set_coding_rate(sx127x_t *dev, uint8_t coderate)
Sets the SX127X LoRa coding rate.
void sx127x_set_payload_length(sx127x_t *dev, uint8_t len)
Sets the SX127X payload length.
uint32_t sx127x_random(sx127x_t *dev)
Generates 32 bits random value based on the RSSI readings.
uint8_t sx127x_get_tx_power(const sx127x_t *dev)
Gets the SX127X TX radio power.
void sx127x_set_iq_invert(sx127x_t *dev, bool iq_invert)
Enable/disable the SX127X LoRa IQ inverted mode.
void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params, uint8_t index)
Setup the SX127X.
int sx127x_init(sx127x_t *dev)
Initializes the transceiver.
void sx127x_set_rx_timeout(sx127x_t *dev, uint32_t timeout)
Sets the SX127X RX timeout.
uint32_t sx127x_get_time_on_air(const sx127x_t *dev, uint8_t pkt_len)
Computes the packet time on air in milliseconds.
void sx127x_set_crc(sx127x_t *dev, bool crc)
Enable/Disable the SX127X CRC verification mode.
void sx127x_set_channel(sx127x_t *dev, uint32_t freq)
Sets the channel RF frequency.
int16_t sx127x_read_rssi(const sx127x_t *dev)
Reads the current RSSI value.
uint8_t sx127x_get_hop_period(const sx127x_t *dev)
Gets the SX127X frequency hopping period.
void sx127x_set_modem(sx127x_t *dev, uint8_t modem)
Configures the radio with the given modem.
void sx127x_set_max_payload_len(const sx127x_t *dev, uint8_t maxlen)
Sets the maximum payload length.
void sx127x_dio_irq_handler_t(sx127x_t *dev)
Hardware IO IRQ callback function definition.
Definition sx127x.h:247
void sx127x_set_spreading_factor(sx127x_t *dev, uint8_t sf)
Sets the SX127X LoRa spreading factor.
uint8_t sx127x_flags_t
SX127X IRQ flags.
Definition sx127x.h:230
void sx127x_set_hop_period(sx127x_t *dev, uint8_t hop_period)
Sets the SX127X frequency hopping period.
void sx127x_start_cad(sx127x_t *dev)
Start a channel activity detection.
void sx127x_set_fixed_header_len_mode(sx127x_t *dev, bool mode)
Sets the SX127X to fixed header length mode (explicit mode)
uint8_t sx127x_get_state(const sx127x_t *dev)
Gets current state of transceiver.
void sx127x_set_op_mode(const sx127x_t *dev, uint8_t op_mode)
Sets the SX127X operating mode.
void sx127x_set_state(sx127x_t *dev, uint8_t state)
Sets current state of transceiver.
bool sx127x_get_rx_single(const sx127x_t *dev)
Checks if the SX127X LoRa RX single mode is enabled/disabled.
void sx127x_set_syncword(sx127x_t *dev, uint8_t syncword)
Sets the synchronization word.
void sx127x_set_tx(sx127x_t *dev)
Sets the radio in transmission mode.
void sx127x_set_symbol_timeout(sx127x_t *dev, uint16_t timeout)
Sets the SX127X LoRa symbol timeout.
uint8_t sx127x_get_payload_length(const sx127x_t *dev)
Gets the SX127X payload length.
uint32_t sx127x_get_channel(const sx127x_t *dev)
Gets the channel RF frequency.
uint8_t sx127x_get_bandwidth(const sx127x_t *dev)
Gets the SX127X bandwidth.
void sx127x_set_preamble_length(sx127x_t *dev, uint16_t preamble)
Sets the SX127X LoRa preamble length.
uint8_t sx127x_get_syncword(const sx127x_t *dev)
Gets the synchronization word.
bool sx127x_get_fixed_header_len_mode(const sx127x_t *dev)
Gets the SX127X LoRa fixed header length mode.
int sx127x_reset(const sx127x_t *dev)
Resets the SX127X.
void sx127x_set_standby(sx127x_t *dev)
Sets the radio in stand-by mode.
uint8_t sx127x_get_spreading_factor(const sx127x_t *dev)
Gets the SX127X LoRa spreading factor.
void sx127x_set_tx_timeout(sx127x_t *dev, uint32_t timeout)
Sets the SX127X TX timeout.
void sx127x_set_rx_single(sx127x_t *dev, bool single)
Enable/disable the SX127X LoRa RX single mode.
void sx127x_init_radio_settings(sx127x_t *dev)
Initialize radio settings with default values.
void sx127x_set_freq_hop(sx127x_t *dev, bool freq_hop_on)
Sets the SX127X LoRa frequency hopping mode.
bool sx127x_get_crc(const sx127x_t *dev)
Checks if the SX127X CRC verification mode is enabled.
@ SX127X_ERR_GPIOS
Failed to initialize GPIOs.
Definition sx127x.h:112
@ SX127X_INIT_OK
Initialization was successful.
Definition sx127x.h:110
@ SX127X_ERR_SPI
Failed to initialize SPI bus or CS line.
Definition sx127x.h:111
@ SX127X_ERR_NODEV
No valid device version found.
Definition sx127x.h:113
@ SX127X_RF_RX_RUNNING
Sending state.
Definition sx127x.h:129
@ SX127X_RF_TX_RUNNING
Receiving state.
Definition sx127x.h:130
@ SX127X_RF_CAD
Channel activity detection state.
Definition sx127x.h:131
@ SX127X_RF_IDLE
Idle state.
Definition sx127x.h:128
@ SX127X_PA_BOOST
Power amplifier boost (high power)
Definition sx127x.h:156
@ SX127X_PA_RFO
RFO HF or RFO LF.
Definition sx127x.h:155
@ SX127X_MODEM_LORA
LoRa modem driver.
Definition sx127x.h:121
@ SX127X_MODEM_FSK
FSK modem driver.
Definition sx127x.h:120
@ SX127X_TX_DONE
Sending complete.
Definition sx127x.h:139
@ SX127X_FHSS_CHANGE_CHANNEL
Channel change.
Definition sx127x.h:143
@ SX127X_CAD_DONE
Channel activity detection complete.
Definition sx127x.h:144
@ SX127X_RX_ERROR_CRC
Receiving CRC error.
Definition sx127x.h:142
@ SX127X_TX_TIMEOUT
Sending timeout.
Definition sx127x.h:141
@ SX127X_RX_DONE
Receiving complete.
Definition sx127x.h:138
@ SX127X_RX_TIMEOUT
Receiving timeout.
Definition sx127x.h:140
Low-level SPI peripheral driver interface definition.
SX127X internal data.
Definition sx127x.h:199
uint32_t last_channel
Last channel in frequency hopping sequence.
Definition sx127x.h:203
bool is_last_cad_success
Sign of success of last CAD operation (activity detected)
Definition sx127x.h:204
ztimer_t tx_timeout_timer
TX operation timeout timer.
Definition sx127x.h:201
ztimer_t rx_timeout_timer
RX operation timeout timer.
Definition sx127x.h:202
LoRa configuration structure.
Definition sx127x.h:174
uint8_t datarate
Spreading factor rate, e.g datarate.
Definition sx127x.h:178
uint32_t rx_timeout
RX timeout in milliseconds.
Definition sx127x.h:182
uint8_t bandwidth
Signal bandwidth.
Definition sx127x.h:177
uint8_t freq_hop_period
Frequency hop period.
Definition sx127x.h:180
uint8_t flags
Boolean flags.
Definition sx127x.h:181
int8_t power
Signal power.
Definition sx127x.h:176
uint8_t coderate
Error coding rate.
Definition sx127x.h:179
uint16_t preamble_len
Length of preamble header.
Definition sx127x.h:175
uint32_t tx_timeout
TX timeout in milliseconds.
Definition sx127x.h:183
SX127X hardware and global parameters.
Definition sx127x.h:210
uint8_t paselect
Power amplifier mode (RFO or PABOOST)
Definition sx127x.h:224
gpio_t nss_pin
SPI NSS pin.
Definition sx127x.h:212
gpio_t dio1_pin
Interrupt line DIO1 (Rx timeout)
Definition sx127x.h:215
gpio_t dio4_pin
Interrupt line DIO4 (not used)
Definition sx127x.h:218
spi_t spi
SPI device.
Definition sx127x.h:211
gpio_t dio3_pin
Interrupt line DIO3 (CAD done)
Definition sx127x.h:217
gpio_t dio0_pin
Interrupt line DIO0 (Tx done)
Definition sx127x.h:214
gpio_t reset_pin
Reset pin.
Definition sx127x.h:213
gpio_t dio5_pin
Interrupt line DIO5 (not used)
Definition sx127x.h:219
gpio_t dio2_pin
Interrupt line DIO2 (FHSS channel change)
Definition sx127x.h:216
Radio settings.
Definition sx127x.h:189
sx127x_lora_settings_t lora
LoRa settings.
Definition sx127x.h:193
uint8_t modem
Driver model (FSK or LoRa)
Definition sx127x.h:192
uint32_t channel
Radio channel.
Definition sx127x.h:190
uint8_t state
Radio state.
Definition sx127x.h:191
SX127X device descriptor.
Definition sx127x.h:236
sx127x_params_t params
Device driver parameters.
Definition sx127x.h:239
sx127x_radio_settings_t settings
Radio settings.
Definition sx127x.h:238
netdev_t netdev
Netdev parent struct.
Definition sx127x.h:237
sx127x_internal_t _internal
Internal sx127x data used within the driver.
Definition sx127x.h:240
sx127x_flags_t irq
Device IRQ flags.
Definition sx127x.h:241
ztimer structure
Definition ztimer.h:319
Utility library for comparing and computing timestamps.
ztimer API