RadioLib
Universal wireless communication library for Arduino
RF69.h
1 #if !defined(_RADIOLIB_RF69_H)
2 #define _RADIOLIB_RF69_H
3 
4 #include "../../TypeDef.h"
5 
6 #if !defined(RADIOLIB_EXCLUDE_RF69)
7 
8 #include "../../Module.h"
9 
10 #include "../../protocols/PhysicalLayer/PhysicalLayer.h"
11 
12 // RF69 physical layer properties
13 #define RF69_FREQUENCY_STEP_SIZE 61.03515625
14 #define RF69_MAX_PACKET_LENGTH 64
15 #define RF69_CRYSTAL_FREQ 32.0
16 #define RF69_DIV_EXPONENT 19
17 
18 // RF69 register map
19 #define RF69_REG_FIFO 0x00
20 #define RF69_REG_OP_MODE 0x01
21 #define RF69_REG_DATA_MODUL 0x02
22 #define RF69_REG_BITRATE_MSB 0x03
23 #define RF69_REG_BITRATE_LSB 0x04
24 #define RF69_REG_FDEV_MSB 0x05
25 #define RF69_REG_FDEV_LSB 0x06
26 #define RF69_REG_FRF_MSB 0x07
27 #define RF69_REG_FRF_MID 0x08
28 #define RF69_REG_FRF_LSB 0x09
29 #define RF69_REG_OSC_1 0x0A
30 #define RF69_REG_AFC_CTRL 0x0B
31 #define RF69_REG_LISTEN_1 0x0D
32 #define RF69_REG_LISTEN_2 0x0E
33 #define RF69_REG_LISTEN_3 0x0F
34 #define RF69_REG_VERSION 0x10
35 #define RF69_REG_PA_LEVEL 0x11
36 #define RF69_REG_PA_RAMP 0x12
37 #define RF69_REG_OCP 0x13
38 #define RF69_REG_LNA 0x18
39 #define RF69_REG_RX_BW 0x19
40 #define RF69_REG_AFC_BW 0x1A
41 #define RF69_REG_OOK_PEAK 0x1B
42 #define RF69_REG_OOK_AVG 0x1C
43 #define RF69_REG_OOK_FIX 0x1D
44 #define RF69_REG_AFC_FEI 0x1E
45 #define RF69_REG_AFC_MSB 0x1F
46 #define RF69_REG_AFC_LSB 0x20
47 #define RF69_REG_FEI_MSB 0x21
48 #define RF69_REG_FEI_LSB 0x22
49 #define RF69_REG_RSSI_CONFIG 0x23
50 #define RF69_REG_RSSI_VALUE 0x24
51 #define RF69_REG_DIO_MAPPING_1 0x25
52 #define RF69_REG_DIO_MAPPING_2 0x26
53 #define RF69_REG_IRQ_FLAGS_1 0x27
54 #define RF69_REG_IRQ_FLAGS_2 0x28
55 #define RF69_REG_RSSI_THRESH 0x29
56 #define RF69_REG_RX_TIMEOUT_1 0x2A
57 #define RF69_REG_RX_TIMEOUT_2 0x2B
58 #define RF69_REG_PREAMBLE_MSB 0x2C
59 #define RF69_REG_PREAMBLE_LSB 0x2D
60 #define RF69_REG_SYNC_CONFIG 0x2E
61 #define RF69_REG_SYNC_VALUE_1 0x2F
62 #define RF69_REG_SYNC_VALUE_2 0x30
63 #define RF69_REG_SYNC_VALUE_3 0x31
64 #define RF69_REG_SYNC_VALUE_4 0x32
65 #define RF69_REG_SYNC_VALUE_5 0x33
66 #define RF69_REG_SYNC_VALUE_6 0x34
67 #define RF69_REG_SYNC_VALUE_7 0x35
68 #define RF69_REG_SYNC_VALUE_8 0x36
69 #define RF69_REG_PACKET_CONFIG_1 0x37
70 #define RF69_REG_PAYLOAD_LENGTH 0x38
71 #define RF69_REG_NODE_ADRS 0x39
72 #define RF69_REG_BROADCAST_ADRS 0x3A
73 #define RF69_REG_AUTO_MODES 0x3B
74 #define RF69_REG_FIFO_THRESH 0x3C
75 #define RF69_REG_PACKET_CONFIG_2 0x3D
76 #define RF69_REG_AES_KEY_1 0x3E
77 #define RF69_REG_AES_KEY_2 0x3F
78 #define RF69_REG_AES_KEY_3 0x40
79 #define RF69_REG_AES_KEY_4 0x41
80 #define RF69_REG_AES_KEY_5 0x42
81 #define RF69_REG_AES_KEY_6 0x43
82 #define RF69_REG_AES_KEY_7 0x44
83 #define RF69_REG_AES_KEY_8 0x45
84 #define RF69_REG_AES_KEY_9 0x46
85 #define RF69_REG_AES_KEY_10 0x47
86 #define RF69_REG_AES_KEY_11 0x48
87 #define RF69_REG_AES_KEY_12 0x49
88 #define RF69_REG_AES_KEY_13 0x4A
89 #define RF69_REG_AES_KEY_14 0x4B
90 #define RF69_REG_AES_KEY_15 0x4C
91 #define RF69_REG_AES_KEY_16 0x4D
92 #define RF69_REG_TEMP_1 0x4E
93 #define RF69_REG_TEMP_2 0x4F
94 #define RF69_REG_TEST_PA1 0x5A
95 #define RF69_REG_TEST_PA2 0x5C
96 #define RF69_REG_TEST_DAGC 0x6F
97 
98 // RF69 modem settings
99 // RF69_REG_OP_MODE MSB LSB DESCRIPTION
100 #define RF69_SEQUENCER_OFF 0b00000000 // 7 7 disable automatic sequencer
101 #define RF69_SEQUENCER_ON 0b10000000 // 7 7 enable automatic sequencer
102 #define RF69_LISTEN_OFF 0b00000000 // 6 6 disable Listen mode
103 #define RF69_LISTEN_ON 0b01000000 // 6 6 enable Listen mode
104 #define RF69_LISTEN_ABORT 0b00100000 // 5 5 abort Listen mode (has to be set together with RF69_LISTEN_OFF)
105 #define RF69_SLEEP 0b00000000 // 4 2 sleep
106 #define RF69_STANDBY 0b00000100 // 4 2 standby
107 #define RF69_FS 0b00001000 // 4 2 frequency synthesis
108 #define RF69_TX 0b00001100 // 4 2 transmit
109 #define RF69_RX 0b00010000 // 4 2 receive
110 
111 // RF69_REG_DATA_MODUL
112 #define RF69_PACKET_MODE 0b00000000 // 6 5 packet mode (default)
113 #define RF69_CONTINUOUS_MODE_WITH_SYNC 0b01000000 // 6 5 continuous mode with bit synchronizer
114 #define RF69_CONTINUOUS_MODE 0b01100000 // 6 5 continuous mode without bit synchronizer
115 #define RF69_FSK 0b00000000 // 4 3 modulation: FSK (default)
116 #define RF69_OOK 0b00001000 // 4 3 OOK
117 #define RF69_NO_SHAPING 0b00000000 // 1 0 modulation shaping: no shaping (default)
118 #define RF69_FSK_GAUSSIAN_1_0 0b00000001 // 1 0 FSK modulation Gaussian filter, BT = 1.0
119 #define RF69_FSK_GAUSSIAN_0_5 0b00000010 // 1 0 FSK modulation Gaussian filter, BT = 0.5
120 #define RF69_FSK_GAUSSIAN_0_3 0b00000011 // 1 0 FSK modulation Gaussian filter, BT = 0.3
121 #define RF69_OOK_FILTER_BR 0b00000001 // 1 0 OOK modulation filter, f_cutoff = BR
122 #define RF69_OOK_FILTER_2BR 0b00000010 // 1 0 OOK modulation filter, f_cutoff = 2*BR
123 
124 // RF69_REG_BITRATE_MSB + REG_BITRATE_LSB
125 #define RF69_BITRATE_MSB 0x1A // 7 0 bit rate setting: rate = F(XOSC) / BITRATE
126 #define RF69_BITRATE_LSB 0x0B // 7 0 default value: 4.8 kbps 0x40 // 7 0
127 
128 // RF69_REG_FDEV_MSB + REG_FDEV_LSB
129 #define RF69_FDEV_MSB 0x00 // 5 0 frequency deviation: f_dev = f_step * FDEV
130 #define RF69_FDEV_LSB 0x52 // 7 0 default value: 5 kHz
131 
132 // RF69_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB
133 #define RF69_FRF_MSB 0xE4 // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19
134 #define RF69_FRF_MID 0xC0 // 7 0 where F(XOSC) = 32 MHz
135 #define RF69_FRF_LSB 0x00 // 7 0 default value: 915 MHz
136 
137 // RF69_REG_OSC_1
138 #define RF69_RC_CAL_START 0b10000000 // 7 7 force RC oscillator calibration
139 #define RF69_RC_CAL_RUNNING 0b00000000 // 6 6 RC oscillator calibration is still running
140 #define RF69_RC_CAL_DONE 0b00000000 // 5 5 RC oscillator calibration has finished
141 
142 // RF69_REG_AFC_CTRL
143 #define RF69_AFC_LOW_BETA_OFF 0b00000000 // 5 5 standard AFC routine
144 #define RF69_AFC_LOW_BETA_ON 0b00100000 // 5 5 improved AFC routine for signals with modulation index less than 2
145 
146 // RF69_REG_LISTEN_1
147 #define RF69_LISTEN_RES_IDLE_64_US 0b01000000 // 7 6 resolution of Listen mode idle time: 64 us
148 #define RF69_LISTEN_RES_IDLE_4_1_MS 0b10000000 // 7 6 4.1 ms (default)
149 #define RF69_LISTEN_RES_IDLE_262_MS 0b11000000 // 7 6 262 ms
150 #define RF69_LISTEN_RES_RX_64_US 0b00010000 // 5 4 resolution of Listen mode rx time: 64 us (default)
151 #define RF69_LISTEN_RES_RX_4_1_MS 0b00100000 // 5 4 4.1 ms
152 #define RF69_LISTEN_RES_RX_262_MS 0b00110000 // 5 4 262 ms
153 #define RF69_LISTEN_ACCEPT_ABOVE_RSSI_THRESH 0b00000000 // 3 3 packet acceptance criteria: RSSI above threshold
154 #define RF69_LISTEN_ACCEPT_MATCH_SYNC_ADDRESS 0b00001000 // 3 3 RSSI above threshold AND sync address matched
155 #define RF69_LISTEN_END_KEEP_RX 0b00000000 // 2 1 action after packet acceptance: stay in Rx mode
156 #define RF69_LISTEN_END_KEEP_RX_TIMEOUT 0b00000010 // 2 1 stay in Rx mode until timeout (default)
157 #define RF69_LISTEN_END_KEEP_RX_TIMEOUT_RESUME 0b00000100 // 2 1 stay in Rx mode until timeout, Listen mode will resume
158 
159 // RF69_REG_LISTEN_2
160 #define RF69_LISTEN_COEF_IDLE 0xF5 // 7 0 duration of idle phase in Listen mode
161 
162 // RF69_REG_LISTEN_3
163 #define RF69_LISTEN_COEF_RX 0x20 // 7 0 duration of Rx phase in Listen mode
164 
165 // RF69_REG_VERSION
166 #define RF69_CHIP_VERSION 0x24 // 7 0
167 
168 // RF69_REG_PA_LEVEL
169 #define RF69_PA0_OFF 0b00000000 // 7 7 PA0 disabled
170 #define RF69_PA0_ON 0b10000000 // 7 7 PA0 enabled (default)
171 #define RF69_PA1_OFF 0b00000000 // 6 6 PA1 disabled (default)
172 #define RF69_PA1_ON 0b01000000 // 6 6 PA1 enabled
173 #define RF69_PA2_OFF 0b00000000 // 5 5 PA2 disabled (default)
174 #define RF69_PA2_ON 0b00100000 // 5 5 PA2 enabled
175 #define RF69_OUTPUT_POWER 0b00011111 // 4 0 output power: P_out = -18 + OUTPUT_POWER
176 
177 // RF69_REG_PA_RAMP
178 #define RF69_PA_RAMP_3_4_MS 0b00000000 // 3 0 PA ramp rise/fall time: 3.4 ms
179 #define RF69_PA_RAMP_2_MS 0b00000001 // 3 0 2 ms
180 #define RF69_PA_RAMP_1_MS 0b00000010 // 3 0 1 ms
181 #define RF69_PA_RAMP_500_US 0b00000011 // 3 0 500 us
182 #define RF69_PA_RAMP_250_US 0b00000100 // 3 0 250 us
183 #define RF69_PA_RAMP_125_US 0b00000101 // 3 0 125 us
184 #define RF69_PA_RAMP_100_US 0b00000110 // 3 0 100 us
185 #define RF69_PA_RAMP_62_US 0b00000111 // 3 0 62 us
186 #define RF69_PA_RAMP_50_US 0b00001000 // 3 0 50 us
187 #define RF69_PA_RAMP_40_US 0b00001001 // 3 0 40 us (default)
188 #define RF69_PA_RAMP_31_US 0b00001010 // 3 0 31 us
189 #define RF69_PA_RAMP_25_US 0b00001011 // 3 0 25 us
190 #define RF69_PA_RAMP_20_US 0b00001100 // 3 0 20 us
191 #define RF69_PA_RAMP_15_US 0b00001101 // 3 0 15 us
192 #define RF69_PA_RAMP_12_US 0b00001110 // 3 0 12 us
193 #define RF69_PA_RAMP_10_US 0b00001111 // 3 0 10 us
194 
195 // RF69_REG_OCP
196 #define RF69_OCP_OFF 0b00000000 // 4 4 PA overload current protection disabled
197 #define RF69_OCP_ON 0b00010000 // 4 4 PA overload current protection enabled
198 #define RF69_OCP_TRIM 0b00001010 // 3 0 OCP current: I_max(OCP_TRIM = 0b1010) = 95 mA
199 
200 // RF69_REG_LNA
201 #define RF69_LNA_Z_IN_50_OHM 0b00000000 // 7 7 LNA input impedance: 50 ohm
202 #define RF69_LNA_Z_IN_200_OHM 0b10000000 // 7 7 200 ohm
203 #define RF69_LNA_CURRENT_GAIN 0b00001000 // 5 3 manually set LNA current gain
204 #define RF69_LNA_GAIN_AUTO 0b00000000 // 2 0 LNA gain setting: set automatically by AGC
205 #define RF69_LNA_GAIN_MAX 0b00000001 // 2 0 max gain
206 #define RF69_LNA_GAIN_MAX_6_DB 0b00000010 // 2 0 max gain - 6 dB
207 #define RF69_LNA_GAIN_MAX_12_DB 0b00000011 // 2 0 max gain - 12 dB
208 #define RF69_LNA_GAIN_MAX_24_DB 0b00000100 // 2 0 max gain - 24 dB
209 #define RF69_LNA_GAIN_MAX_36_DB 0b00000101 // 2 0 max gain - 36 dB
210 #define RF69_LNA_GAIN_MAX_48_DB 0b00000110 // 2 0 max gain - 48 dB
211 
212 // RF69_REG_RX_BW
213 #define RF69_DCC_FREQ 0b01000000 // 7 5 DC offset canceller cutoff frequency (4% Rx BW by default)
214 #define RF69_RX_BW_MANT_16 0b00000000 // 4 3 Channel filter bandwidth FSK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 2))
215 #define RF69_RX_BW_MANT_20 0b00001000 // 4 3 OOK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 3))
216 #define RF69_RX_BW_MANT_24 0b00010000 // 4 3
217 #define RF69_RX_BW_EXP 0b00000101 // 2 0 default RxBwExp value = 5
218 
219 // RF69_REG_AFC_BW
220 #define RF69_DCC_FREQ_AFC 0b10000000 // 7 5 default DccFreq parameter for AFC
221 #define RF69_DCC_RX_BW_MANT_AFC 0b00001000 // 4 3 default RxBwMant parameter for AFC
222 #define RF69_DCC_RX_BW_EXP_AFC 0b00000011 // 2 0 default RxBwExp parameter for AFC
223 
224 // RF69_REG_OOK_PEAK
225 #define RF69_OOK_THRESH_FIXED 0b00000000 // 7 6 OOK threshold type: fixed
226 #define RF69_OOK_THRESH_PEAK 0b01000000 // 7 6 peak (default)
227 #define RF69_OOK_THRESH_AVERAGE 0b10000000 // 7 6 average
228 #define RF69_OOK_PEAK_THRESH_STEP_0_5_DB 0b00000000 // 5 3 OOK demodulator step size: 0.5 dB (default)
229 #define RF69_OOK_PEAK_THRESH_STEP_1_0_DB 0b00001000 // 5 3 1.0 dB
230 #define RF69_OOK_PEAK_THRESH_STEP_1_5_DB 0b00010000 // 5 3 1.5 dB
231 #define RF69_OOK_PEAK_THRESH_STEP_2_0_DB 0b00011000 // 5 3 2.0 dB
232 #define RF69_OOK_PEAK_THRESH_STEP_3_0_DB 0b00100000 // 5 3 3.0 dB
233 #define RF69_OOK_PEAK_THRESH_STEP_4_0_DB 0b00101000 // 5 3 4.0 dB
234 #define RF69_OOK_PEAK_THRESH_STEP_5_0_DB 0b00110000 // 5 3 5.0 dB
235 #define RF69_OOK_PEAK_THRESH_STEP_6_0_DB 0b00111000 // 5 3 6.0 dB
236 #define RF69_OOK_PEAK_THRESH_DEC_1_1_CHIP 0b00000000 // 2 0 OOK demodulator step period: once per chip (default)
237 #define RF69_OOK_PEAK_THRESH_DEC_1_2_CHIP 0b00000001 // 2 0 once every 2 chips
238 #define RF69_OOK_PEAK_THRESH_DEC_1_4_CHIP 0b00000010 // 2 0 once every 4 chips
239 #define RF69_OOK_PEAK_THRESH_DEC_1_8_CHIP 0b00000011 // 2 0 once every 8 chips
240 #define RF69_OOK_PEAK_THRESH_DEC_2_1_CHIP 0b00000100 // 2 0 2 times per chip
241 #define RF69_OOK_PEAK_THRESH_DEC_4_1_CHIP 0b00000101 // 2 0 4 times per chip
242 #define RF69_OOK_PEAK_THRESH_DEC_8_1_CHIP 0b00000110 // 2 0 8 times per chip
243 #define RF69_OOK_PEAK_THRESH_DEC_16_1_CHIP 0b00000111 // 2 0 16 times per chip
244 
245 // RF69_REG_OOK_AVG
246 #define RF69_OOK_AVG_THRESH_FILT_32_PI 0b00000000 // 7 6 OOK average filter coefficient: chip rate / 32*pi
247 #define RF69_OOK_AVG_THRESH_FILT_8_PI 0b01000000 // 7 6 chip rate / 8*pi
248 #define RF69_OOK_AVG_THRESH_FILT_4_PI 0b10000000 // 7 6 chip rate / 4*pi (default)
249 #define RF69_OOK_AVG_THRESH_FILT_2_PI 0b11000000 // 7 6 chip rate / 2*pi
250 
251 // RF69_REG_OOK_FIX
252 #define RF69_OOK_FIXED_THRESH 0b00000110 // 7 0 default OOK fixed threshold (6 dB)
253 
254 // RF69_REG_AFC_FEI
255 #define RF69_FEI_RUNNING 0b00000000 // 6 6 FEI status: on-going
256 #define RF69_FEI_DONE 0b01000000 // 6 6 done
257 #define RF69_FEI_START 0b00100000 // 5 5 force new FEI measurement
258 #define RF69_AFC_RUNNING 0b00000000 // 4 4 AFC status: on-going
259 #define RF69_AFC_DONE 0b00010000 // 4 4 done
260 #define RF69_AFC_AUTOCLEAR_OFF 0b00000000 // 3 3 AFC register autoclear disabled
261 #define RF69_AFC_AUTOCLEAR_ON 0b00001000 // 3 3 AFC register autoclear enabled
262 #define RF69_AFC_AUTO_OFF 0b00000000 // 2 2 perform AFC only manually
263 #define RF69_AFC_AUTO_ON 0b00000100 // 2 2 perform AFC each time Rx mode is started
264 #define RF69_AFC_CLEAR 0b00000010 // 1 1 clear AFC register
265 #define RF69_AFC_START 0b00000001 // 0 0 start AFC
266 
267 // RF69_REG_RSSI_CONFIG
268 #define RF69_RSSI_RUNNING 0b00000000 // 1 1 RSSI status: on-going
269 #define RF69_RSSI_DONE 0b00000010 // 1 1 done
270 #define RF69_RSSI_START 0b00000001 // 0 0 start RSSI measurement
271 
272 // RF69_REG_DIO_MAPPING_1
273 #define RF69_DIO0_CONT_MODE_READY 0b11000000 // 7 6
274 #define RF69_DIO0_CONT_PLL_LOCK 0b00000000 // 7 6
275 #define RF69_DIO0_CONT_SYNC_ADDRESS 0b00000000 // 7 6
276 #define RF69_DIO0_CONT_TIMEOUT 0b01000000 // 7 6
277 #define RF69_DIO0_CONT_RSSI 0b10000000 // 7 6
278 #define RF69_DIO0_CONT_TX_READY 0b01000000 // 7 6
279 #define RF69_DIO0_PACK_PLL_LOCK 0b11000000 // 7 6
280 #define RF69_DIO0_PACK_CRC_OK 0b00000000 // 7 6
281 #define RF69_DIO0_PACK_PAYLOAD_READY 0b01000000 // 7 6
282 #define RF69_DIO0_PACK_SYNC_ADDRESS 0b10000000 // 7 6
283 #define RF69_DIO0_PACK_RSSI 0b11000000 // 7 6
284 #define RF69_DIO0_PACK_PACKET_SENT 0b00000000 // 7 6
285 #define RF69_DIO0_PACK_TX_READY 0b01000000 // 7 6
286 #define RF69_DIO1_CONT_PLL_LOCK 0b00110000 // 5 4
287 #define RF69_DIO1_CONT_DCLK 0b00000000 // 5 4
288 #define RF69_DIO1_CONT_RX_READY 0b00010000 // 5 4
289 #define RF69_DIO1_CONT_SYNC_ADDRESS 0b00110000 // 5 4
290 #define RF69_DIO1_CONT_TX_READY 0b00010000 // 5 4
291 #define RF69_DIO1_PACK_FIFO_LEVEL 0b00000000 // 5 4
292 #define RF69_DIO1_PACK_FIFO_FULL 0b00010000 // 5 4
293 #define RF69_DIO1_PACK_FIFO_NOT_EMPTY 0b00100000 // 5 4
294 #define RF69_DIO1_PACK_PLL_LOCK 0b00110000 // 5 4
295 #define RF69_DIO1_PACK_TIMEOUT 0b00110000 // 5 4
296 #define RF69_DIO2_CONT_DATA 0b00000000 // 3 2
297 
298 // RF69_REG_DIO_MAPPING_2
299 #define RF69_CLK_OUT_FXOSC 0b00000000 // 2 0 ClkOut frequency: F(XOSC)
300 #define RF69_CLK_OUT_FXOSC_2 0b00000001 // 2 0 F(XOSC) / 2
301 #define RF69_CLK_OUT_FXOSC_4 0b00000010 // 2 0 F(XOSC) / 4
302 #define RF69_CLK_OUT_FXOSC_8 0b00000011 // 2 0 F(XOSC) / 8
303 #define RF69_CLK_OUT_FXOSC_16 0b00000100 // 2 0 F(XOSC) / 16
304 #define RF69_CLK_OUT_FXOSC_32 0b00000101 // 2 0 F(XOSC) / 31
305 #define RF69_CLK_OUT_RC 0b00000110 // 2 0 RC
306 #define RF69_CLK_OUT_OFF 0b00000111 // 2 0 disabled (default)
307 
308 // RF69_REG_IRQ_FLAGS_1
309 #define RF69_IRQ_MODE_READY 0b10000000 // 7 7 requested mode was set
310 #define RF69_IRQ_RX_READY 0b01000000 // 6 6 Rx mode ready
311 #define RF69_IRQ_TX_READY 0b00100000 // 5 5 Tx mode ready
312 #define RF69_IRQ_PLL_LOCK 0b00010000 // 4 4 PLL is locked
313 #define RF69_IRQ_RSSI 0b00001000 // 3 3 RSSI value exceeded RssiThreshold
314 #define RF69_IRQ_TIMEOUT 0b00000100 // 2 2 timeout occurred
315 #define RF69_IRQ_AUTO_MODE 0b00000010 // 1 1 entered intermediate mode
316 #define RF69_SYNC_ADDRESS_MATCH 0b00000001 // 0 0 sync address detected
317 
318 // RF69_REG_IRQ_FLAGS_2
319 #define RF69_IRQ_FIFO_FULL 0b10000000 // 7 7 FIFO is full
320 #define RF69_IRQ_FIFO_NOT_EMPTY 0b01000000 // 6 6 FIFO contains at least 1 byte
321 #define RF69_IRQ_FIFO_LEVEL 0b00100000 // 5 5 FIFO contains more than FifoThreshold bytes
322 #define RF69_IRQ_FIFO_OVERRUN 0b00010000 // 4 4 FIFO overrun occurred
323 #define RF69_IRQ_PACKET_SENT 0b00001000 // 3 3 packet was sent
324 #define RF69_IRQ_PAYLOAD_READY 0b00000100 // 2 2 last payload byte received and CRC check passed
325 #define RF69_IRQ_CRC_OK 0b00000010 // 1 1 CRC check passed
326 
327 // RF69_REG_RSSI_THRESH
328 #define RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default)
329 
330 // RF69_REG_RX_TIMEOUT_1
331 #define RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default)
332 #define RF69_TIMEOUT_RX_START 0xFF // 7 0 timeout will occur if RSSI interrupt is not received
333 
334 // RF69_REG_RX_TIMEOUT_2
335 #define RF69_TIMEOUT_RSSI_THRESH_OFF 0x00 // 7 0 PayloadReady interrupt timeout disabled (default)
336 #define RF69_TIMEOUT_RSSI_THRESH 0xFF // 7 0 timeout will occur if PayloadReady interrupt is not received
337 
338 // RF69_REG_PREAMBLE_MSB + REG_PREAMBLE_MSB
339 #define RF69_PREAMBLE_MSB 0x00 // 7 0 2-byte preamble size value
340 #define RF69_PREAMBLE_LSB 0x03 // 7 0
341 
342 // RF69_REG_SYNC_CONFIG
343 #define RF69_SYNC_OFF 0b00000000 // 7 7 sync word detection off
344 #define RF69_SYNC_ON 0b10000000 // 7 7 sync word detection on (default)
345 #define RF69_FIFO_FILL_CONDITION_SYNC 0b00000000 // 6 6 FIFO fill condition: on SyncAddress interrupt (default)
346 #define RF69_FIFO_FILL_CONDITION 0b01000000 // 6 6 as long as the bit is set
347 #define RF69_SYNC_SIZE 0b00001000 // 5 3 size of sync word: SyncSize + 1 bytes
348 #define RF69_SYNC_TOL 0b00000000 // 2 0 number of tolerated errors in sync word
349 
350 // RF69_REG_SYNC_VALUE_1 - SYNC_VALUE_8
351 #define RF69_SYNC_BYTE_1 0x01 // 7 0 sync word: 1st byte (MSB)
352 #define RF69_SYNC_BYTE_2 0x01 // 7 0 2nd byte
353 #define RF69_SYNC_BYTE_3 0x01 // 7 0 3rd byte
354 #define RF69_SYNC_BYTE_4 0x01 // 7 0 4th byte
355 #define RF69_SYNC_BYTE_5 0x01 // 7 0 5th byte
356 #define RF69_SYNC_BYTE_6 0x01 // 7 0 6th byte
357 #define RF69_SYNC_BYTE_7 0x01 // 7 0 7th byte
358 #define RF69_SYNC_BYTE_8 0x01 // 7 0 8th byte (LSB)
359 
360 // RF69_REG_PACKET_CONFIG_1
361 #define RF69_PACKET_FORMAT_FIXED 0b00000000 // 7 7 fixed packet length (default)
362 #define RF69_PACKET_FORMAT_VARIABLE 0b10000000 // 7 7 variable packet length
363 #define RF69_DC_FREE_NONE 0b00000000 // 6 5 DC-free encoding: none (default)
364 #define RF69_DC_FREE_MANCHESTER 0b00100000 // 6 5 Manchester
365 #define RF69_DC_FREE_WHITENING 0b01000000 // 6 5 Whitening
366 #define RF69_CRC_OFF 0b00000000 // 4 4 CRC disabled
367 #define RF69_CRC_ON 0b00010000 // 4 4 CRC enabled (default)
368 #define RF69_CRC_AUTOCLEAR_ON 0b00000000 // 3 3 discard packet when CRC check fails (default)
369 #define RF69_CRC_AUTOCLEAR_OFF 0b00001000 // 3 3 keep packet when CRC check fails
370 #define RF69_ADDRESS_FILTERING_OFF 0b00000000 // 2 1 address filtering: none (default)
371 #define RF69_ADDRESS_FILTERING_NODE 0b00000010 // 2 1 node
372 #define RF69_ADDRESS_FILTERING_NODE_BROADCAST 0b00000100 // 2 1 node or broadcast
373 
374 // RF69_REG_PAYLOAD_LENGTH
375 #define RF69_PAYLOAD_LENGTH 0xFF // 7 0 payload length
376 
377 // RF69_REG_AUTO_MODES
378 #define RF69_ENTER_COND_NONE 0b00000000 // 7 5 condition for entering intermediate mode: none, AutoModes disabled (default)
379 #define RF69_ENTER_COND_FIFO_NOT_EMPTY 0b00100000 // 7 5 FifoNotEmpty rising edge
380 #define RF69_ENTER_COND_FIFO_LEVEL 0b01000000 // 7 5 FifoLevel rising edge
381 #define RF69_ENTER_COND_CRC_OK 0b01100000 // 7 5 CrcOk rising edge
382 #define RF69_ENTER_COND_PAYLOAD_READY 0b10000000 // 7 5 PayloadReady rising edge
383 #define RF69_ENTER_COND_SYNC_ADDRESS 0b10100000 // 7 5 SyncAddress rising edge
384 #define RF69_ENTER_COND_PACKET_SENT 0b11000000 // 7 5 PacketSent rising edge
385 #define RF69_ENTER_COND_FIFO_EMPTY 0b11100000 // 7 5 FifoNotEmpty falling edge
386 #define RF69_EXIT_COND_NONE 0b00000000 // 4 2 condition for exiting intermediate mode: none, AutoModes disabled (default)
387 #define RF69_EXIT_COND_FIFO_EMPTY 0b00100000 // 4 2 FifoNotEmpty falling edge
388 #define RF69_EXIT_COND_FIFO_LEVEL 0b01000000 // 4 2 FifoLevel rising edge
389 #define RF69_EXIT_COND_CRC_OK 0b01100000 // 4 2 CrcOk rising edge
390 #define RF69_EXIT_COND_PAYLOAD_READY 0b10000000 // 4 2 PayloadReady rising edge
391 #define RF69_EXIT_COND_SYNC_ADDRESS 0b10100000 // 4 2 SyncAddress rising edge
392 #define RF69_EXIT_COND_PACKET_SENT 0b11000000 // 4 2 PacketSent rising edge
393 #define RF69_EXIT_COND_TIMEOUT 0b11100000 // 4 2 timeout rising edge
394 #define RF69_INTER_MODE_SLEEP 0b00000000 // 1 0 intermediate mode: sleep (default)
395 #define RF69_INTER_MODE_STANDBY 0b00000001 // 1 0 standby
396 #define RF69_INTER_MODE_RX 0b00000010 // 1 0 Rx
397 #define RF69_INTER_MODE_TX 0b00000011 // 1 0 Tx
398 
399 // RF69_REG_FIFO_THRESH
400 #define RF69_TX_START_CONDITION_FIFO_LEVEL 0b00000000 // 7 7 packet transmission start condition: FifoLevel
401 #define RF69_TX_START_CONDITION_FIFO_NOT_EMPTY 0b10000000 // 7 7 FifoNotEmpty (default)
402 #define RF69_FIFO_THRESHOLD 0b00001111 // 6 0 default threshold to trigger FifoLevel interrupt
403 
404 // RF69_REG_PACKET_CONFIG_2
405 #define RF69_INTER_PACKET_RX_DELAY 0b00000000 // 7 4 delay between FIFO empty and start of new RSSI phase
406 #define RF69_RESTART_RX 0b00000100 // 2 2 force receiver into wait mode
407 #define RF69_AUTO_RX_RESTART_OFF 0b00000000 // 1 1 auto Rx restart disabled
408 #define RF69_AUTO_RX_RESTART_ON 0b00000010 // 1 1 auto Rx restart enabled (default)
409 #define RF69_AES_OFF 0b00000000 // 0 0 AES encryption disabled (default)
410 #define RF69_AES_ON 0b00000001 // 0 0 AES encryption enabled, payload size limited to 66 bytes
411 
412 // RF69_REG_TEMP_1
413 #define RF69_TEMP_MEAS_START 0b00001000 // 3 3 trigger temperature measurement
414 #define RF69_TEMP_MEAS_RUNNING 0b00000100 // 2 2 temperature measurement status: on-going
415 #define RF69_TEMP_MEAS_DONE 0b00000000 // 2 2 done
416 
417 // RF69_REG_TEST_DAGC
418 #define RF69_CONTINUOUS_DAGC_NORMAL 0x00 // 7 0 fading margin improvement: normal mode
419 #define RF69_CONTINUOUS_DAGC_LOW_BETA_ON 0x20 // 7 0 improved mode for AfcLowBetaOn
420 #define RF69_CONTINUOUS_DAGC_LOW_BETA_OFF 0x30 // 7 0 improved mode for AfcLowBetaOff (default)
421 
422 // RF69_REG_TEST_PA1
423 #define RF69_PA1_NORMAL 0x55 // 7 0 PA_BOOST: none
424 #define RF69_PA1_20_DBM 0x5D // 7 0 +20 dBm
425 
426 // RF69_REG_TEST_PA2
427 #define RF69_PA2_NORMAL 0x70 // 7 0 PA_BOOST: none
428 #define RF69_PA2_20_DBM 0x7C // 7 0 +20 dBm
429 
435 class RF69: public PhysicalLayer {
436  public:
437  // introduce PhysicalLayer overloads
442 
448  RF69(Module* module);
449 
450  // basic methods
451 
469  int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16);
470 
474  void reset();
475 
488  int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override;
489 
500  int16_t receive(uint8_t* data, size_t len) override;
501 
507  int16_t sleep();
508 
514  int16_t standby() override;
515 
523  int16_t transmitDirect(uint32_t frf = 0) override;
524 
530  int16_t receiveDirect() override;
531 
535  int16_t packetMode();
536 
537  // hardware AES support
538 
544  void setAESKey(uint8_t* key);
545 
551  int16_t enableAES();
552 
558  int16_t disableAES();
559 
560  // interrupt methods
561 
567  void setDio0Action(void (*func)(void));
568 
572  void clearDio0Action();
573 
579  void setDio1Action(void (*func)(void));
580 
584  void clearDio1Action();
585 
598  int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override;
599 
605  int16_t startReceive();
606 
616  int16_t readData(uint8_t* data, size_t len) override;
617 
618  // configuration methods
619 
627  int16_t setFrequency(float freq);
628 
636  int16_t setBitRate(float br);
637 
645  int16_t setRxBandwidth(float rxBw);
646 
654  int16_t setFrequencyDeviation(float freqDev) override;
655 
665  int16_t setOutputPower(int8_t power, bool highPower = false);
666 
676  int16_t setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits = 0);
677 
685  int16_t setPreambleLength(uint8_t preambleLen);
686 
694  int16_t setNodeAddress(uint8_t nodeAddr);
695 
703  int16_t setBroadcastAddress(uint8_t broadAddr);
704 
710  int16_t disableAddressFiltering();
711 
712  // measurement methods
713 
719  void setAmbientTemperature(int16_t tempAmbient);
720 
726  int16_t getTemperature();
727 
735  size_t getPacketLength(bool update = true) override;
736 
744  int16_t fixedPacketLengthMode(uint8_t len = RF69_MAX_PACKET_LENGTH);
745 
753  int16_t variablePacketLengthMode(uint8_t maxLen = RF69_MAX_PACKET_LENGTH);
754 
762  int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0);
763 
769  int16_t disableSyncWordFiltering();
770 
778  int16_t setCrcFiltering(bool crcOn = true);
779 
787  int16_t setPromiscuousMode(bool promiscuous = true);
788 
797  int16_t setDataShaping(uint8_t sh) override;
798 
807  int16_t setEncoding(uint8_t encoding) override;
808 
814  float getRSSI();
815 
824  void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn);
825 
831  uint8_t random();
832 
838  int16_t getChipVersion();
839 
840 #ifndef RADIOLIB_GODMODE
841  protected:
842 #endif
843  Module* _mod;
844 
845  float _br = 0;
846  float _rxBw = 0;
847  int16_t _tempOffset = 0;
848  int8_t _power = 0;
849 
850  size_t _packetLength = 0;
851  bool _packetLengthQueried = false;
852  uint8_t _packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE;
853 
854  bool _promiscuous = false;
855 
856  uint8_t _syncWordLength = 2;
857 
858  int16_t config();
859  int16_t directMode();
860  int16_t setPacketMode(uint8_t mode, uint8_t len);
861 
862 #ifndef RADIOLIB_GODMODE
863  private:
864 #endif
865  int16_t setMode(uint8_t mode);
866  void clearIRQFlags();
867 };
868 
869 #endif
870 
871 #endif
int16_t setFrequencyDeviation(float freqDev) override
Sets frequency deviation.
Definition: RF69.cpp:507
int16_t disableAddressFiltering()
Disables address filtering. Calling this method will also erase previously set addresses.
Definition: RF69.cpp:621
int16_t setSyncWord(uint8_t *syncWord, size_t len, uint8_t maxErrBits=0)
Sets sync word. Up to 8 bytes can be set as sync word.
Definition: RF69.cpp:569
int16_t setPromiscuousMode(bool promiscuous=true)
Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC).
Definition: RF69.cpp:701
int16_t standby() override
Sets the module to standby mode.
Definition: RF69.cpp:171
int16_t disableSyncWordFiltering()
Disable preamble and sync word filtering and generation.
Definition: RF69.cpp:681
size_t getPacketLength(bool update=true) override
Query modem for the packet length of received payload.
Definition: RF69.cpp:655
int16_t startTransmit(String &str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method, this one is non-blocking. Interrupt pin will be activated when transmission finishes.
Definition: PhysicalLayer.cpp:49
int16_t startReceive()
Interrupt-driven receive method. GDO0 will be activated when full packet is received.
Definition: RF69.cpp:241
int16_t setNodeAddress(uint8_t nodeAddr)
Sets node address. Calling this method will also enable address filtering for node address only...
Definition: RF69.cpp:603
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: RF69.cpp:769
int16_t setBitRate(float br)
Sets bit rate. Allowed values range from 1.2 to 300.0 kbps.
Definition: RF69.cpp:391
int16_t receive(uint8_t *data, size_t len) override
Blocking binary receive method. Overloads for string-based transmissions are implemented in PhysicalL...
Definition: RF69.cpp:139
void clearDio0Action()
Clears interrupt service routine to call when DIO0 activates.
Definition: RF69.cpp:273
void setAmbientTemperature(int16_t tempAmbient)
Sets ambient temperature. Required to correct values from on-board temperature sensor.
Definition: RF69.cpp:634
int16_t transmitDirect(uint32_t frf=0) override
Starts direct mode transmission.
Definition: RF69.cpp:179
int16_t setPreambleLength(uint8_t preambleLen)
Sets preamble length.
Definition: RF69.cpp:592
int16_t sleep()
Sets the module to sleep mode.
Definition: RF69.cpp:163
int16_t disableAES()
Disables AES encryption.
Definition: RF69.cpp:237
int16_t variablePacketLengthMode(uint8_t maxLen=RF69_MAX_PACKET_LENGTH)
Set modem in variable packet length mode.
Definition: RF69.cpp:672
Control class for RF69 module. Also serves as base class for SX1231.
Definition: RF69.h:435
int16_t transmit(uint8_t *data, size_t len, uint8_t addr=0) override
Blocking binary transmit method. Overloads for string-based transmissions are implemented in Physical...
Definition: RF69.cpp:110
void clearDio1Action()
Clears interrupt service routine to call when DIO1 activates.
Definition: RF69.cpp:285
int16_t setDataShaping(uint8_t sh) override
Sets Gaussian filter bandwidth-time product that will be used for data shaping. Allowed values are RA...
Definition: RF69.cpp:727
int16_t setCrcFiltering(bool crcOn=true)
Enable CRC filtering and generation.
Definition: RF69.cpp:693
int16_t begin(float freq=434.0, float br=48.0, float freqDev=50.0, float rxBw=125.0, int8_t power=10, uint8_t preambleLen=16)
Initialization method.
Definition: RF69.cpp:8
void setDio0Action(void(*func)(void))
Sets interrupt service routine to call when DIO0 activates.
Definition: RF69.cpp:269
Implements all common low-level SPI/UART/I2C methods to control the wireless module. Every module class contains one private instance of this class.
Definition: Module.h:17
int16_t transmit(__FlashStringHelper *fstr, uint8_t addr=0)
Arduino Flash String transmit method.
Definition: PhysicalLayer.cpp:8
int16_t setEncoding(uint8_t encoding) override
Sets transmission encoding. Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER an...
Definition: RF69.cpp:747
int16_t setBroadcastAddress(uint8_t broadAddr)
Sets broadcast address. Calling this method will also enable address filtering for node and broadcast...
Definition: RF69.cpp:612
void setDio1Action(void(*func)(void))
Sets interrupt service routine to call when DIO1 activates.
Definition: RF69.cpp:277
int16_t receive(String &str, size_t len=0)
Arduino String receive method.
Definition: PhysicalLayer.cpp:98
int16_t readData(uint8_t *data, size_t len) override
Reads data received after calling startReceive method.
Definition: RF69.cpp:343
float getRSSI()
Gets RSSI (Recorded Signal Strength Indicator) of the last received packet.
Definition: RF69.cpp:765
int16_t enableAES()
Enables AES encryption.
Definition: RF69.cpp:233
int16_t setFrequency(float freq)
Sets carrier frequency. Allowed values are in bands 290.0 to 340.0 MHz, 431.0 to 510.0 MHz and 862.0 to 1020.0 MHz.
Definition: RF69.cpp:372
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN...
Definition: PhysicalLayer.h:13
int16_t fixedPacketLengthMode(uint8_t len=RF69_MAX_PACKET_LENGTH)
Set modem in fixed packet length mode.
Definition: RF69.cpp:668
void setAESKey(uint8_t *key)
Sets AES key.
Definition: RF69.cpp:229
int16_t setRxBandwidth(float rxBw)
Sets receiver bandwidth. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25.0, 31.3, 41.7, 50.0, 62.5, 83.3, 100.0, 125.0, 166.7, 200.0, 250.0, 333.3, 400.0 and 500.0 kHz.
Definition: RF69.cpp:412
void reset()
Reset method. Will reset the chip to the default state using RST pin.
Definition: RF69.cpp:102
uint8_t random()
Get one truly random byte from RSSI noise.
Definition: RF69.cpp:773
int16_t setOutputPower(int8_t power, bool highPower=false)
Sets output power. Allowed values range from -18 to 13 dBm for low power modules (RF69C/CW) or -2 to ...
Definition: RF69.cpp:531
int16_t packetMode()
Stops direct mode. It is required to call this method to switch from direct transmissions to packet-b...
Definition: RF69.cpp:225
RF69(Module *module)
Default constructor.
Definition: RF69.cpp:4
int16_t receiveDirect() override
Starts direct mode reception.
Definition: RF69.cpp:200
int16_t readData(String &str, size_t len=0)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:57
int16_t getChipVersion()
Read version SPI register. Should return RF69_CHIP_VERSION (0x24) if SX127x is connected and working...
Definition: RF69.cpp:792
int16_t enableSyncWordFiltering(uint8_t maxErrBits=0)
Enable sync word filtering and generation.
Definition: RF69.cpp:676
int16_t startTransmit(uint8_t *data, size_t len, uint8_t addr=0) override
Interrupt-driven binary transmit method. Overloads for string-based transmissions are implemented in ...
Definition: RF69.cpp:292
int16_t getTemperature()
Measures temperature.
Definition: RF69.cpp:638