1 #if !defined(_RADIOLIB_SX126X_H)
2 #define _RADIOLIB_SX126X_H
4 #include "../../TypeDef.h"
6 #if !defined(RADIOLIB_EXCLUDE_SX126X)
8 #include "../../Module.h"
10 #include "../../protocols/PhysicalLayer/PhysicalLayer.h"
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
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
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
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
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
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
73 #define RADIOLIB_SX126X_REG_HOPPING_ENABLE 0x0385
74 #define RADIOLIB_SX126X_REG_LR_FHSS_PACKET_LENGTH 0x0386
75 #define RADIOLIB_SX126X_REG_LR_FHSS_NUM_HOPPING_BLOCKS 0x0387
76 #define RADIOLIB_SX126X_REG_LR_FHSS_NUM_SYMBOLS_FREQX_MSB(X) (0x0388 + (X)*6)
77 #define RADIOLIB_SX126X_REG_LR_FHSS_NUM_SYMBOLS_FREQX_LSB(X) (0x0389 + (X)*6)
78 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_0(X) (0x038A + (X)*6)
79 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_1(X) (0x038B + (X)*6)
80 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_2(X) (0x038C + (X)*6)
81 #define RADIOLIB_SX126X_REG_LR_FHSS_FREQX_3(X) (0x038D + (X)*6)
82 #define RADIOLIB_SX126X_REG_DIOX_OUT_ENABLE 0x0580
83 #define RADIOLIB_SX126X_REG_DIOX_IN_ENABLE 0x0583
84 #define RADIOLIB_SX126X_REG_DIOX_PULL_UP_CTRL 0x0584
85 #define RADIOLIB_SX126X_REG_DIOX_PULL_DOWN_CTRL 0x0585
86 #define RADIOLIB_SX126X_REG_WHITENING_INITIAL_MSB 0x06B8
87 #define RADIOLIB_SX126X_REG_WHITENING_INITIAL_LSB 0x06B9
88 #define RADIOLIB_SX126X_REG_CRC_INITIAL_MSB 0x06BC
89 #define RADIOLIB_SX126X_REG_CRC_INITIAL_LSB 0x06BD
90 #define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE
91 #define RADIOLIB_SX126X_REG_CRC_POLYNOMIAL_LSB 0x06BF
92 #define RADIOLIB_SX126X_REG_SYNC_WORD_0 0x06C0
93 #define RADIOLIB_SX126X_REG_SYNC_WORD_1 0x06C1
94 #define RADIOLIB_SX126X_REG_SYNC_WORD_2 0x06C2
95 #define RADIOLIB_SX126X_REG_SYNC_WORD_3 0x06C3
96 #define RADIOLIB_SX126X_REG_SYNC_WORD_4 0x06C4
97 #define RADIOLIB_SX126X_REG_SYNC_WORD_5 0x06C5
98 #define RADIOLIB_SX126X_REG_SYNC_WORD_6 0x06C6
99 #define RADIOLIB_SX126X_REG_SYNC_WORD_7 0x06C7
100 #define RADIOLIB_SX126X_REG_NODE_ADDRESS 0x06CD
101 #define RADIOLIB_SX126X_REG_BROADCAST_ADDRESS 0x06CE
102 #define RADIOLIB_SX126X_REG_IQ_CONFIG 0x0736
103 #define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_MSB 0x0740
104 #define RADIOLIB_SX126X_REG_LORA_SYNC_WORD_LSB 0x0741
105 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_0 0x0819
106 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_1 0x081A
107 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_2 0x081B
108 #define RADIOLIB_SX126X_REG_RANDOM_NUMBER_3 0x081C
109 #define RADIOLIB_SX126X_REG_RX_GAIN 0x08AC
110 #define RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG 0x08D8
111 #define RADIOLIB_SX126X_REG_OCP_CONFIGURATION 0x08E7
112 #define RADIOLIB_SX126X_REG_RTC_CTRL 0x0902
113 #define RADIOLIB_SX126X_REG_XTA_TRIM 0x0911
114 #define RADIOLIB_SX126X_REG_XTB_TRIM 0x0912
115 #define RADIOLIB_SX126X_REG_DIO3_OUT_VOLTAGE_CTRL 0x0920
116 #define RADIOLIB_SX126X_REG_EVENT_MASK 0x0944
119 #define RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG 0x0889
120 #define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_0 0x029F
121 #define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_1 0x02A0
122 #define RADIOLIB_SX126X_REG_RX_GAIN_RETENTION_2 0x02A1
127 #define RADIOLIB_SX126X_SLEEP_START_COLD 0b00000000
128 #define RADIOLIB_SX126X_SLEEP_START_WARM 0b00000100
129 #define RADIOLIB_SX126X_SLEEP_RTC_OFF 0b00000000
130 #define RADIOLIB_SX126X_SLEEP_RTC_ON 0b00000001
133 #define RADIOLIB_SX126X_STANDBY_RC 0x00
134 #define RADIOLIB_SX126X_STANDBY_XOSC 0x01
137 #define RADIOLIB_SX126X_RX_TIMEOUT_NONE 0x000000
138 #define RADIOLIB_SX126X_RX_TIMEOUT_INF 0xFFFFFF
141 #define RADIOLIB_SX126X_TX_TIMEOUT_NONE 0x000000
144 #define RADIOLIB_SX126X_STOP_ON_PREAMBLE_OFF 0x00
145 #define RADIOLIB_SX126X_STOP_ON_PREAMBLE_ON 0x01
148 #define RADIOLIB_SX126X_REGULATOR_LDO 0x00
149 #define RADIOLIB_SX126X_REGULATOR_DC_DC 0x01
152 #define RADIOLIB_SX126X_CALIBRATE_IMAGE_OFF 0b00000000
153 #define RADIOLIB_SX126X_CALIBRATE_IMAGE_ON 0b01000000
154 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_P_OFF 0b00000000
155 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_P_ON 0b00100000
156 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_N_OFF 0b00000000
157 #define RADIOLIB_SX126X_CALIBRATE_ADC_BULK_N_ON 0b00010000
158 #define RADIOLIB_SX126X_CALIBRATE_ADC_PULSE_OFF 0b00000000
159 #define RADIOLIB_SX126X_CALIBRATE_ADC_PULSE_ON 0b00001000
160 #define RADIOLIB_SX126X_CALIBRATE_PLL_OFF 0b00000000
161 #define RADIOLIB_SX126X_CALIBRATE_PLL_ON 0b00000100
162 #define RADIOLIB_SX126X_CALIBRATE_RC13M_OFF 0b00000000
163 #define RADIOLIB_SX126X_CALIBRATE_RC13M_ON 0b00000010
164 #define RADIOLIB_SX126X_CALIBRATE_RC64K_OFF 0b00000000
165 #define RADIOLIB_SX126X_CALIBRATE_RC64K_ON 0b00000001
166 #define RADIOLIB_SX126X_CALIBRATE_ALL 0b01111111
169 #define RADIOLIB_SX126X_CAL_IMG_430_MHZ_1 0x6B
170 #define RADIOLIB_SX126X_CAL_IMG_430_MHZ_2 0x6F
171 #define RADIOLIB_SX126X_CAL_IMG_470_MHZ_1 0x75
172 #define RADIOLIB_SX126X_CAL_IMG_470_MHZ_2 0x81
173 #define RADIOLIB_SX126X_CAL_IMG_779_MHZ_1 0xC1
174 #define RADIOLIB_SX126X_CAL_IMG_779_MHZ_2 0xC5
175 #define RADIOLIB_SX126X_CAL_IMG_863_MHZ_1 0xD7
176 #define RADIOLIB_SX126X_CAL_IMG_863_MHZ_2 0xDB
177 #define RADIOLIB_SX126X_CAL_IMG_902_MHZ_1 0xE1
178 #define RADIOLIB_SX126X_CAL_IMG_902_MHZ_2 0xE9
181 #define RADIOLIB_SX126X_PA_CONFIG_HP_MAX 0x07
182 #define RADIOLIB_SX126X_PA_CONFIG_PA_LUT 0x01
183 #define RADIOLIB_SX126X_PA_CONFIG_SX1262_8 0x00
186 #define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_FS 0x40
187 #define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_XOSC 0x30
188 #define RADIOLIB_SX126X_RX_TX_FALLBACK_MODE_STDBY_RC 0x20
191 #define RADIOLIB_SX126X_IRQ_LR_FHSS_HOP 0b0100000000000000
192 #define RADIOLIB_SX126X_IRQ_TIMEOUT 0b0000001000000000
193 #define RADIOLIB_SX126X_IRQ_CAD_DETECTED 0b0000000100000000
194 #define RADIOLIB_SX126X_IRQ_CAD_DONE 0b0000000010000000
195 #define RADIOLIB_SX126X_IRQ_CRC_ERR 0b0000000001000000
196 #define RADIOLIB_SX126X_IRQ_HEADER_ERR 0b0000000000100000
197 #define RADIOLIB_SX126X_IRQ_HEADER_VALID 0b0000000000010000
198 #define RADIOLIB_SX126X_IRQ_SYNC_WORD_VALID 0b0000000000001000
199 #define RADIOLIB_SX126X_IRQ_RADIOLIB_PREAMBLE_DETECTED 0b0000000000000100
200 #define RADIOLIB_SX126X_IRQ_RX_DONE 0b0000000000000010
201 #define RADIOLIB_SX126X_IRQ_TX_DONE 0b0000000000000001
202 #define RADIOLIB_SX126X_IRQ_ALL 0b0100001111111111
203 #define RADIOLIB_SX126X_IRQ_NONE 0b0000000000000000
206 #define RADIOLIB_SX126X_DIO2_AS_IRQ 0x00
207 #define RADIOLIB_SX126X_DIO2_AS_RF_SWITCH 0x01
210 #define RADIOLIB_SX126X_DIO3_OUTPUT_1_6 0x00
211 #define RADIOLIB_SX126X_DIO3_OUTPUT_1_7 0x01
212 #define RADIOLIB_SX126X_DIO3_OUTPUT_1_8 0x02
213 #define RADIOLIB_SX126X_DIO3_OUTPUT_2_2 0x03
214 #define RADIOLIB_SX126X_DIO3_OUTPUT_2_4 0x04
215 #define RADIOLIB_SX126X_DIO3_OUTPUT_2_7 0x05
216 #define RADIOLIB_SX126X_DIO3_OUTPUT_3_0 0x06
217 #define RADIOLIB_SX126X_DIO3_OUTPUT_3_3 0x07
220 #define RADIOLIB_SX126X_PACKET_TYPE_GFSK 0x00
221 #define RADIOLIB_SX126X_PACKET_TYPE_LORA 0x01
222 #define RADIOLIB_SX126X_PACKET_TYPE_LR_FHSS 0x03
225 #define RADIOLIB_SX126X_PA_RAMP_10U 0x00
226 #define RADIOLIB_SX126X_PA_RAMP_20U 0x01
227 #define RADIOLIB_SX126X_PA_RAMP_40U 0x02
228 #define RADIOLIB_SX126X_PA_RAMP_80U 0x03
229 #define RADIOLIB_SX126X_PA_RAMP_200U 0x04
230 #define RADIOLIB_SX126X_PA_RAMP_800U 0x05
231 #define RADIOLIB_SX126X_PA_RAMP_1700U 0x06
232 #define RADIOLIB_SX126X_PA_RAMP_3400U 0x07
235 #define RADIOLIB_SX126X_GFSK_FILTER_NONE 0x00
236 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_3 0x08
237 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_5 0x09
238 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_0_7 0x0A
239 #define RADIOLIB_SX126X_GFSK_FILTER_GAUSS_1 0x0B
240 #define RADIOLIB_SX126X_GFSK_RX_BW_4_8 0x1F
241 #define RADIOLIB_SX126X_GFSK_RX_BW_5_8 0x17
242 #define RADIOLIB_SX126X_GFSK_RX_BW_7_3 0x0F
243 #define RADIOLIB_SX126X_GFSK_RX_BW_9_7 0x1E
244 #define RADIOLIB_SX126X_GFSK_RX_BW_11_7 0x16
245 #define RADIOLIB_SX126X_GFSK_RX_BW_14_6 0x0E
246 #define RADIOLIB_SX126X_GFSK_RX_BW_19_5 0x1D
247 #define RADIOLIB_SX126X_GFSK_RX_BW_23_4 0x15
248 #define RADIOLIB_SX126X_GFSK_RX_BW_29_3 0x0D
249 #define RADIOLIB_SX126X_GFSK_RX_BW_39_0 0x1C
250 #define RADIOLIB_SX126X_GFSK_RX_BW_46_9 0x14
251 #define RADIOLIB_SX126X_GFSK_RX_BW_58_6 0x0C
252 #define RADIOLIB_SX126X_GFSK_RX_BW_78_2 0x1B
253 #define RADIOLIB_SX126X_GFSK_RX_BW_93_8 0x13
254 #define RADIOLIB_SX126X_GFSK_RX_BW_117_3 0x0B
255 #define RADIOLIB_SX126X_GFSK_RX_BW_156_2 0x1A
256 #define RADIOLIB_SX126X_GFSK_RX_BW_187_2 0x12
257 #define RADIOLIB_SX126X_GFSK_RX_BW_234_3 0x0A
258 #define RADIOLIB_SX126X_GFSK_RX_BW_312_0 0x19
259 #define RADIOLIB_SX126X_GFSK_RX_BW_373_6 0x11
260 #define RADIOLIB_SX126X_GFSK_RX_BW_467_0 0x09
261 #define RADIOLIB_SX126X_LORA_BW_7_8 0x00
262 #define RADIOLIB_SX126X_LORA_BW_10_4 0x08
263 #define RADIOLIB_SX126X_LORA_BW_15_6 0x01
264 #define RADIOLIB_SX126X_LORA_BW_20_8 0x09
265 #define RADIOLIB_SX126X_LORA_BW_31_25 0x02
266 #define RADIOLIB_SX126X_LORA_BW_41_7 0x0A
267 #define RADIOLIB_SX126X_LORA_BW_62_5 0x03
268 #define RADIOLIB_SX126X_LORA_BW_125_0 0x04
269 #define RADIOLIB_SX126X_LORA_BW_250_0 0x05
270 #define RADIOLIB_SX126X_LORA_BW_500_0 0x06
271 #define RADIOLIB_SX126X_LORA_CR_4_5 0x01
272 #define RADIOLIB_SX126X_LORA_CR_4_6 0x02
273 #define RADIOLIB_SX126X_LORA_CR_4_7 0x03
274 #define RADIOLIB_SX126X_LORA_CR_4_8 0x04
275 #define RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF 0x00
276 #define RADIOLIB_SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON 0x01
279 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_OFF 0x00
280 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_8 0x04
281 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_16 0x05
282 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_24 0x06
283 #define RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_32 0x07
284 #define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_OFF 0x00
285 #define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE 0x01
286 #define RADIOLIB_SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST 0x02
287 #define RADIOLIB_SX126X_GFSK_PACKET_FIXED 0x00
288 #define RADIOLIB_SX126X_GFSK_PACKET_VARIABLE 0x01
289 #define RADIOLIB_SX126X_GFSK_CRC_OFF 0x01
290 #define RADIOLIB_SX126X_GFSK_CRC_1_BYTE 0x00
291 #define RADIOLIB_SX126X_GFSK_CRC_2_BYTE 0x02
292 #define RADIOLIB_SX126X_GFSK_CRC_1_BYTE_INV 0x04
293 #define RADIOLIB_SX126X_GFSK_CRC_2_BYTE_INV 0x06
294 #define RADIOLIB_SX126X_GFSK_WHITENING_OFF 0x00
295 #define RADIOLIB_SX126X_GFSK_WHITENING_ON 0x01
296 #define RADIOLIB_SX126X_LORA_HEADER_EXPLICIT 0x00
297 #define RADIOLIB_SX126X_LORA_HEADER_IMPLICIT 0x01
298 #define RADIOLIB_SX126X_LORA_CRC_OFF 0x00
299 #define RADIOLIB_SX126X_LORA_CRC_ON 0x01
300 #define RADIOLIB_SX126X_LORA_IQ_STANDARD 0x00
301 #define RADIOLIB_SX126X_LORA_IQ_INVERTED 0x01
304 #define RADIOLIB_SX126X_CAD_ON_1_SYMB 0x00
305 #define RADIOLIB_SX126X_CAD_ON_2_SYMB 0x01
306 #define RADIOLIB_SX126X_CAD_ON_4_SYMB 0x02
307 #define RADIOLIB_SX126X_CAD_ON_8_SYMB 0x03
308 #define RADIOLIB_SX126X_CAD_ON_16_SYMB 0x04
309 #define RADIOLIB_SX126X_CAD_GOTO_STDBY 0x00
310 #define RADIOLIB_SX126X_CAD_GOTO_RX 0x01
311 #define RADIOLIB_SX126X_CAD_PARAM_DEFAULT 0xFF
312 #define RADIOLIB_SX126X_CAD_PARAM_DET_MIN 10
315 #define RADIOLIB_SX126X_STATUS_MODE_STDBY_RC 0b00100000
316 #define RADIOLIB_SX126X_STATUS_MODE_STDBY_XOSC 0b00110000
317 #define RADIOLIB_SX126X_STATUS_MODE_FS 0b01000000
318 #define RADIOLIB_SX126X_STATUS_MODE_RX 0b01010000
319 #define RADIOLIB_SX126X_STATUS_MODE_TX 0b01100000
320 #define RADIOLIB_SX126X_STATUS_DATA_AVAILABLE 0b00000100
321 #define RADIOLIB_SX126X_STATUS_CMD_TIMEOUT 0b00000110
322 #define RADIOLIB_SX126X_STATUS_CMD_INVALID 0b00001000
323 #define RADIOLIB_SX126X_STATUS_CMD_FAILED 0b00001010
324 #define RADIOLIB_SX126X_STATUS_TX_DONE 0b00001100
325 #define RADIOLIB_SX126X_STATUS_SPI_FAILED 0b11111111
328 #define RADIOLIB_SX126X_GFSK_RX_STATUS_PREAMBLE_ERR 0b10000000
329 #define RADIOLIB_SX126X_GFSK_RX_STATUS_SYNC_ERR 0b01000000
330 #define RADIOLIB_SX126X_GFSK_RX_STATUS_ADRS_ERR 0b00100000
331 #define RADIOLIB_SX126X_GFSK_RX_STATUS_CRC_ERR 0b00010000
332 #define RADIOLIB_SX126X_GFSK_RX_STATUS_LENGTH_ERR 0b00001000
333 #define RADIOLIB_SX126X_GFSK_RX_STATUS_ABORT_ERR 0b00000100
334 #define RADIOLIB_SX126X_GFSK_RX_STATUS_PACKET_RECEIVED 0b00000010
335 #define RADIOLIB_SX126X_GFSK_RX_STATUS_PACKET_SENT 0b00000001
338 #define RADIOLIB_SX126X_PA_RAMP_ERR 0b100000000
339 #define RADIOLIB_SX126X_PLL_LOCK_ERR 0b001000000
340 #define RADIOLIB_SX126X_XOSC_START_ERR 0b000100000
341 #define RADIOLIB_SX126X_IMG_CALIB_ERR 0b000010000
342 #define RADIOLIB_SX126X_ADC_CALIB_ERR 0b000001000
343 #define RADIOLIB_SX126X_PLL_CALIB_ERR 0b000000100
344 #define RADIOLIB_SX126X_RC13M_CALIB_ERR 0b000000010
345 #define RADIOLIB_SX126X_RC64K_CALIB_ERR 0b000000001
350 #define RADIOLIB_SX126X_HOPPING_ENABLED 0b00000001
351 #define RADIOLIB_SX126X_HOPPING_DISABLED 0b00000000
354 #define RADIOLIB_SX126X_SYNC_WORD_PUBLIC 0x34
355 #define RADIOLIB_SX126X_SYNC_WORD_PRIVATE 0x12
398 int16_t
begin(uint8_t cr, uint8_t syncWord, uint16_t preambleLength,
float tcxoVoltage,
bool useRegulatorLDO =
false);
417 int16_t
beginFSK(
float br,
float freqDev,
float rxBw, uint16_t preambleLength,
float tcxoVoltage,
bool useRegulatorLDO =
false);
427 int16_t
reset(
bool verify =
true);
441 int16_t
transmit(uint8_t* data,
size_t len, uint8_t addr = 0)
override;
453 int16_t
receive(uint8_t* data,
size_t len)
override;
483 int16_t
scanChannel(uint8_t symbolNum = RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detPeak = RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detMin = RADIOLIB_SX126X_CAD_PARAM_DEFAULT);
492 int16_t
sleep(
bool retainConfig =
true);
536 int16_t
startTransmit(uint8_t* data,
size_t len, uint8_t addr = 0)
override;
553 int16_t
startReceive(uint32_t timeout = RADIOLIB_SX126X_RX_TIMEOUT_INF);
597 int16_t
readData(uint8_t* data,
size_t len)
override;
610 int16_t
startChannelScan(uint8_t symbolNum = RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detPeak = RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detMin = RADIOLIB_SX126X_CAD_PARAM_DEFAULT);
657 int16_t
setSyncWord(uint8_t syncWord, uint8_t controlBits = 0x44);
731 int16_t
setSyncWord(uint8_t* syncWord, uint8_t len);
742 int16_t
setSyncBits(uint8_t *syncWord, uint8_t bitsLen);
782 int16_t
setCRC(uint8_t len, uint16_t initial = 0x1D0F, uint16_t polynomial = 0x1021,
bool inverted =
true);
793 int16_t
setWhitening(
bool enabled, uint16_t initial = 0x0100);
805 int16_t
setTCXO(
float voltage, uint32_t delay = 5000);
959 #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE)
972 void readBit(RADIOLIB_PIN_TYPE pin);
976 #if !defined(RADIOLIB_GODMODE)
980 int16_t setTx(uint32_t timeout = 0);
981 int16_t setRx(uint32_t timeout);
982 int16_t setCad(uint8_t symbolNum, uint8_t detPeak, uint8_t detMin);
983 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);
984 int16_t writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes);
985 int16_t readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes);
986 int16_t writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00);
987 int16_t readBuffer(uint8_t* data, uint8_t numBytes);
988 int16_t setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask = RADIOLIB_SX126X_IRQ_NONE, uint16_t dio3Mask = RADIOLIB_SX126X_IRQ_NONE);
989 int16_t clearIrqStatus(uint16_t clearIrqParams = RADIOLIB_SX126X_IRQ_ALL);
990 int16_t setRfFrequency(uint32_t frf);
991 int16_t calibrateImage(uint8_t* data);
992 uint8_t getPacketType();
993 int16_t setTxParams(uint8_t power, uint8_t rampTime = RADIOLIB_SX126X_PA_RAMP_200U);
994 int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro);
995 int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev);
996 int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength, uint8_t headerType, uint8_t invertIQ = RADIOLIB_SX126X_LORA_IQ_STANDARD);
997 int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t packetType = RADIOLIB_SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLength = 0xFF, uint8_t preambleDetectorLength = RADIOLIB_SX126X_GFSK_PREAMBLE_DETECT_16);
998 int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00);
999 int16_t setRegulatorMode(uint8_t mode);
1000 uint8_t getStatus();
1001 uint32_t getPacketStatus();
1002 uint16_t getDeviceErrors();
1003 int16_t clearDeviceErrors();
1005 int16_t startReceiveCommon(uint32_t timeout = RADIOLIB_SX126X_RX_TIMEOUT_INF);
1006 int16_t setFrequencyRaw(
float freq);
1007 int16_t setPacketMode(uint8_t mode, uint8_t len);
1008 int16_t setHeaderType(uint8_t headerType,
size_t len = 0xFF);
1011 int16_t fixSensitivity();
1012 int16_t fixPaClamping();
1013 int16_t fixImplicitTimeout();
1014 int16_t fixInvertedIQ(uint8_t iqConfig);
1016 #if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL)
1022 int16_t SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes,
bool waitForBusy =
true,
bool verify =
true);
1023 int16_t SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes,
bool waitForBusy =
true,
bool verify =
true);
1024 int16_t SPIreadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes,
bool waitForBusy =
true,
bool verify =
true);
1025 int16_t SPIreadCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes,
bool waitForBusy =
true,
bool verify =
true);
1026 int16_t SPItransfer(uint8_t* cmd, uint8_t cmdLen,
bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes,
bool waitForBusy, uint32_t timeout = 5000);
1028 #if !defined(RADIOLIB_GODMODE)
1032 uint8_t _bw = 0, _sf = 0, _cr = 0, _ldro = 0, _crcType = 0, _headerType = 0;
1033 uint16_t _preambleLength = 0;
1035 bool _ldroAuto =
true;
1037 uint32_t _br = 0, _freqDev = 0;
1038 uint8_t _rxBw = 0, _pulseShape = 0, _crcTypeFSK = 0, _syncWordLength = 0, _addrComp = 0, _whitening = 0, _packetType = 0;
1039 uint16_t _preambleLengthFSK = 0;
1042 float _dataRate = 0;
1044 uint32_t _tcxoDelay = 0;
1046 size_t _implicitLen = 0;
1050 int16_t config(uint8_t modem);
1051 int16_t checkCommandResult();
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:16
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:14
int16_t transmit(__FlashStringHelper *fstr, uint8_t addr=0)
Arduino Flash String transmit method.
Definition: PhysicalLayer.cpp:12
int16_t readData(String &str, size_t len=0)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:61
int16_t startTransmit(String &str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:53
int16_t receive(String &str, size_t len=0)
Arduino String receive method.
Definition: PhysicalLayer.cpp:104
Base class for SX126x series. All derived classes for SX126x (e.g. SX1262 or SX1268) inherit from thi...
Definition: SX126x.h:364
void setDio1Action(void(*func)(void))
Sets interrupt service routine to call when DIO1 activates.
Definition: SX126x.cpp:366
float getRSSI()
Gets RSSI (Recorded Signal Strength Indicator) of the last received packet.
Definition: SX126x.cpp:1098
int16_t startChannelScan(uint8_t symbolNum=RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detPeak=RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detMin=RADIOLIB_SX126X_CAD_PARAM_DEFAULT)
Interrupt-driven channel activity detection method. DIO0 will be activated when LoRa preamble is dete...
Definition: SX126x.cpp:592
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:873
int16_t setRegulatorLDO()
Set regulator mode to LDO.
Definition: SX126x.cpp:1186
void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn)
Some modules contain external RF switch controlled by two pins. This function gives RadioLib control ...
Definition: SX126x.cpp:1198
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:1194
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:78
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:639
int16_t explicitHeader()
Set explicit header mode for future reception/transmission.
Definition: SX126x.cpp:1182
int16_t forceLDRO(bool enable)
Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method,...
Definition: SX126x.cpp:1202
int16_t setNodeAddress(uint8_t nodeAddr)
Sets node address. Calling this method will also enable address filtering for node address only.
Definition: SX126x.cpp:953
int16_t setTCXO(float voltage, uint32_t delay=5000)
Sets TCXO (Temperature Compensated Crystal Oscillator) configuration.
Definition: SX126x.cpp:1262
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:810
int16_t setRegulatorDCDC()
Set regulator mode to DC-DC.
Definition: SX126x.cpp:1190
int16_t setWhitening(bool enabled, uint16_t initial=0x0100)
Sets FSK whitening parameters.
Definition: SX126x.cpp:1057
void clearDio1Action()
Clears interrupt service routine to call when DIO1 activates.
Definition: SX126x.cpp:370
int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength=0, uint16_t minSymbols=8)
Calls startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages...
Definition: SX126x.cpp:483
int16_t scanChannel(uint8_t symbolNum=RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detPeak=RADIOLIB_SX126X_CAD_PARAM_DEFAULT, uint8_t detMin=RADIOLIB_SX126X_CAD_PARAM_DEFAULT)
Performs scan for LoRa transmission in the current channel. Detects both preamble and payload.
Definition: SX126x.cpp:324
int16_t standby() override
Sets the module to standby mode (overload for PhysicalLayer compatibility, uses 13 MHz RC oscillator)...
Definition: SX126x.cpp:354
int16_t setFrequencyDeviation(float freqDev) override
Sets FSK frequency deviation. Allowed values range from 0.0 to 200.0 kHz.
Definition: SX126x.cpp:762
int16_t setBitRate(float br)
Sets FSK bit rate. Allowed values range from 0.6 to 300.0 kbps.
Definition: SX126x.cpp:789
uint32_t getTimeOnAir(size_t len)
Get expected time-on-air for a given size of payload.
Definition: SX126x.cpp:1136
uint8_t randomByte()
Get one truly random byte from RSSI noise.
Definition: SX126x.cpp:1223
int16_t receiveDirect() override
Starts direct mode reception. Only implemented for PhysicalLayer compatibility, as SX126x series does...
Definition: SX126x.cpp:316
int16_t finishTransmit() override
Clean up after transmission is done.
Definition: SX126x.cpp:435
int16_t setCurrentLimit(float currentLimit)
Sets current protection limit. Can be set in 2.5 mA steps.
Definition: SX126x.cpp:727
int16_t transmitDirect(uint32_t frf=0) override
Starts direct mode transmission.
Definition: SX126x.cpp:300
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:1132
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:12
int16_t setCRC(uint8_t len, uint16_t initial=0x1D0F, uint16_t polynomial=0x1021, bool inverted=true)
Sets CRC configuration.
Definition: SX126x.cpp:998
uint16_t getIrqStatus()
Reads the current IRQ status.
Definition: SX126x.cpp:1411
int16_t reset(bool verify=true)
Reset method. Will reset the chip to the default state using RST pin.
Definition: SX126x.cpp:159
int16_t setSyncWord(uint8_t syncWord, uint8_t controlBits=0x44)
Sets LoRa sync word.
Definition: SX126x.cpp:716
float getCurrentLimit()
Reads current protection limit.
Definition: SX126x.cpp:740
SX126x(Module *mod)
Default constructor.
Definition: SX126x.cpp:4
int16_t setPreambleLength(uint16_t preambleLength)
Sets preamble length for LoRa or FSK modem. Allowed values range from 1 to 65535.
Definition: SX126x.cpp:749
int16_t transmit(__FlashStringHelper *fstr, uint8_t addr=0)
Arduino Flash String transmit method.
Definition: PhysicalLayer.cpp:12
int16_t autoLDRO()
Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method,...
Definition: SX126x.cpp:1214
void setDirectAction(void(*func)(void))
Dummy method, to ensure PhysicalLayer compatibility.
Definition: SX126x.cpp:1249
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:1128
int16_t setBroadcastAddress(uint8_t broadAddr)
Sets broadcast address. Calling this method will also enable address filtering for node and broadcast...
Definition: SX126x.cpp:970
int16_t getChannelScanResult()
Read the channel scan result.
Definition: SX126x.cpp:618
size_t getPacketLength(bool update=true) override
Query modem for the packet length of received payload.
Definition: SX126x.cpp:1121
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:926
int16_t getLastError()
Get the last recorded transaction error.
Definition: SX126x.cpp:1244
float getDataRate() const
Gets effective data rate for the last transmitted packet. The value is calculated only for payload by...
Definition: SX126x.cpp:1094
int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod)
Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen....
Definition: SX126x.cpp:456
int16_t implicitHeader(size_t len)
Set implicit header mode for future reception/transmission.
Definition: SX126x.cpp:1178
float getRSSIInst()
Get instantaneous RSSI value during recption of the packet. Should switch to FSK receive mode for LBT...
Definition: SX126x.cpp:1171
float getSNR()
Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa modem.
Definition: SX126x.cpp:1105
int16_t setDio2AsRfSwitch(bool enable=true)
Set DIO2 to function as RF switch (default in Semtech example designs).
Definition: SX126x.cpp:1310
int16_t setSpreadingFactor(uint8_t sf)
Sets LoRa spreading factor. Allowed values range from 5 to 12.
Definition: SX126x.cpp:690
int16_t readData(String &str, size_t len=0)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:61
int16_t startReceive(uint32_t timeout=RADIOLIB_SX126X_RX_TIMEOUT_INF)
Interrupt-driven receive method. DIO1 will be activated when full packet is received.
Definition: SX126x.cpp:443
int16_t startTransmit(String &str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:53
int16_t receive(String &str, size_t len=0)
Arduino String receive method.
Definition: PhysicalLayer.cpp:104
int16_t sleep(bool retainConfig=true)
Sets the module to sleep mode.
Definition: SX126x.cpp:338
int16_t disableAddressFiltering()
Disables address filtering. Calling this method will also erase previously set addresses.
Definition: SX126x.cpp:987
int16_t setCodingRate(uint8_t cr)
Sets LoRa coding rate denominator. Allowed values range from 5 to 8.
Definition: SX126x.cpp:703
void readBit(RADIOLIB_PIN_TYPE pin)
Dummy method, to ensure PhysicalLayer compatibility.
Definition: SX126x.cpp:1255
#define RADIOLIB_ERR_NONE
No error, method executed successfully.
Definition: TypeDef.h:77