RadioLib Universal wireless communication library for Arduino

SX126x.h
1 #if !defined(_RADIOLIB_SX126X_H)
2 #define _RADIOLIB_SX126X_H
3
4 #include "../../TypeDef.h"
5
6 #if !defined(RADIOLIB_EXCLUDE_SX126X)
7
8 #include "../../Module.h"
9
10 #include "../../protocols/PhysicalLayer/PhysicalLayer.h"
11
12 // SX126X physical layer properties
13 #define RADIOLIB_SX126X_FREQUENCY_STEP_SIZE 0.9536743164
14 #define RADIOLIB_SX126X_MAX_PACKET_LENGTH 255
15 #define RADIOLIB_SX126X_CRYSTAL_FREQ 32.0
16 #define RADIOLIB_SX126X_DIV_EXPONENT 25
17
18 // SX126X SPI commands
19 // operational modes commands
20 #define RADIOLIB_SX126X_CMD_NOP 0x00
21 #define RADIOLIB_SX126X_CMD_SET_SLEEP 0x84
22 #define RADIOLIB_SX126X_CMD_SET_STANDBY 0x80
23 #define RADIOLIB_SX126X_CMD_SET_FS 0xC1
24 #define RADIOLIB_SX126X_CMD_SET_TX 0x83
25 #define RADIOLIB_SX126X_CMD_SET_RX 0x82
26 #define RADIOLIB_SX126X_CMD_STOP_TIMER_ON_PREAMBLE 0x9F
27 #define RADIOLIB_SX126X_CMD_SET_RX_DUTY_CYCLE 0x94
28 #define RADIOLIB_SX126X_CMD_SET_CAD 0xC5
29 #define RADIOLIB_SX126X_CMD_SET_TX_CONTINUOUS_WAVE 0xD1
30 #define RADIOLIB_SX126X_CMD_SET_TX_INFINITE_PREAMBLE 0xD2
31 #define RADIOLIB_SX126X_CMD_SET_REGULATOR_MODE 0x96
32 #define RADIOLIB_SX126X_CMD_CALIBRATE 0x89
33 #define RADIOLIB_SX126X_CMD_CALIBRATE_IMAGE 0x98
34 #define RADIOLIB_SX126X_CMD_SET_PA_CONFIG 0x95
35 #define RADIOLIB_SX126X_CMD_SET_RX_TX_FALLBACK_MODE 0x93
36
37 // register and buffer access commands
38 #define RADIOLIB_SX126X_CMD_WRITE_REGISTER 0x0D
39 #define RADIOLIB_SX126X_CMD_READ_REGISTER 0x1D
40 #define RADIOLIB_SX126X_CMD_WRITE_BUFFER 0x0E
41 #define RADIOLIB_SX126X_CMD_READ_BUFFER 0x1E
42
43 // DIO and IRQ control
44 #define RADIOLIB_SX126X_CMD_SET_DIO_IRQ_PARAMS 0x08
45 #define RADIOLIB_SX126X_CMD_GET_IRQ_STATUS 0x12
46 #define RADIOLIB_SX126X_CMD_CLEAR_IRQ_STATUS 0x02
47 #define RADIOLIB_SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL 0x9D
48 #define RADIOLIB_SX126X_CMD_SET_DIO3_AS_TCXO_CTRL 0x97
49
50 // RF, modulation and packet commands
51 #define RADIOLIB_SX126X_CMD_SET_RF_FREQUENCY 0x86
52 #define RADIOLIB_SX126X_CMD_SET_PACKET_TYPE 0x8A
53 #define RADIOLIB_SX126X_CMD_GET_PACKET_TYPE 0x11
54 #define RADIOLIB_SX126X_CMD_SET_TX_PARAMS 0x8E
55 #define RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS 0x8B
56 #define RADIOLIB_SX126X_CMD_SET_PACKET_PARAMS 0x8C
57 #define RADIOLIB_SX126X_CMD_SET_CAD_PARAMS 0x88
58 #define RADIOLIB_SX126X_CMD_SET_BUFFER_BASE_ADDRESS 0x8F
59 #define RADIOLIB_SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT 0x0A
60
61 // status commands
62 #define RADIOLIB_SX126X_CMD_GET_STATUS 0xC0
63 #define RADIOLIB_SX126X_CMD_GET_RSSI_INST 0x15
64 #define RADIOLIB_SX126X_CMD_GET_RX_BUFFER_STATUS 0x13
65 #define RADIOLIB_SX126X_CMD_GET_PACKET_STATUS 0x14
66 #define RADIOLIB_SX126X_CMD_GET_DEVICE_ERRORS 0x17
67 #define RADIOLIB_SX126X_CMD_CLEAR_DEVICE_ERRORS 0x07
68 #define RADIOLIB_SX126X_CMD_GET_STATS 0x10
69 #define RADIOLIB_SX126X_CMD_RESET_STATS 0x00
70
71 #define RADIOLIB_SX126X_CMD_PRAM_UPDATE 0xD9
72 #define RADIOLIB_SX126X_CMD_SET_LBT_SCAN_PARAMS 0x9A
73 #define RADIOLIB_SX126X_CMD_SET_SPECTR_SCAN_PARAMS 0x9B
74
75 // SX126X register map
76 #define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_0 0x029F // SX1268 datasheet v1.1, section 9.6
77 #define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_1 0x02A0 // SX1268 datasheet v1.1, section 9.6
78 #define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_2 0x02A1 // SX1268 datasheet v1.1, section 9.6
79 #define RADIOLIB_SX126X_REG_VERSION_STRING 0x0320
80 #define RADIOLIB_SX126X_REG_HOPPING_ENABLE 0x0385
81 #define RADIOLIB_SX126X_REG_LR_FHSS_PACKET_LENGTH 0x0386
82 #define RADIOLIB_SX126X_REG_LR_FHSS_NUM_HOPPING_BLOCKS 0x0387
83 #define RADIOLIB_SX126X_REG_LR_FHSS_NUM_SYMBOLS_FREQX_MSB(X) (0x0388 + (X)*6)
84 #define RADIOLIB_SX126X_REG_LR_FHSS_NUM_SYMBOLS_FREQX_LSB(X) (0x0389 + (X)*6)
85 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_0(X) (0x038A + (X)*6)
86 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_1(X) (0x038B + (X)*6)
87 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_2(X) (0x038C + (X)*6)
88 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_3(X) (0x038D + (X)*6)
89 #define RADIOLIB_SX126X_REG_SPECTRAL_SCAN_RESULT 0x0401
90 #define RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE 0x0580
91 #define RADIOLIB_SX126X_REG_DIOX_DRIVE_STRENGTH 0x0582
92 #define RADIOLIB_SX126X_REG_DIOX_IN_ENABLE 0x0583
93 #define RADIOLIB_SX126X_REG_DIOX_PULL_UP_CTRL 0x0584
94 #define RADIOLIB_SX126X_REG_DIOX_PULL_DOWN_CTRL 0x0585
95 #define RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0 0x0587
96 #define RADIOLIB_SX126X_REG_PATCH_UPDATE_ENABLE 0x0610
97 #define RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1 0x0680
98 #define RADIOLIB_SX126X_REG_WHITENING_INITIAL_MSB 0x06B8
99 #define RADIOLIB_SX126X_REG_WHITENING_INITIAL_LSB 0x06B9
100 #define RADIOLIB_SX126X_REG_RX_TX_PLD_LEN 0x06BB
101 #define RADIOLIB_SX126X_REG_CRC_INITIAL_MSB 0x06BC
102 #define RADIOLIB_SX126X_REG_CRC_INITIAL_LSB 0x06BD
103 #define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE
104 #define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_LSB 0x06BF
105 #define RADIOLIB_SX126X_REG_SYNC_WORD_0 0x06C0
106 #define RADIOLIB_SX126X_REG_SYNC_WORD_1 0x06C1
107 #define RADIOLIB_SX126X_REG_SYNC_WORD_2 0x06C2
108 #define RADIOLIB_SX126X_REG_SYNC_WORD_3 0x06C3
109 #define RADIOLIB_SX126X_REG_SYNC_WORD_4 0x06C4
110 #define RADIOLIB_SX126X_REG_SYNC_WORD_5 0x06C5
111 #define RADIOLIB_SX126X_REG_SYNC_WORD_6 0x06C6
112 #define RADIOLIB_SX126X_REG_SYNC_WORD_7 0x06C7
113 #define RADIOLIB_SX126X_REG_NODE_ADDRESS 0x06CD
114 #define RADIOLIB_SX126X_REG_BROADCAST_ADDRESS 0x06CE
115 #define RADIOLIB_SX126X_REG_PAYLOAD_LENGTH 0x0702
116 #define RADIOLIB_SX126X_REG_PACKET_PARAMS 0x0704
117 #define RADIOLIB_SX126X_REG_LORA_SYNC_TIMEOUT 0x0706
118 #define RADIOLIB_SX126X_REG_IQ_CONFIG 0x0736
119 #define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB 0x0740
120 #define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_LSB 0x0741
121 #define RADIOLIB_SX126X_REG_FREQ_ERROR 0x076B
122 #define RADIOLIB_SX126X_REG_SPECTRAL_SCAN_STATUS 0x07CD
123 #define RADIOLIB_SX126X_REG_RX_ADDR_PTR 0x0803
124 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_0 0x0819
125 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_1 0x081A
126 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_2 0x081B
127 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_3 0x081C
128 #define RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG 0x0889 // SX1268 datasheet v1.1, section 15.1
129 #define RADIOLIB_SX126X_REG_RF_FREQUENCY_0 0x088B
130 #define RADIOLIB_SX126X_REG_RF_FREQUENCY_1 0x088C
131 #define RADIOLIB_SX126X_REG_RF_FREQUENCY_2 0x088D
132 #define RADIOLIB_SX126X_REG_RF_FREQUENCY_3 0x088E
133 #define RADIOLIB_SX126X_REG_RSSI_AVG_WINDOW 0x089B
134 #define RADIOLIB_SX126X_REG_RX_GAIN 0x08AC
135 #define RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG 0x08D8
136 #define RADIOLIB_SX126X_REG_ANA_LNA 0x08E2
137 #define RADIOLIB_SX126X_REG_LNA_CAP_TUNE_N 0x08E3
138 #define RADIOLIB_SX126X_REG_LNA_CAP_TUNE_P 0x08E4
139 #define RADIOLIB_SX126X_REG_ANA_MIXER 0x08E5
140 #define RADIOLIB_SX126X_REG_OCP_CONFIGURATION 0x08E7
141 #define RADIOLIB_SX126X_REG_RTC_CTRL 0x0902
142 #define RADIOLIB_SX126X_REG_XTA_TRIM 0x0911
143 #define RADIOLIB_SX126X_REG_XTB_TRIM 0x0912
144 #define RADIOLIB_SX126X_REG_DIO3_OUT_VOLTAGE_CTRL 0x0920
145 #define RADIOLIB_SX126X_REG_EVENT_MASK 0x0944
146 #define RADIOLIB_SX126X_REG_PATCH_MEMORY_BASE 0x8000
147
148 // SX126X SPI command variables
149 //RADIOLIB_SX126X_CMD_SET_SLEEP MSB LSB DESCRIPTION
150 #define RADIOLIB_SX126X_SLEEP_START_COLD 0b00000000 // 2 2 sleep mode: cold start, configuration is lost (default)
151 #define RADIOLIB_SX126X_SLEEP_START_WARM 0b00000100 // 2 2 warm start, configuration is retained
152 #define RADIOLIB_SX126X_SLEEP_RTC_OFF 0b00000000 // 0 0 wake on RTC timeout: disabled
153 #define RADIOLIB_SX126X_SLEEP_RTC_ON 0b00000001 // 0 0 enabled
154
155 //RADIOLIB_SX126X_CMD_SET_STANDBY
156 #define RADIOLIB_SX126X_STANDBY_RC 0x00 // 7 0 standby mode: 13 MHz RC oscillator
157 #define RADIOLIB_SX126X_STANDBY_XOSC 0x01 // 7 0 32 MHz crystal oscillator
158
159 //RADIOLIB_SX126X_CMD_SET_RX
160 #define RADIOLIB_SX126X_RX_TIMEOUT_NONE 0x000000 // 23 0 Rx timeout duration: no timeout (Rx single mode)
161 #define RADIOLIB_SX126X_RX_TIMEOUT_INF 0xFFFFFF // 23 0 infinite (Rx continuous mode)
162
163 //RADIOLIB_SX126X_CMD_SET_TX
164 #define RADIOLIB_SX126X_TX_TIMEOUT_NONE 0x000000 // 23 0 Tx timeout duration: no timeout (Tx single mode)
165
166 //RADIOLIB_SX126X_CMD_STOP_TIMER_ON_PREAMBLE
167 #define RADIOLIB_SX126X_STOP_ON_PREAMBLE_OFF 0x00 // 7 0 stop timer on: sync word or header (default)
168 #define RADIOLIB_SX126X_STOP_ON_PREAMBLE_ON 0x01 // 7 0 preamble detection
169
170 //RADIOLIB_SX126X_CMD_SET_REGULATOR_MODE
171 #define RADIOLIB_SX126X_REGULATOR_LDO 0x00 // 7 0 set regulator mode: LDO (default)
172 #define RADIOLIB_SX126X_REGULATOR_DC_DC 0x01 // 7 0 DC-DC
173
174 //RADIOLIB_SX126X_CMD_CALIBRATE
175 #define RADIOLIB_SX126X_CALIBRATE_IMAGE_OFF 0b00000000 // 6 6 image calibration: disabled
176 #define RADIOLIB_SX126X_CALIBRATE_IMAGE_ON 0b01000000 // 6 6 enabled
177 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_P_OFF 0b00000000 // 5 5 ADC bulk P calibration: disabled
178 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_P_ON 0b00100000 // 5 5 enabled
179 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_N_OFF 0b00000000 // 4 4 ADC bulk N calibration: disabled
180 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_N_ON 0b00010000 // 4 4 enabled
181 #define RADIOLIB_SX126X_CALIBRATE_ADC_PULSE_OFF 0b00000000 // 3 3 ADC pulse calibration: disabled
182 #define RADIOLIB_SX126X_CALIBRATE_ADC_PULSE_ON 0b00001000 // 3 3 enabled
183 #define RADIOLIB_SX126X_CALIBRATE_PLL_OFF 0b00000000 // 2 2 PLL calibration: disabled
184 #define RADIOLIB_SX126X_CALIBRATE_PLL_ON 0b00000100 // 2 2 enabled
185 #define RADIOLIB_SX126X_CALIBRATE_RC13M_OFF 0b00000000 // 1 1 13 MHz RC osc. calibration: disabled
186 #define RADIOLIB_SX126X_CALIBRATE_RC13M_ON 0b00000010 // 1 1 enabled
187 #define RADIOLIB_SX126X_CALIBRATE_RC64K_OFF 0b00000000 // 0 0 64 kHz RC osc. calibration: disabled
188 #define RADIOLIB_SX126X_CALIBRATE_RC64K_ON 0b00000001 // 0 0 enabled
189 #define RADIOLIB_SX126X_CALIBRATE_ALL 0b01111111 // 6 0 calibrate all blocks
190
191 //RADIOLIB_SX126X_CMD_CALIBRATE_IMAGE
192 #define RADIOLIB_SX126X_CAL_IMG_430_MHZ_1 0x6B
193 #define RADIOLIB_SX126X_CAL_IMG_430_MHZ_2 0x6F
194 #define RADIOLIB_SX126X_CAL_IMG_470_MHZ_1 0x75
195 #define RADIOLIB_SX126X_CAL_IMG_470_MHZ_2 0x81
196 #define RADIOLIB_SX126X_CAL_IMG_779_MHZ_1 0xC1
197 #define RADIOLIB_SX126X_CAL_IMG_779_MHZ_2 0xC5
198 #define RADIOLIB_SX126X_CAL_IMG_863_MHZ_1 0xD7
199 #define RADIOLIB_SX126X_CAL_IMG_863_MHZ_2 0xDB
200 #define RADIOLIB_SX126X_CAL_IMG_902_MHZ_1 0xE1
201 #define RADIOLIB_SX126X_CAL_IMG_902_MHZ_2 0xE9
202
203 //RADIOLIB_SX126X_CMD_SET_PA_CONFIG
204 #define RADIOLIB_SX126X_PA_CONFIG_HP_MAX 0x07
205 #define RADIOLIB_SX126X_PA_CONFIG_PA_LUT 0x01
206 #define RADIOLIB_SX126X_PA_CONFIG_SX1262_8 0x00
207
208 //RADIOLIB_SX126X_CMD_SET_RX_TX_FALLBACK_MODE
209 #define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_FS 0x40 // 7 0 after Rx/Tx go to: FS mode
210 #define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_XOSC 0x30 // 7 0 standby with crystal oscillator
211 #define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_RC 0x20 // 7 0 standby with RC oscillator (default)
212
213 //RADIOLIB_SX126X_CMD_SET_DIO_IRQ_PARAMS
214 #define RADIOLIB_SX126X_IRQ_LR_FHSS_HOP 0b0100000000000000 // 14 14 PA ramped up during LR-FHSS hop
215 #define RADIOLIB_SX126X_IRQ_TIMEOUT 0b0000001000000000 // 9 9 Rx or Tx timeout
216 #define RADIOLIB_SX126X_IRQ_CAD_DETECTED 0b0000000100000000 // 8 8 channel activity detected
217 #define RADIOLIB_SX126X_IRQ_CAD_DONE 0b0000000010000000 // 7 7 channel activity detection finished
218 #define RADIOLIB_SX126X_IRQ_CRC_ERR 0b0000000001000000 // 6 6 wrong CRC received
219 #define RADIOLIB_SX126X_IRQ_HEADER_ERR 0b0000000000100000 // 5 5 LoRa header CRC error
220 #define RADIOLIB_SX126X_IRQ_HEADER_VALID 0b0000000000010000 // 4 4 valid LoRa header received
221 #define RADIOLIB_SX126X_IRQ_SYNC_WORD_VALID 0b0000000000001000 // 3 3 valid sync word detected
222 #define RADIOLIB_SX126X_IRQ_RADIOLIB_PREAMBLE_DETECTED 0b0000000000000100 // 2 2 preamble detected
223 #define RADIOLIB_SX126X_IRQ_RX_DONE 0b0000000000000010 // 1 1 packet received
224 #define RADIOLIB_SX126X_IRQ_TX_DONE 0b0000000000000001 // 0 0 packet transmission completed
225 #define RADIOLIB_SX126X_IRQ_RX_DEFAULT 0b0000001001100010 // 14 0 default for Rx (RX_DONE, TIMEOUT, CRC_ERR and HEADER_ERR)
226 #define RADIOLIB_SX126X_IRQ_ALL 0b0100001111111111 // 14 0 all interrupts
227 #define RADIOLIB_SX126X_IRQ_NONE 0b0000000000000000 // 14 0 no interrupts
228
229 //RADIOLIB_SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL
230 #define RADIOLIB_SX126X_DIO2_AS_IRQ 0x00 // 7 0 DIO2 configuration: IRQ
231 #define RADIOLIB_SX126X_DIO2_AS_RF_SWITCH 0x01 // 7 0 RF switch control
232
233 //RADIOLIB_SX126X_CMD_SET_DIO3_AS_TCXO_CTRL
234 #define RADIOLIB_SX126X_DIO3_OUTPUT_1_6 0x00 // 7 0 DIO3 voltage output for TCXO: 1.6 V
235 #define RADIOLIB_SX126X_DIO3_OUTPUT_1_7 0x01 // 7 0 1.7 V
236 #define RADIOLIB_SX126X_DIO3_OUTPUT_1_8 0x02 // 7 0 1.8 V
237 #define RADIOLIB_SX126X_DIO3_OUTPUT_2_2 0x03 // 7 0 2.2 V
238 #define RADIOLIB_SX126X_DIO3_OUTPUT_2_4 0x04 // 7 0 2.4 V
239 #define RADIOLIB_SX126X_DIO3_OUTPUT_2_7 0x05 // 7 0 2.7 V
240 #define RADIOLIB_SX126X_DIO3_OUTPUT_3_0 0x06 // 7 0 3.0 V
241 #define RADIOLIB_SX126X_DIO3_OUTPUT_3_3 0x07 // 7 0 3.3 V
242
243 //RADIOLIB_SX126X_CMD_SET_PACKET_TYPE
244 #define RADIOLIB_SX126X_PACKET_TYPE_GFSK 0x00 // 7 0 packet type: GFSK
245 #define RADIOLIB_SX126X_PACKET_TYPE_LORA 0x01 // 7 0 LoRa
246 #define RADIOLIB_SX126X_PACKET_TYPE_LR_FHSS 0x03 // 7 0 LR-FHSS
247
248 //RADIOLIB_SX126X_CMD_SET_TX_PARAMS
249 #define RADIOLIB_SX126X_PA_RAMP_10U 0x00 // 7 0 ramp time: 10 us
250 #define RADIOLIB_SX126X_PA_RAMP_20U 0x01 // 7 0 20 us
251 #define RADIOLIB_SX126X_PA_RAMP_40U 0x02 // 7 0 40 us
252 #define RADIOLIB_SX126X_PA_RAMP_80U 0x03 // 7 0 80 us
253 #define RADIOLIB_SX126X_PA_RAMP_200U 0x04 // 7 0 200 us
254 #define RADIOLIB_SX126X_PA_RAMP_800U 0x05 // 7 0 800 us
255 #define RADIOLIB_SX126X_PA_RAMP_1700U 0x06 // 7 0 1700 us
256 #define RADIOLIB_SX126X_PA_RAMP_3400U 0x07 // 7 0 3400 us
257
258 //RADIOLIB_SX126X_CMD_SET_MODULATION_PARAMS
259 #define RADIOLIB_SX126X_GFSK_FILTER_NONE 0x00 // 7 0 GFSK filter: none
260 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_3 0x08 // 7 0 Gaussian, BT = 0.3
261 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_5 0x09 // 7 0 Gaussian, BT = 0.5
262 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_7 0x0A // 7 0 Gaussian, BT = 0.7
263 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_1 0x0B // 7 0 Gaussian, BT = 1
264 #define RADIOLIB_SX126X_GFSK_RX_BW_4_8 0x1F // 7 0 GFSK Rx bandwidth: 4.8 kHz
265 #define RADIOLIB_SX126X_GFSK_RX_BW_5_8 0x17 // 7 0 5.8 kHz
266 #define RADIOLIB_SX126X_GFSK_RX_BW_7_3 0x0F // 7 0 7.3 kHz
267 #define RADIOLIB_SX126X_GFSK_RX_BW_9_7 0x1E // 7 0 9.7 kHz
268 #define RADIOLIB_SX126X_GFSK_RX_BW_11_7 0x16 // 7 0 11.7 kHz
269 #define RADIOLIB_SX126X_GFSK_RX_BW_14_6 0x0E // 7 0 14.6 kHz
270 #define RADIOLIB_SX126X_GFSK_RX_BW_19_5 0x1D // 7 0 19.5 kHz
271 #define RADIOLIB_SX126X_GFSK_RX_BW_23_4 0x15 // 7 0 23.4 kHz
272 #define RADIOLIB_SX126X_GFSK_RX_BW_29_3 0x0D // 7 0 29.3 kHz
273 #define RADIOLIB_SX126X_GFSK_RX_BW_39_0 0x1C // 7 0 39.0 kHz
274 #define RADIOLIB_SX126X_GFSK_RX_BW_46_9 0x14 // 7 0 46.9 kHz
275 #define RADIOLIB_SX126X_GFSK_RX_BW_58_6 0x0C // 7 0 58.6 kHz
276 #define RADIOLIB_SX126X_GFSK_RX_BW_78_2 0x1B // 7 0 78.2 kHz
277 #define RADIOLIB_SX126X_GFSK_RX_BW_93_8 0x13 // 7 0 93.8 kHz
278 #define RADIOLIB_SX126X_GFSK_RX_BW_117_3 0x0B // 7 0 117.3 kHz
279 #define RADIOLIB_SX126X_GFSK_RX_BW_156_2 0x1A // 7 0 156.2 kHz
280 #define RADIOLIB_SX126X_GFSK_RX_BW_187_2 0x12 // 7 0 187.2 kHz
281 #define RADIOLIB_SX126X_GFSK_RX_BW_234_3 0x0A // 7 0 234.3 kHz
282 #define RADIOLIB_SX126X_GFSK_RX_BW_312_0 0x19 // 7 0 312.0 kHz
283 #define RADIOLIB_SX126X_GFSK_RX_BW_373_6 0x11 // 7 0 373.6 kHz
284 #define RADIOLIB_SX126X_GFSK_RX_BW_467_0 0x09 // 7 0 467.0 kHz
285 #define RADIOLIB_SX126X_LORA_BW_7_8 0x00 // 7 0 LoRa bandwidth: 7.8 kHz
286 #define RADIOLIB_SX126X_LORA_BW_10_4 0x08 // 7 0 10.4 kHz
287 #define RADIOLIB_SX126X_LORA_BW_15_6 0x01 // 7 0 15.6 kHz
288 #define RADIOLIB_SX126X_LORA_BW_20_8 0x09 // 7 0 20.8 kHz
289 #define RADIOLIB_SX126X_LORA_BW_31_25 0x02 // 7 0 31.25 kHz
290 #define RADIOLIB_SX126X_LORA_BW_41_7 0x0A // 7 0 41.7 kHz
291 #define RADIOLIB_SX126X_LORA_BW_62_5 0x03 // 7 0 62.5 kHz
292 #define RADIOLIB_SX126X_LORA_BW_125_0 0x04 // 7 0 125.0 kHz
293 #define RADIOLIB_SX126X_LORA_BW_250_0 0x05 // 7 0 250.0 kHz
294 #define RADIOLIB_SX126X_LORA_BW_500_0 0x06 // 7 0 500.0 kHz
295 #define RADIOLIB_SX126X_LORA_CR_4_5 0x01 // 7 0 LoRa coding rate: 4/5
296 #define RADIOLIB_SX126X_LORA_CR_4_6 0x02 // 7 0 4/6
297 #define RADIOLIB_SX126X_LORA_CR_4_7 0x03 // 7 0 4/7
298 #define RADIOLIB_SX126X_LORA_CR_4_8 0x04 // 7 0 4/8
299 #define RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF 0x00 // 7 0 LoRa low data rate optimization: disabled
300 #define RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON 0x01 // 7 0 enabled
301
302 //RADIOLIB_SX126X_CMD_SET_PACKET_PARAMS
303 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_OFF 0x00 // 7 0 GFSK minimum preamble length before reception starts: detector disabled
304 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_8 0x04 // 7 0 8 bits
305 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_16 0x05 // 7 0 16 bits
306 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_24 0x06 // 7 0 24 bits
307 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_32 0x07 // 7 0 32 bits
308 #define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_OFF 0x00 // 7 0 GFSK address filtering: disabled
309 #define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE 0x01 // 7 0 node only
310 #define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST 0x02 // 7 0 node and broadcast
311 #define RADIOLIB_SX126X_GFSK_PACKET_FIXED 0x00 // 7 0 GFSK packet type: fixed (payload length known in advance to both sides)
312 #define RADIOLIB_SX126X_GFSK_PACKET_VARIABLE 0x01 // 7 0 variable (payload length added to packet)
313 #define RADIOLIB_SX126X_GFSK_CRC_OFF 0x01 // 7 0 GFSK packet CRC: disabled
314 #define RADIOLIB_SX126X_GFSK_CRC_1_BYTE 0x00 // 7 0 1 byte
315 #define RADIOLIB_SX126X_GFSK_CRC_2_BYTE 0x02 // 7 0 2 byte
316 #define RADIOLIB_SX126X_GFSK_CRC_1_BYTE_INV 0x04 // 7 0 1 byte, inverted
317 #define RADIOLIB_SX126X_GFSK_CRC_2_BYTE_INV 0x06 // 7 0 2 byte, inverted
318 #define RADIOLIB_SX126X_GFSK_WHITENING_OFF 0x00 // 7 0 GFSK data whitening: disabled
319 #define RADIOLIB_SX126X_GFSK_WHITENING_ON 0x01 // 7 0 enabled
320 #define RADIOLIB_SX126X_LORA_HEADER_EXPLICIT 0x00 // 7 0 LoRa header mode: explicit
321 #define RADIOLIB_SX126X_LORA_HEADER_IMPLICIT 0x01 // 7 0 implicit
322 #define RADIOLIB_SX126X_LORA_CRC_OFF 0x00 // 7 0 LoRa CRC mode: disabled
323 #define RADIOLIB_SX126X_LORA_CRC_ON 0x01 // 7 0 enabled
324 #define RADIOLIB_SX126X_LORA_IQ_STANDARD 0x00 // 7 0 LoRa IQ setup: standard
325 #define RADIOLIB_SX126X_LORA_IQ_INVERTED 0x01 // 7 0 inverted
326
327 //RADIOLIB_SX126X_CMD_SET_CAD_PARAMS
328 #define RADIOLIB_SX126X_CAD_ON_1_SYMB 0x00 // 7 0 number of symbols used for CAD: 1
329 #define RADIOLIB_SX126X_CAD_ON_2_SYMB 0x01 // 7 0 2
330 #define RADIOLIB_SX126X_CAD_ON_4_SYMB 0x02 // 7 0 4
331 #define RADIOLIB_SX126X_CAD_ON_8_SYMB 0x03 // 7 0 8
332 #define RADIOLIB_SX126X_CAD_ON_16_SYMB 0x04 // 7 0 16
333 #define RADIOLIB_SX126X_CAD_GOTO_STDBY 0x00 // 7 0 after CAD is done, always go to STDBY_RC mode
334 #define RADIOLIB_SX126X_CAD_GOTO_RX 0x01 // 7 0 after CAD is done, go to Rx mode if activity is detected
335 #define RADIOLIB_SX126X_CAD_PARAM_DEFAULT 0xFF // 7 0 used by the CAD methods to specify default parameter value
336 #define RADIOLIB_SX126X_CAD_PARAM_DET_MIN 10 // 7 0 default detMin CAD parameter
337
338 //RADIOLIB_SX126X_CMD_GET_STATUS
339 #define RADIOLIB_SX126X_STATUS_MODE_STDBY_RC 0b00100000 // 6 4 current chip mode: STDBY_RC
340 #define RADIOLIB_SX126X_STATUS_MODE_STDBY_XOSC 0b00110000 // 6 4 STDBY_XOSC
341 #define RADIOLIB_SX126X_STATUS_MODE_FS 0b01000000 // 6 4 FS
342 #define RADIOLIB_SX126X_STATUS_MODE_RX 0b01010000 // 6 4 RX
343 #define RADIOLIB_SX126X_STATUS_MODE_TX 0b01100000 // 6 4 TX
344 #define RADIOLIB_SX126X_STATUS_DATA_AVAILABLE 0b00000100 // 3 1 command status: packet received and data can be retrieved
345 #define RADIOLIB_SX126X_STATUS_CMD_TIMEOUT 0b00000110 // 3 1 SPI command timed out
346 #define RADIOLIB_SX126X_STATUS_CMD_INVALID 0b00001000 // 3 1 invalid SPI command
347 #define RADIOLIB_SX126X_STATUS_CMD_FAILED 0b00001010 // 3 1 SPI command failed to execute
348 #define RADIOLIB_SX126X_STATUS_TX_DONE 0b00001100 // 3 1 packet transmission done
349 #define RADIOLIB_SX126X_STATUS_SPI_FAILED 0b11111111 // 7 0 SPI transaction failed
350
351 //RADIOLIB_SX126X_CMD_GET_PACKET_STATUS
352 #define RADIOLIB_SX126X_GFSK_RX_STATUS_PREAMBLE_ERR 0b10000000 // 7 7 GFSK Rx status: preamble error
353 #define RADIOLIB_SX126X_GFSK_RX_STATUS_SYNC_ERR 0b01000000 // 6 6 sync word error
354 #define RADIOLIB_SX126X_GFSK_RX_STATUS_ADRS_ERR 0b00100000 // 5 5 address error
355 #define RADIOLIB_SX126X_GFSK_RX_STATUS_CRC_ERR 0b00010000 // 4 4 CRC error
356 #define RADIOLIB_SX126X_GFSK_RX_STATUS_LENGTH_ERR 0b00001000 // 3 3 length error
357 #define RADIOLIB_SX126X_GFSK_RX_STATUS_ABORT_ERR 0b00000100 // 2 2 abort error
358 #define RADIOLIB_SX126X_GFSK_RX_STATUS_PACKET_RECEIVED 0b00000010 // 2 2 packet received
359 #define RADIOLIB_SX126X_GFSK_RX_STATUS_PACKET_SENT 0b00000001 // 2 2 packet sent
360
361 //RADIOLIB_SX126X_CMD_GET_DEVICE_ERRORS
362 #define RADIOLIB_SX126X_PA_RAMP_ERR 0b100000000 // 8 8 device errors: PA ramping failed
363 #define RADIOLIB_SX126X_PLL_LOCK_ERR 0b001000000 // 6 6 PLL failed to lock
364 #define RADIOLIB_SX126X_XOSC_START_ERR 0b000100000 // 5 5 crystal oscillator failed to start
365 #define RADIOLIB_SX126X_IMG_CALIB_ERR 0b000010000 // 4 4 image calibration failed
366 #define RADIOLIB_SX126X_ADC_CALIB_ERR 0b000001000 // 3 3 ADC calibration failed
367 #define RADIOLIB_SX126X_PLL_CALIB_ERR 0b000000100 // 2 2 PLL calibration failed
368 #define RADIOLIB_SX126X_RC13M_CALIB_ERR 0b000000010 // 1 1 RC13M calibration failed
369 #define RADIOLIB_SX126X_RC64K_CALIB_ERR 0b000000001 // 0 0 RC64K calibration failed
370
371 //RADIOLIB_SX126X_CMD_SET_LBT_SCAN_PARAMS + RADIOLIB_SX126X_CMD_SET_SPECTR_SCAN_PARAMS
372 #define RADIOLIB_SX126X_SCAN_INTERVAL_7_68_US 10 // 7 0 RSSI reading interval: 7.68 us
373 #define RADIOLIB_SX126X_SCAN_INTERVAL_8_20_US 11 // 7 0 8.20 us
374 #define RADIOLIB_SX126X_SCAN_INTERVAL_8_68_US 12 // 7 0 8.68 us
375
376 // SX126X SPI register variables
377 //RADIOLIB_SX126X_REG_HOPPING_ENABLE
378 #define RADIOLIB_SX126X_HOPPING_ENABLED 0b00000001 // 0 0 intra-packet hopping for LR-FHSS: enabled
379 #define RADIOLIB_SX126X_HOPPING_DISABLED 0b00000000 // 0 0 (disabled)
380
381 //RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB + LSB
382 #define RADIOLIB_SX126X_SYNC_WORD_PUBLIC 0x34 // actually 0x3444 NOTE: The low nibbles in each byte (0x_4_4) are masked out since apparently, they're reserved.
383 #define RADIOLIB_SX126X_SYNC_WORD_PRIVATE 0x12 // actually 0x1424 You couldn't make this up if you tried.
384
385 // RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_1
386 #define RADIOLIB_SX126X_TX_BITBANG_1_DISABLED 0b00000000 // 6 4 Tx bitbang: disabled (default)
387 #define RADIOLIB_SX126X_TX_BITBANG_1_ENABLED 0b00010000 // 6 4 enabled
388
389 // RADIOLIB_SX126X_REG_TX_BITBANG_ENABLE_0
390 #define RADIOLIB_SX126X_TX_BITBANG_0_DISABLED 0b00000000 // 3 0 Tx bitbang: disabled (default)
391 #define RADIOLIB_SX126X_TX_BITBANG_0_ENABLED 0b00001100 // 3 0 enabled
392
393 // RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE
394 #define RADIOLIB_SX126X_DIO1_OUT_DISABLED 0b00000010 // 1 1 DIO1 output: disabled
395 #define RADIOLIB_SX126X_DIO1_OUT_ENABLED 0b00000000 // 1 1 enabled
396 #define RADIOLIB_SX126X_DIO2_OUT_DISABLED 0b00000100 // 2 2 DIO2 output: disabled
397 #define RADIOLIB_SX126X_DIO2_OUT_ENABLED 0b00000000 // 2 2 enabled
398 #define RADIOLIB_SX126X_DIO3_OUT_DISABLED 0b00001000 // 3 3 DIO3 output: disabled
399 #define RADIOLIB_SX126X_DIO3_OUT_ENABLED 0b00000000 // 3 3 enabled
400
401 // RADIOLIB_SX126X_REG_DIOX_IN_ENABLE
402 #define RADIOLIB_SX126X_DIO1_IN_DISABLED 0b00000000 // 1 1 DIO1 input: disabled
403 #define RADIOLIB_SX126X_DIO1_IN_ENABLED 0b00000010 // 1 1 enabled
404 #define RADIOLIB_SX126X_DIO2_IN_DISABLED 0b00000000 // 2 2 DIO2 input: disabled
405 #define RADIOLIB_SX126X_DIO2_IN_ENABLED 0b00000100 // 2 2 enabled
406 #define RADIOLIB_SX126X_DIO3_IN_DISABLED 0b00000000 // 3 3 DIO3 input: disabled
407 #define RADIOLIB_SX126X_DIO3_IN_ENABLED 0b00001000 // 3 3 enabled
408
409 // RADIOLIB_SX126X_REG_RX_GAIN
410 #define RADIOLIB_SX126X_RX_GAIN_BOOSTED 0x96 // 7 0 Rx gain: boosted
411 #define RADIOLIB_SX126X_RX_GAIN_POWER_SAVING 0x94 // 7 0 power saving
412 #define RADIOLIB_SX126X_RX_GAIN_SPECTRAL_SCAN 0xCB // 7 0 spectral scan
413
414 // RADIOLIB_SX126X_REG_PATCH_UPDATE_ENABLE
415 #define RADIOLIB_SX126X_PATCH_UPDATE_DISABLED 0b00000000 // 4 4 patch update: disabled
416 #define RADIOLIB_SX126X_PATCH_UPDATE_ENABLED 0b00010000 // 4 4 enabled
417
418 // RADIOLIB_SX126X_REG_SPECTRAL_SCAN_STATUS
419 #define RADIOLIB_SX126X_SPECTRAL_SCAN_NONE 0x00 // 7 0 spectral scan status: none
420 #define RADIOLIB_SX126X_SPECTRAL_SCAN_ONGOING 0x0F // 7 0 ongoing
421 #define RADIOLIB_SX126X_SPECTRAL_SCAN_ABORTED 0xF0 // 7 0 aborted
422 #define RADIOLIB_SX126X_SPECTRAL_SCAN_COMPLETED 0xFF // 7 0 completed
423
424 // RADIOLIB_SX126X_REG_RSSI_AVG_WINDOW
425 #define RADIOLIB_SX126X_SPECTRAL_SCAN_WINDOW_DEFAULT (0x05 << 2) // 7 0 default RSSI average window
426
427 // RADIOLIB_SX126X_REG_ANA_LNA
428 #define RADIOLIB_SX126X_LNA_RNG_DISABLED 0b00000001 // 0 0 random number: disabled
429 #define RADIOLIB_SX126X_LNA_RNG_ENABLED 0b00000000 // 0 0 enabled
430
431 // RADIOLIB_SX126X_REG_ANA_MIXER
432 #define RADIOLIB_SX126X_MIXER_RNG_DISABLED 0b00000001 // 7 7 random number: disabled
433 #define RADIOLIB_SX126X_MIXER_RNG_ENABLED 0b00000000 // 7 7 enabled
434
435 // size of the spectral scan result
436 #define RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE (33)
437
443 class SX126x: public PhysicalLayer {
444 public:
445 // introduce PhysicalLayer overloads
446 using PhysicalLayer::transmit;
447 using PhysicalLayer::receive;
448 using PhysicalLayer::startTransmit;
449 using PhysicalLayer::readData;
450
455 SX126x(Module* mod);
456
457 Module* getMod();
458
462 bool XTAL;
463
464 // basic methods
465
475 int16_t begin(uint8_t cr, uint8_t syncWord, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO = false);
476
488 int16_t beginFSK(float br, float freqDev, float rxBw, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO = false);
489
496 int16_t reset(bool verify = true);
497
506 int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override;
507
515 int16_t receive(uint8_t* data, size_t len) override;
516
522 int16_t transmitDirect(uint32_t frf = 0) override;
523
529 int16_t receiveDirect() override;
530
535 int16_t scanChannel() override;
536
544 int16_t scanChannel(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin);
545
552 int16_t sleep(bool retainConfig = true);
553
558 int16_t standby() override;
559
567 int16_t standby(uint8_t mode, bool wakeup = true);
568
569 // interrupt methods
570
575 void setDio1Action(void (*func)(void));
576
580 void clearDio1Action();
581
586 void setPacketReceivedAction(void (*func)(void));
587
591 void clearPacketReceivedAction();
592
597 void setPacketSentAction(void (*func)(void));
598
602 void clearPacketSentAction();
603
608 void setChannelScanAction(void (*func)(void));
609
613 void clearChannelScanAction();
614
623 int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override;
624
629 int16_t finishTransmit() override;
630
637 int16_t startReceive();
638
654 int16_t startReceive(uint32_t timeout, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE, size_t len = 0);
655
666 int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE);
667
682 int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE);
683
688 uint16_t getIrqStatus();
689
698 int16_t readData(uint8_t* data, size_t len) override;
699
705 int16_t startChannelScan() override;
706
715 int16_t startChannelScan(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin);
716
721 int16_t getChannelScanResult() override;
722
723 // configuration methods
724
730 int16_t setBandwidth(float bw);
731
737 int16_t setSpreadingFactor(uint8_t sf);
738
744 int16_t setCodingRate(uint8_t cr);
745
752 int16_t setSyncWord(uint8_t syncWord, uint8_t controlBits = 0x44);
753
759 int16_t setCurrentLimit(float currentLimit);
760
765 float getCurrentLimit();
766
772 int16_t setPreambleLength(size_t preambleLength) override;
773
779 int16_t setFrequencyDeviation(float freqDev) override;
780
786 int16_t setBitRate(float br);
787
793 int16_t setDataRate(DataRate_t dr) override;
794
801 int16_t setRxBandwidth(float rxBw);
802
811 int16_t setRxBoostedGainMode(bool rxbgm, bool persist = true);
812
820 int16_t setDataShaping(uint8_t sh) override;
821
828 int16_t setSyncWord(uint8_t* syncWord, size_t len) override;
829
837 int16_t setSyncBits(uint8_t *syncWord, uint8_t bitsLen);
838
844 int16_t setNodeAddress(uint8_t nodeAddr);
845
852 int16_t setBroadcastAddress(uint8_t broadAddr);
853
858 int16_t disableAddressFiltering();
859
868 int16_t setCRC(uint8_t len, uint16_t initial = 0x1D0F, uint16_t polynomial = 0x1021, bool inverted = true);
869
877 int16_t setWhitening(bool enabled, uint16_t initial = 0x01FF);
878
888 int16_t setTCXO(float voltage, uint32_t delay = 5000);
889
894 int16_t setDio2AsRfSwitch(bool enable = true);
895
900 float getDataRate() const;
901
907 float getRSSI(bool packet = true);
908
913 float getSNR();
914
922 float getFrequencyError();
923
929 size_t getPacketLength(bool update = true) override;
930
936 int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_SX126X_MAX_PACKET_LENGTH);
937
943 int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_SX126X_MAX_PACKET_LENGTH);
944
950 uint32_t getTimeOnAir(size_t len) override;
951
957 int16_t implicitHeader(size_t len);
958
963 int16_t explicitHeader();
964
969 int16_t setRegulatorLDO();
970
975 int16_t setRegulatorDCDC();
976
982 int16_t setEncoding(uint8_t encoding) override;
983
985 void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
986
988 void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]);
989
998 int16_t forceLDRO(bool enable);
999
1006 int16_t autoLDRO();
1007
1012 uint8_t randomByte();
1013
1019 int16_t invertIQ(bool enable) override;
1020
1021 #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE)
1026 void setDirectAction(void (*func)(void));
1027
1032 void readBit(uint32_t pin);
1033 #endif
1034
1044 int16_t uploadPatch(const uint32_t* patch, size_t len, bool nonvolatile = true);
1045
1053 int16_t spectralScanStart(uint16_t numSamples, uint8_t window = RADIOLIB_SX126X_SPECTRAL_SCAN_WINDOW_DEFAULT, uint8_t interval = RADIOLIB_SX126X_SCAN_INTERVAL_8_20_US);
1054
1058 void spectralScanAbort();
1059
1064 int16_t spectralScanGetStatus();
1065
1071 int16_t spectralScanGetResult(uint16_t* results);
1072
1084 int16_t setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax = RADIOLIB_SX126X_PA_CONFIG_HP_MAX, uint8_t paLut = RADIOLIB_SX126X_PA_CONFIG_PA_LUT);
1085
1086 #if !defined(RADIOLIB_GODMODE)
1087 protected:
1088 #endif
1089 // SX126x SPI command implementations
1090 int16_t setFs();
1091 int16_t setTx(uint32_t timeout = 0);
1092 int16_t setRx(uint32_t timeout);
1093 int16_t setCad(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin);
1094 int16_t writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes);
1095 int16_t readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes);
1096 int16_t writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00);
1097 int16_t readBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00);
1098 int16_t setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask = RADIOLIB_SX126X_IRQ_NONE, uint16_t dio3Mask = RADIOLIB_SX126X_IRQ_NONE);
1099 virtual int16_t clearIrqStatus(uint16_t clearIrqParams = RADIOLIB_SX126X_IRQ_ALL);
1100 int16_t setRfFrequency(uint32_t frf);
1101 int16_t calibrateImage(uint8_t* data);
1102 uint8_t getPacketType();
1103 int16_t setTxParams(uint8_t power, uint8_t rampTime = RADIOLIB_SX126X_PA_RAMP_200U);
1104 int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro);
1105 int16_t setModulationParamsFSK(uint32_t br, uint8_t sh, uint8_t rxBw, uint32_t freqDev);
1106 int16_t setPacketParams(uint16_t preambleLen, uint8_t crcType, uint8_t payloadLen, uint8_t hdrType, uint8_t invertIQ);
1107 int16_t setPacketParamsFSK(uint16_t preambleLen, uint8_t crcType, uint8_t syncWordLen, uint8_t addrCmp, uint8_t whiten, uint8_t packType = RADIOLIB_SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLen = 0xFF, uint8_t preambleDetectorLen = RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_16);
1108 int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00);
1109 int16_t setRegulatorMode(uint8_t mode);
1110 uint8_t getStatus();
1111 uint32_t getPacketStatus();
1112 uint16_t getDeviceErrors();
1113 int16_t clearDeviceErrors();
1114
1115 int16_t startReceiveCommon(uint32_t timeout = RADIOLIB_SX126X_RX_TIMEOUT_INF, uint16_t irqFlags = RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask = RADIOLIB_SX126X_IRQ_RX_DONE);
1116 int16_t setFrequencyRaw(float freq);
1117 int16_t setPacketMode(uint8_t mode, uint8_t len);
1118 int16_t setHeaderType(uint8_t hdrType, size_t len = 0xFF);
1119 int16_t directMode();
1120 int16_t packetMode();
1121
1122 // fixes to errata
1123 int16_t fixSensitivity();
1124 int16_t fixPaClamping(bool enable = true);
1125 int16_t fixImplicitTimeout();
1126 int16_t fixInvertedIQ(uint8_t iqConfig);
1127
1128 #if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL)
1129 protected:
1130 #endif
1131 Module* mod;
1132
1133 // common low-level SPI interface
1134 static int16_t SPIparseStatus(uint8_t in);
1135
1136 #if !defined(RADIOLIB_GODMODE)
1137 protected:
1138 #endif
1139
1140 uint8_t bandwidth = 0, spreadingFactor = 0, codingRate = 0, ldrOptimize = 0, crcTypeLoRa = 0, headerType = 0;
1141 uint16_t preambleLengthLoRa = 0;
1142 float bandwidthKhz = 0;
1143 bool ldroAuto = true;
1144
1145 uint32_t bitRate = 0, frequencyDev = 0;
1146 uint8_t rxBandwidth = 0, pulseShape = 0, crcTypeFSK = 0, syncWordLength = 0, addrComp = 0, whitening = 0, packetType = 0;
1147 uint16_t preambleLengthFSK = 0;
1148 float rxBandwidthKhz = 0;
1149
1150 float dataRateMeasured = 0;
1151
1152 uint32_t tcxoDelay = 0;
1153
1154 size_t implicitLen = 0;
1155 uint8_t invertIQEnabled = RADIOLIB_SX126X_LORA_IQ_STANDARD;
1156 const char* chipType;
1157
1158 // Allow subclasses to define different TX modes
1159 uint8_t txMode = Module::MODE_TX;
1160
1161 int16_t config(uint8_t modem);
1162 bool findChip(const char* verStr);
1163 };
1164
1165 #endif
1166
1167 #endif
Module
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:31
Module::RFSWITCH_MAX_PINS
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code.
Definition: Module.h:42
Module::MODE_TX
@ MODE_TX
Definition: Module.h:71
PhysicalLayer
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:34
PhysicalLayer::readData
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:209
PhysicalLayer::transmit
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition: PhysicalLayer.cpp:52
PhysicalLayer::startTransmit
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:149
PhysicalLayer::getRSSI
virtual float getRSSI()
Gets RSSI (Recorded Signal Strength Indicator) of the last received packet.
Definition: PhysicalLayer.cpp:284
PhysicalLayer::receive
virtual int16_t receive(uint8_t *data, size_t len)
Binary receive method. Must be implemented in module class.
Definition: PhysicalLayer.cpp:112
PhysicalLayer::sleep
virtual int16_t sleep()
Sets module to sleep.
Definition: PhysicalLayer.cpp:118
SX126x
Base class for SX126x series. All derived classes for SX126x (e.g. SX1262 or SX1268) inherit from thi...
Definition: SX126x.h:443
SX126x::startChannelScan
int16_t startChannelScan() override
Interrupt-driven channel activity detection method. DIO1 will be activated when LoRa preamble is dete...
Definition: SX126x.cpp:741
SX126x::setPacketSentAction
void setPacketSentAction(void(*func)(void))
Sets interrupt service routine to call when a packet is sent.
Definition: SX126x.cpp:502
SX126x::getFrequencyError
float getFrequencyError()
Gets frequency error of the latest received packet. WARNING: This functionality is based on SX128x im...
Definition: SX126x.cpp:1350
SX126x::startReceiveDutyCycleAuto
int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength=0, uint16_t minSymbols=8, uint16_t irqFlags=RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask=RADIOLIB_SX126X_IRQ_RX_DONE)
Calls startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages...
Definition: SX126x.cpp:633
SX126x::setRfSwitchPins
void setRfSwitchPins(uint32_t rxEn, uint32_t txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition: SX126x.cpp:1459
SX126x::setDio1Action
void setDio1Action(void(*func)(void))
Sets interrupt service routine to call when DIO1 activates.
Definition: SX126x.cpp:486
SX126x::clearPacketSentAction
void clearPacketSentAction()
Clears interrupt service routine to call when a packet is sent.
Definition: SX126x.cpp:506
SX126x::setPaConfig
int16_t setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMax=RADIOLIB_SX126X_PA_CONFIG_HP_MAX, uint8_t paLut=RADIOLIB_SX126X_PA_CONFIG_PA_LUT)
Set the PA configuration. Allows user to optimize PA for a specific output power and matching network...
Definition: SX126x.cpp:1764
SX126x::startReceive
int16_t startReceive()
Interrupt-driven receive method with default parameters. Implemented for compatibility with PhysicalL...
Definition: SX126x.cpp:588
SX126x::setDataShaping
int16_t setDataShaping(uint8_t sh) override
Sets time-bandwidth product of Gaussian filter applied for shaping. Allowed values are RADIOLIB_SHAPI...
Definition: SX126x.cpp:1087
SX126x::setChannelScanAction
void setChannelScanAction(void(*func)(void))
Sets interrupt service routine to call when a channel scan is finished.
Definition: SX126x.cpp:510
SX126x::setRegulatorLDO
int16_t setRegulatorLDO()
Set regulator mode to LDO.
Definition: SX126x.cpp:1447
SX126x::invertIQ
int16_t invertIQ(bool enable) override
Enable/disable inversion of the I and Q signals.
Definition: SX126x.cpp:1517
SX126x::uploadPatch
int16_t uploadPatch(const uint32_t *patch, size_t len, bool nonvolatile=true)
Upload binary patch into the SX126x device RAM. Patch is needed to e.g., enable spectral scan and mus...
Definition: SX126x.cpp:1541
SX126x::setEncoding
int16_t setEncoding(uint8_t encoding) override
Sets transmission encoding. Available in FSK mode only. Serves only as alias for PhysicalLayer compat...
Definition: SX126x.cpp:1455
SX126x::setRfSwitchTable
void setRfSwitchTable(const uint32_t(&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[])
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition: SX126x.cpp:1463
SX126x::beginFSK
int16_t beginFSK(float br, float freqDev, float rxBw, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO=false)
Initialization method for FSK modem.
Definition: SX126x.cpp:100
SX126x::setBandwidth
int16_t setBandwidth(float bw)
Sets LoRa bandwidth. Allowed values are 7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125....
Definition: SX126x.cpp:790
SX126x::readData
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:209
SX126x::explicitHeader
int16_t explicitHeader()
Set explicit header mode for future reception/transmission.
Definition: SX126x.cpp:1443
SX126x::forceLDRO
int16_t forceLDRO(bool enable)
Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method,...
Definition: SX126x.cpp:1467
SX126x::transmit
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition: PhysicalLayer.cpp:52
SX126x::setNodeAddress
int16_t setNodeAddress(uint8_t nodeAddr)
Sets node address. Calling this method will also enable address filtering for node address only.
Definition: SX126x.cpp:1175
SX126x::spectralScanGetStatus
int16_t spectralScanGetStatus()
Read the status of spectral scan.
Definition: SX126x.cpp:1608
SX126x::setTCXO
int16_t setTCXO(float voltage, uint32_t delay=5000)
Sets TCXO (Temperature Compensated Crystal Oscillator) configuration.
Definition: SX126x.cpp:1628
SX126x::setRxBandwidth
int16_t setRxBandwidth(float rxBw)
Sets FSK receiver bandwidth. Allowed values are 4.8, 5.8, 7.3, 9.7, 11.7, 14.6, 19....
Definition: SX126x.cpp:987
SX126x::setRegulatorDCDC
int16_t setRegulatorDCDC()
Set regulator mode to DC-DC.
Definition: SX126x.cpp:1451
SX126x::startReceiveDutyCycle
int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod, uint16_t irqFlags=RADIOLIB_SX126X_IRQ_RX_DEFAULT, uint16_t irqMask=RADIOLIB_SX126X_IRQ_RX_DONE)
Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen....
Definition: SX126x.cpp:606
SX126x::clearDio1Action
void clearDio1Action()
Clears interrupt service routine to call when DIO1 activates.
Definition: SX126x.cpp:490
SX126x::getTimeOnAir
uint32_t getTimeOnAir(size_t len) override
Get expected time-on-air for a given size of payload.
Definition: SX126x.cpp:1404
SX126x::standby
int16_t standby() override
Sets the module to standby mode (overload for PhysicalLayer compatibility, uses 13 MHz RC oscillator)...
Definition: SX126x.cpp:469
SX126x::setFrequencyDeviation
int16_t setFrequencyDeviation(float freqDev) override
Sets FSK frequency deviation. Allowed values range from 0.0 to 200.0 kHz.
Definition: SX126x.cpp:913
SX126x::setBitRate
int16_t setBitRate(float br)
Sets FSK bit rate. Allowed values range from 0.6 to 300.0 kbps.
Definition: SX126x.cpp:937
SX126x::clearChannelScanAction
void clearChannelScanAction()
Clears interrupt service routine to call when a channel scan is finished.
Definition: SX126x.cpp:514
SX126x::randomByte
uint8_t randomByte()
Get one truly random byte from RSSI noise.
Definition: SX126x.cpp:1488
SX126x::spectralScanAbort
void spectralScanAbort()
Abort an ongoing spectral scan.
Definition: SX126x.cpp:1604
SX126x::receiveDirect
int16_t receiveDirect() override
Starts direct mode reception. Only implemented for PhysicalLayer compatibility, as SX126x series does...
Definition: SX126x.cpp:361
SX126x::spectralScanStart
int16_t spectralScanStart(uint16_t numSamples, uint8_t window=RADIOLIB_SX126X_SPECTRAL_SCAN_WINDOW_DEFAULT, uint8_t interval=RADIOLIB_SX126X_SCAN_INTERVAL_8_20_US)
Start spectral scan. Requires binary path to be uploaded.
Definition: SX126x.cpp:1588
SX126x::readBit
void readBit(uint32_t pin)
Function to read and process data bit in direct reception mode.
Definition: SX126x.cpp:1536
SX126x::finishTransmit
int16_t finishTransmit() override
Clean up after transmission is done.
Definition: SX126x.cpp:580
SX126x::setCurrentLimit
int16_t setCurrentLimit(float currentLimit)
Sets current protection limit. Can be set in 2.5 mA steps.
Definition: SX126x.cpp:878
SX126x::setRxBoostedGainMode
int16_t setRxBoostedGainMode(bool rxbgm, bool persist=true)
Enables or disables Rx Boosted Gain mode as described in SX126x datasheet section 9....
Definition: SX126x.cpp:1050
SX126x::transmitDirect
int16_t transmitDirect(uint32_t frf=0) override
Starts direct mode transmission.
Definition: SX126x.cpp:345
SX126x::startTransmit
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:149
SX126x::variablePacketLengthMode
int16_t variablePacketLengthMode(uint8_t maxLen=RADIOLIB_SX126X_MAX_PACKET_LENGTH)
Set modem in variable packet length mode. Available in FSK mode only.
Definition: SX126x.cpp:1400
SX126x::begin
int16_t begin(uint8_t cr, uint8_t syncWord, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO=false)
Initialization method for LoRa modem.
Definition: SX126x.cpp:15
SX126x::setCRC
int16_t setCRC(uint8_t len, uint16_t initial=0x1D0F, uint16_t polynomial=0x1021, bool inverted=true)
Sets CRC configuration.
Definition: SX126x.cpp:1220
SX126x::getIrqStatus
uint16_t getIrqStatus()
Reads the current IRQ status.
Definition: SX126x.cpp:1801
SX126x::reset
int16_t reset(bool verify=true)
Reset method. Will reset the chip to the default state using RST pin.
Definition: SX126x.cpp:194
SX126x::setSyncWord
int16_t setSyncWord(uint8_t syncWord, uint8_t controlBits=0x44)
Sets LoRa sync word.
Definition: SX126x.cpp:867
SX126x::getCurrentLimit
float getCurrentLimit()
Reads current protection limit.
Definition: SX126x.cpp:891
SX126x::SX126x
SX126x(Module *mod)
Default constructor.
Definition: SX126x.cpp:6
SX126x::receive
virtual int16_t receive(uint8_t *data, size_t len)
Binary receive method. Must be implemented in module class.
Definition: PhysicalLayer.cpp:112
SX126x::autoLDRO
int16_t autoLDRO()
Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method,...
Definition: SX126x.cpp:1479
SX126x::setDirectAction
void setDirectAction(void(*func)(void))
Set interrupt service routine function to call when data bit is received in direct mode.
Definition: SX126x.cpp:1532
SX126x::fixedPacketLengthMode
int16_t fixedPacketLengthMode(uint8_t len=RADIOLIB_SX126X_MAX_PACKET_LENGTH)
Set modem in fixed packet length mode. Available in FSK mode only.
Definition: SX126x.cpp:1396
SX126x::setBroadcastAddress
int16_t setBroadcastAddress(uint8_t broadAddr)
Sets broadcast address. Calling this method will also enable address filtering for node and broadcast...
Definition: SX126x.cpp:1192
SX126x::getPacketLength
size_t getPacketLength(bool update=true) override
Query modem for the packet length of received payload.
Definition: SX126x.cpp:1383
SX126x::setSyncBits
int16_t setSyncBits(uint8_t *syncWord, uint8_t bitsLen)
Sets FSK sync word in the form of array of up to 8 bytes.
Definition: SX126x.cpp:1148
SX126x::scanChannel
int16_t scanChannel() override
Performs scan for LoRa transmission in the current channel. Detects both preamble and payload.
Definition: SX126x.cpp:435
SX126x::getDataRate
float getDataRate() const
Gets effective data rate for the last transmitted packet. The value is calculated only for payload by...
Definition: SX126x.cpp:1316
SX126x::clearPacketReceivedAction
void clearPacketReceivedAction()
Clears interrupt service routine to call when a packet is received.
Definition: SX126x.cpp:498
SX126x::setPacketReceivedAction
void setPacketReceivedAction(void(*func)(void))
Sets interrupt service routine to call when a packet is received.
Definition: SX126x.cpp:494
SX126x::setPreambleLength
int16_t setPreambleLength(size_t preambleLength) override
Sets preamble length for LoRa or FSK modem. Allowed values range from 1 to 65535.
Definition: SX126x.cpp:900
SX126x::XTAL
bool XTAL
Whether the module has an XTAL (true) or TCXO (false). Defaults to false.
Definition: SX126x.h:462
SX126x::implicitHeader
int16_t implicitHeader(size_t len)
Set implicit header mode for future reception/transmission.
Definition: SX126x.cpp:1439
SX126x::getSNR
float getSNR()
Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa modem.
Definition: SX126x.cpp:1334
SX126x::setDio2AsRfSwitch
int16_t setDio2AsRfSwitch(bool enable=true)
Set DIO2 to function as RF switch (default in Semtech example designs).
Definition: SX126x.cpp:1681
SX126x::spectralScanGetResult
int16_t spectralScanGetResult(uint16_t *results)
Read the result of spectral scan.
Definition: SX126x.cpp:1616
SX126x::setWhitening
int16_t setWhitening(bool enabled, uint16_t initial=0x01FF)
Sets FSK whitening parameters.
Definition: SX126x.cpp:1279
SX126x::setSpreadingFactor
int16_t setSpreadingFactor(uint8_t sf)
Sets LoRa spreading factor. Allowed values range from 5 to 12.
Definition: SX126x.cpp:841
SX126x::setDataRate
int16_t setDataRate(DataRate_t dr) override
Set data.
Definition: SX126x.cpp:958
SX126x::disableAddressFiltering
int16_t disableAddressFiltering()
Disables address filtering. Calling this method will also erase previously set addresses.
Definition: SX126x.cpp:1209
SX126x::setCodingRate
int16_t setCodingRate(uint8_t cr)
Sets LoRa coding rate denominator. Allowed values range from 5 to 8.
Definition: SX126x.cpp:854
SX126x::getChannelScanResult
int16_t getChannelScanResult() override
Read the channel scan result.
Definition: SX126x.cpp:771
Module::RfSwitchMode_t
Definition: Module.h:49
DataRate_t
Definition: PhysicalLayer.h:21