Loading...
Searching...
No Matches
sx126x.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021 Inria
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
19
20#include <assert.h>
21
22#include_next "sx126x.h"
23
24#include "net/netdev.h"
25
26#include "periph/gpio.h"
27#include "periph/spi.h"
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33#if defined(DOXYGEN)
46# define CONFIG_SX126X_DEFAULT_SYNC_WORD 0x12
47#endif
48
52typedef struct sx126x sx126x_t;
53
57typedef enum {
58 SX126X_RF_MODE_RX,
59 SX126X_RF_MODE_TX_LPA,
60 SX126X_RF_MODE_TX_HPA,
62
67#define SX126X_SINGLE (( \
68 IS_USED(MODULE_SX1261) \
69 + IS_USED(MODULE_SX1262) \
70 + IS_USED(MODULE_SX1268) \
71 + IS_USED(MODULE_LLCC68) \
72 + IS_USED(MODULE_SX126X_STM32WL) \
73 ) == 1)
74
78#if (IS_USED(MODULE_SX1261) || IS_USED(MODULE_SX1262) || \
79 IS_USED(MODULE_SX1268) || IS_USED(MODULE_LLCC68))
80#define SX126X_SPI 1
81#endif
82
86typedef enum {
87 SX126X_TYPE_SX1261,
88 SX126X_TYPE_SX1262,
89 SX126X_TYPE_SX1268,
90 SX126X_TYPE_LLCC68,
91 SX126X_TYPE_STM32WL,
93
102
111
115#define SX126X_IRQ_MASK_ALL (SX126X_IRQ_TX_DONE | SX126X_IRQ_RX_DONE | \
116 SX126X_IRQ_PREAMBLE_DETECTED | SX126X_IRQ_SYNC_WORD_VALID | \
117 SX126X_IRQ_HEADER_VALID | SX126X_IRQ_HEADER_ERROR | \
118 SX126X_IRQ_CRC_ERROR | SX126X_IRQ_CAD_DONE | \
119 SX126X_IRQ_CAD_DETECTED | SX126X_IRQ_TIMEOUT)
120
124typedef struct {
125 spi_t spi;
126 gpio_t nss_pin;
127 gpio_t reset_pin;
128 gpio_t busy_pin;
129 gpio_t dio1_pin;
130#if IS_USED(MODULE_SX126X_DIO2)
131 sx126x_dio2_mode_t dio2_mode;
132#endif
133#if IS_USED(MODULE_SX126X_DIO3)
134 sx126x_dio3_mode_t dio3_mode;
135 struct {
136 unsigned tcxo_volt :8;
137 unsigned tcxo_timeout :24;
139 } dio3_arg;
140#endif
141 sx126x_reg_mod_t regulator;
143#if IS_USED(MODULE_SX126X_RF_SWITCH)
147 void(*set_rf_mode)(sx126x_t *dev, sx126x_rf_mode_t rf_mode);
148 sx126x_rf_mode_t tx_pa_mode;
149#endif
151
155struct sx126x {
158 sx126x_pkt_params_lora_t pkt_params;
159 sx126x_mod_params_lora_t mod_params;
160 uint32_t channel;
161 uint16_t rx_timeout;
163};
164
173void sx126x_setup(sx126x_t *dev, const sx126x_params_t *params, uint8_t index);
174
183
192static inline int sx126x_symbol_to_msec(sx126x_t *dev, uint16_t symbols)
193{
194 assert(dev && (dev->mod_params.bw <= SX126X_LORA_BW_500) && \
195 (dev->mod_params.bw >= SX126X_LORA_BW_125));
196
197 /* Refer section 6.1.4 LoRa Time-on-Air in SX1268 datasheet */
198 return (symbols * (1 << (dev->mod_params.sf + 7 - dev->mod_params.bw)) / 1000);
199}
200
208uint32_t sx126x_get_channel(const sx126x_t *dev);
209
216void sx126x_set_channel(sx126x_t *dev, uint32_t freq);
217
225uint8_t sx126x_get_bandwidth(const sx126x_t *dev);
226
233void sx126x_set_bandwidth(sx126x_t *dev, uint8_t bandwidth);
234
243
251
260
267void sx126x_set_coding_rate(sx126x_t *dev, uint8_t cr);
268
278void sx126x_set_tx_power(sx126x_t *dev, int8_t power_dbm, sx126x_ramp_time_t ramp_time);
279
288
296
305
312void sx126x_set_lora_crc(sx126x_t *dev, bool crc);
313
322
330
339
346void sx126x_set_lora_preamble_length(sx126x_t *dev, uint16_t preamble);
347
356
363void sx126x_set_lora_iq_invert(sx126x_t *dev, bool iq_invert);
364
365#ifdef __cplusplus
366}
367#endif
368
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition assert.h:143
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
int sx126x_init(sx126x_t *dev)
Initialize the given device.
void sx126x_set_spreading_factor(sx126x_t *dev, uint8_t sf)
Sets the LoRa spreading factor.
void sx126x_set_bandwidth(sx126x_t *dev, uint8_t bandwidth)
Sets the LoRa bandwidth.
void sx126x_set_lora_implicit_header(sx126x_t *dev, bool mode)
Sets LoRa implicit header mode.
void sx126x_set_lora_iq_invert(sx126x_t *dev, bool iq_invert)
Enable/disable the LoRa IQ inverted mode.
uint16_t sx126x_get_lora_preamble_length(const sx126x_t *dev)
Gets the LoRa preamble length.
void sx126x_set_coding_rate(sx126x_t *dev, uint8_t cr)
Sets the LoRa coding rate.
void sx126x_set_lora_crc(sx126x_t *dev, bool crc)
Enable/Disable CRC verification mode.
sx126x_type_t
Used to identify if its a generic SPI module.
Definition sx126x.h:86
void sx126x_setup(sx126x_t *dev, const sx126x_params_t *params, uint8_t index)
Setup the radio device.
void sx126x_set_lora_preamble_length(sx126x_t *dev, uint16_t preamble)
Sets the LoRa preamble length.
void sx126x_set_lora_payload_length(sx126x_t *dev, uint8_t len)
Sets the payload length.
uint8_t sx126x_get_spreading_factor(const sx126x_t *dev)
Gets the LoRa spreading factor.
static int sx126x_symbol_to_msec(sx126x_t *dev, uint16_t symbols)
Converts symbol value to time in milliseconds.
Definition sx126x.h:192
void sx126x_set_tx_power(sx126x_t *dev, int8_t power_dbm, sx126x_ramp_time_t ramp_time)
Sets the TX power and ramp time.
uint8_t sx126x_get_coding_rate(const sx126x_t *dev)
Gets the LoRa coding rate.
sx126x_dio3_mode_t
Dio3 pin mode.
Definition sx126x.h:106
sx126x_dio2_mode_t
Dio2 pin mode.
Definition sx126x.h:97
void sx126x_set_channel(sx126x_t *dev, uint32_t freq)
Sets the channel RF frequency.
sx126x_rf_mode_t
RF switch states.
Definition sx126x.h:57
uint8_t sx126x_get_bandwidth(const sx126x_t *dev)
Gets the LoRa bandwidth.
uint32_t sx126x_get_channel(const sx126x_t *dev)
Gets the channel RF frequency.
bool sx126x_get_lora_implicit_header(const sx126x_t *dev)
Gets the LoRa implicit header mode.
struct sx126x sx126x_t
Definition sx126x.h:52
bool sx126x_get_lora_crc(const sx126x_t *dev)
Checks if CRC verification mode is enabled.
uint8_t sx126x_get_lora_payload_length(const sx126x_t *dev)
Gets the payload length.
bool sx126x_get_lora_iq_invert(const sx126x_t *dev)
Checks if the LoRa inverted IQ mode is enabled/disabled.
@ SX126X_DIO3_UNUSED
Not used.
Definition sx126x.h:107
@ SX126X_DIO3_IRQ
IRQ pin (ToDo)
Definition sx126x.h:108
@ SX126X_DIO3_TCXO
TCXO control pin.
Definition sx126x.h:109
@ SX126X_DIO2_RF_SWITCH
RF switch control pin.
Definition sx126x.h:100
@ SX126X_DIO2_IRQ
IRQ pin (ToDo)
Definition sx126x.h:99
@ SX126X_DIO2_UNUSED
Not used.
Definition sx126x.h:98
Low-level SPI peripheral driver interface definition.
Device initialization parameters.
Definition sx126x.h:124
gpio_t nss_pin
SPI NSS pin.
Definition sx126x.h:126
gpio_t busy_pin
Busy pin.
Definition sx126x.h:128
spi_t spi
SPI device.
Definition sx126x.h:125
gpio_t dio1_pin
Dio1 pin.
Definition sx126x.h:129
sx126x_type_t type
Variant of sx126x.
Definition sx126x.h:142
sx126x_reg_mod_t regulator
Power regulator mode.
Definition sx126x.h:141
gpio_t reset_pin
Reset pin.
Definition sx126x.h:127
Device descriptor for the driver.
Definition sx126x.h:155
uint32_t channel
Current channel frequency (in Hz)
Definition sx126x.h:160
bool radio_sleep
Radio sleep status.
Definition sx126x.h:162
sx126x_mod_params_lora_t mod_params
Lora modulation parameters.
Definition sx126x.h:159
sx126x_pkt_params_lora_t pkt_params
Lora packet parameters.
Definition sx126x.h:158
netdev_t netdev
Netdev parent struct.
Definition sx126x.h:156
uint16_t rx_timeout
Rx Timeout in terms of symbols.
Definition sx126x.h:161
sx126x_params_t * params
Initialization parameters.
Definition sx126x.h:157