RadioLib
Universal wireless communication library for Arduino
Loading...
Searching...
No Matches
RF69.h
1#if !defined(_RADIOLIB_RF69_H)
2#define _RADIOLIB_RF69_H
3
4#include "../../TypeDef.h"
5
6#if !RADIOLIB_EXCLUDE_RF69
7
8#include "../../Module.h"
9
10#include "../../protocols/PhysicalLayer/PhysicalLayer.h"
11
12// RF69 physical layer properties
13#define RADIOLIB_RF69_FREQUENCY_STEP_SIZE 61.03515625
14#define RADIOLIB_RF69_MAX_PACKET_LENGTH 64
15#define RADIOLIB_RF69_CRYSTAL_FREQ 32.0f
16#define RADIOLIB_RF69_DIV_EXPONENT 19
17#define RADIOLIB_RF69_LP_POUT_MIN -18
18#define RADIOLIB_RF69_LP_POUT_MAX 13
19#define RADIOLIB_RF69_HP_POUT_MIN -2
20#define RADIOLIB_RF69_HP_POUT_MAX 20
21
22// RF69 register map
23#define RADIOLIB_RF69_REG_FIFO 0x00
24#define RADIOLIB_RF69_REG_OP_MODE 0x01
25#define RADIOLIB_RF69_REG_DATA_MODUL 0x02
26#define RADIOLIB_RF69_REG_BITRATE_MSB 0x03
27#define RADIOLIB_RF69_REG_BITRATE_LSB 0x04
28#define RADIOLIB_RF69_REG_FDEV_MSB 0x05
29#define RADIOLIB_RF69_REG_FDEV_LSB 0x06
30#define RADIOLIB_RF69_REG_FRF_MSB 0x07
31#define RADIOLIB_RF69_REG_FRF_MID 0x08
32#define RADIOLIB_RF69_REG_FRF_LSB 0x09
33#define RADIOLIB_RF69_REG_OSC_1 0x0A
34#define RADIOLIB_RF69_REG_AFC_CTRL 0x0B
35#define RADIOLIB_RF69_REG_LISTEN_1 0x0D
36#define RADIOLIB_RF69_REG_LISTEN_2 0x0E
37#define RADIOLIB_RF69_REG_LISTEN_3 0x0F
38#define RADIOLIB_RF69_REG_VERSION 0x10
39#define RADIOLIB_RF69_REG_PA_LEVEL 0x11
40#define RADIOLIB_RF69_REG_PA_RAMP 0x12
41#define RADIOLIB_RF69_REG_OCP 0x13
42#define RADIOLIB_RF69_REG_LNA 0x18
43#define RADIOLIB_RF69_REG_RX_BW 0x19
44#define RADIOLIB_RF69_REG_AFC_BW 0x1A
45#define RADIOLIB_RF69_REG_OOK_PEAK 0x1B
46#define RADIOLIB_RF69_REG_OOK_AVG 0x1C
47#define RADIOLIB_RF69_REG_OOK_FIX 0x1D
48#define RADIOLIB_RF69_REG_AFC_FEI 0x1E
49#define RADIOLIB_RF69_REG_AFC_MSB 0x1F
50#define RADIOLIB_RF69_REG_AFC_LSB 0x20
51#define RADIOLIB_RF69_REG_FEI_MSB 0x21
52#define RADIOLIB_RF69_REG_FEI_LSB 0x22
53#define RADIOLIB_RF69_REG_RSSI_CONFIG 0x23
54#define RADIOLIB_RF69_REG_RSSI_VALUE 0x24
55#define RADIOLIB_RF69_REG_DIO_MAPPING_1 0x25
56#define RADIOLIB_RF69_REG_DIO_MAPPING_2 0x26
57#define RADIOLIB_RF69_REG_IRQ_FLAGS_1 0x27
58#define RADIOLIB_RF69_REG_IRQ_FLAGS_2 0x28
59#define RADIOLIB_RF69_REG_RSSI_THRESH 0x29
60#define RADIOLIB_RF69_REG_RX_TIMEOUT_1 0x2A
61#define RADIOLIB_RF69_REG_RX_TIMEOUT_2 0x2B
62#define RADIOLIB_RF69_REG_PREAMBLE_MSB 0x2C
63#define RADIOLIB_RF69_REG_PREAMBLE_LSB 0x2D
64#define RADIOLIB_RF69_REG_SYNC_CONFIG 0x2E
65#define RADIOLIB_RF69_REG_SYNC_VALUE_1 0x2F
66#define RADIOLIB_RF69_REG_SYNC_VALUE_2 0x30
67#define RADIOLIB_RF69_REG_SYNC_VALUE_3 0x31
68#define RADIOLIB_RF69_REG_SYNC_VALUE_4 0x32
69#define RADIOLIB_RF69_REG_SYNC_VALUE_5 0x33
70#define RADIOLIB_RF69_REG_SYNC_VALUE_6 0x34
71#define RADIOLIB_RF69_REG_SYNC_VALUE_7 0x35
72#define RADIOLIB_RF69_REG_SYNC_VALUE_8 0x36
73#define RADIOLIB_RF69_REG_PACKET_CONFIG_1 0x37
74#define RADIOLIB_RF69_REG_PAYLOAD_LENGTH 0x38
75#define RADIOLIB_RF69_REG_NODE_ADRS 0x39
76#define RADIOLIB_RF69_REG_BROADCAST_ADRS 0x3A
77#define RADIOLIB_RF69_REG_AUTO_MODES 0x3B
78#define RADIOLIB_RF69_REG_FIFO_THRESH 0x3C
79#define RADIOLIB_RF69_REG_PACKET_CONFIG_2 0x3D
80#define RADIOLIB_RF69_REG_AES_KEY_1 0x3E
81#define RADIOLIB_RF69_REG_AES_KEY_2 0x3F
82#define RADIOLIB_RF69_REG_AES_KEY_3 0x40
83#define RADIOLIB_RF69_REG_AES_KEY_4 0x41
84#define RADIOLIB_RF69_REG_AES_KEY_5 0x42
85#define RADIOLIB_RF69_REG_AES_KEY_6 0x43
86#define RADIOLIB_RF69_REG_AES_KEY_7 0x44
87#define RADIOLIB_RF69_REG_AES_KEY_8 0x45
88#define RADIOLIB_RF69_REG_AES_KEY_9 0x46
89#define RADIOLIB_RF69_REG_AES_KEY_10 0x47
90#define RADIOLIB_RF69_REG_AES_KEY_11 0x48
91#define RADIOLIB_RF69_REG_AES_KEY_12 0x49
92#define RADIOLIB_RF69_REG_AES_KEY_13 0x4A
93#define RADIOLIB_RF69_REG_AES_KEY_14 0x4B
94#define RADIOLIB_RF69_REG_AES_KEY_15 0x4C
95#define RADIOLIB_RF69_REG_AES_KEY_16 0x4D
96#define RADIOLIB_RF69_REG_TEMP_1 0x4E
97#define RADIOLIB_RF69_REG_TEMP_2 0x4F
98#define RADIOLIB_RF69_REG_TEST_LNA 0x58
99#define RADIOLIB_RF69_REG_TEST_PA1 0x5A
100#define RADIOLIB_RF69_REG_TEST_PA2 0x5C
101#define RADIOLIB_RF69_REG_TEST_DAGC 0x6F
102
103// RF69 modem settings
104// RADIOLIB_RF69_REG_OP_MODE MSB LSB DESCRIPTION
105#define RADIOLIB_RF69_SEQUENCER_OFF 0b10000000 // 7 7 disable automatic sequencer
106#define RADIOLIB_RF69_SEQUENCER_ON 0b00000000 // 7 7 enable automatic sequencer
107#define RADIOLIB_RF69_LISTEN_OFF 0b00000000 // 6 6 disable Listen mode
108#define RADIOLIB_RF69_LISTEN_ON 0b01000000 // 6 6 enable Listen mode
109#define RADIOLIB_RF69_LISTEN_ABORT 0b00100000 // 5 5 abort Listen mode (has to be set together with RF69_LISTEN_OFF)
110#define RADIOLIB_RF69_SLEEP 0b00000000 // 4 2 sleep
111#define RADIOLIB_RF69_STANDBY 0b00000100 // 4 2 standby
112#define RADIOLIB_RF69_FS 0b00001000 // 4 2 frequency synthesis
113#define RADIOLIB_RF69_TX 0b00001100 // 4 2 transmit
114#define RADIOLIB_RF69_RX 0b00010000 // 4 2 receive
115
116// RADIOLIB_RF69_REG_DATA_MODUL
117#define RADIOLIB_RF69_PACKET_MODE 0b00000000 // 6 5 packet mode (default)
118#define RADIOLIB_RF69_CONTINUOUS_MODE_WITH_SYNC 0b01000000 // 6 5 continuous mode with bit synchronizer
119#define RADIOLIB_RF69_CONTINUOUS_MODE 0b01100000 // 6 5 continuous mode without bit synchronizer
120#define RADIOLIB_RF69_FSK 0b00000000 // 4 3 modulation: FSK (default)
121#define RADIOLIB_RF69_OOK 0b00001000 // 4 3 OOK
122#define RADIOLIB_RF69_NO_SHAPING 0b00000000 // 1 0 modulation shaping: no shaping (default)
123#define RADIOLIB_RF69_FSK_GAUSSIAN_1_0 0b00000001 // 1 0 FSK modulation Gaussian filter, BT = 1.0
124#define RADIOLIB_RF69_FSK_GAUSSIAN_0_5 0b00000010 // 1 0 FSK modulation Gaussian filter, BT = 0.5
125#define RADIOLIB_RF69_FSK_GAUSSIAN_0_3 0b00000011 // 1 0 FSK modulation Gaussian filter, BT = 0.3
126#define RADIOLIB_RF69_OOK_FILTER_BR 0b00000001 // 1 0 OOK modulation filter, f_cutoff = BR
127#define RADIOLIB_RF69_OOK_FILTER_2BR 0b00000010 // 1 0 OOK modulation filter, f_cutoff = 2*BR
128
129// RADIOLIB_RF69_REG_BITRATE_MSB + REG_BITRATE_LSB
130#define RADIOLIB_RF69_BITRATE_MSB 0x1A // 7 0 bit rate setting: rate = F(XOSC) / BITRATE
131#define RADIOLIB_RF69_BITRATE_LSB 0x0B // 7 0 default value: 4.8 kbps
132
133// RADIOLIB_RF69_REG_FDEV_MSB + REG_FDEV_LSB
134#define RADIOLIB_RF69_FDEV_MSB 0x00 // 5 0 frequency deviation: f_dev = f_step * FDEV
135#define RADIOLIB_RF69_FDEV_LSB 0x52 // 7 0 default value: 5 kHz
136
137// RADIOLIB_RF69_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB
138#define RADIOLIB_RF69_FRF_MSB 0xE4 // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19
139#define RADIOLIB_RF69_FRF_MID 0xC0 // 7 0 where F(XOSC) = 32 MHz
140#define RADIOLIB_RF69_FRF_LSB 0x00 // 7 0 default value: 915 MHz
141
142// RADIOLIB_RF69_REG_OSC_1
143#define RADIOLIB_RF69_RC_CAL_START 0b10000000 // 7 7 force RC oscillator calibration
144#define RADIOLIB_RF69_RC_CAL_RUNNING 0b00000000 // 6 6 RC oscillator calibration is still running
145#define RADIOLIB_RF69_RC_CAL_DONE 0b00000000 // 5 5 RC oscillator calibration has finished
146
147// RADIOLIB_RF69_REG_AFC_CTRL
148#define RADIOLIB_RF69_AFC_LOW_BETA_OFF 0b00000000 // 5 5 standard AFC routine
149#define RADIOLIB_RF69_AFC_LOW_BETA_ON 0b00100000 // 5 5 improved AFC routine for signals with modulation index less than 2
150
151// RADIOLIB_RF69_REG_LISTEN_1
152#define RADIOLIB_RF69_LISTEN_RES_IDLE_64_US 0b01000000 // 7 6 resolution of Listen mode idle time: 64 us
153#define RADIOLIB_RF69_LISTEN_RES_IDLE_4_1_MS 0b10000000 // 7 6 4.1 ms (default)
154#define RADIOLIB_RF69_LISTEN_RES_IDLE_262_MS 0b11000000 // 7 6 262 ms
155#define RADIOLIB_RF69_LISTEN_RES_RX_64_US 0b00010000 // 5 4 resolution of Listen mode rx time: 64 us (default)
156#define RADIOLIB_RF69_LISTEN_RES_RX_4_1_MS 0b00100000 // 5 4 4.1 ms
157#define RADIOLIB_RF69_LISTEN_RES_RX_262_MS 0b00110000 // 5 4 262 ms
158#define RADIOLIB_RF69_LISTEN_ACCEPT_ABOVE_RSSI_THRESH 0b00000000 // 3 3 packet acceptance criteria: RSSI above threshold
159#define RADIOLIB_RF69_LISTEN_ACCEPT_MATCH_SYNC_ADDRESS 0b00001000 // 3 3 RSSI above threshold AND sync address matched
160#define RADIOLIB_RF69_LISTEN_END_KEEP_RX 0b00000000 // 2 1 action after packet acceptance: stay in Rx mode
161#define RADIOLIB_RF69_LISTEN_END_KEEP_RX_TIMEOUT 0b00000010 // 2 1 stay in Rx mode until timeout (default)
162#define RADIOLIB_RF69_LISTEN_END_KEEP_RX_TIMEOUT_RESUME 0b00000100 // 2 1 stay in Rx mode until timeout, Listen mode will resume
163
164// RADIOLIB_RF69_REG_LISTEN_2
165#define RADIOLIB_RF69_LISTEN_COEF_IDLE 0xF5 // 7 0 duration of idle phase in Listen mode
166
167// RADIOLIB_RF69_REG_LISTEN_3
168#define RADIOLIB_RF69_LISTEN_COEF_RX 0x20 // 7 0 duration of Rx phase in Listen mode
169
170// RADIOLIB_RF69_REG_VERSION
171#define RADIOLIB_RF69_CHIP_VERSION 0x24 // 7 0
172
173// RADIOLIB_RF69_REG_PA_LEVEL
174#define RADIOLIB_RF69_PA0_OFF 0b00000000 // 7 7 PA0 disabled
175#define RADIOLIB_RF69_PA0_ON 0b10000000 // 7 7 PA0 enabled (default)
176#define RADIOLIB_RF69_PA1_OFF 0b00000000 // 6 6 PA1 disabled (default)
177#define RADIOLIB_RF69_PA1_ON 0b01000000 // 6 6 PA1 enabled
178#define RADIOLIB_RF69_PA2_OFF 0b00000000 // 5 5 PA2 disabled (default)
179#define RADIOLIB_RF69_PA2_ON 0b00100000 // 5 5 PA2 enabled
180#define RADIOLIB_RF69_OUTPUT_POWER 0b00011111 // 4 0 output power: P_out = -18 + OUTPUT_POWER
181
182// RADIOLIB_RF69_REG_PA_RAMP
183#define RADIOLIB_RF69_PA_RAMP_3_4_MS 0b00000000 // 3 0 PA ramp rise/fall time: 3.4 ms
184#define RADIOLIB_RF69_PA_RAMP_2_MS 0b00000001 // 3 0 2 ms
185#define RADIOLIB_RF69_PA_RAMP_1_MS 0b00000010 // 3 0 1 ms
186#define RADIOLIB_RF69_PA_RAMP_500_US 0b00000011 // 3 0 500 us
187#define RADIOLIB_RF69_PA_RAMP_250_US 0b00000100 // 3 0 250 us
188#define RADIOLIB_RF69_PA_RAMP_125_US 0b00000101 // 3 0 125 us
189#define RADIOLIB_RF69_PA_RAMP_100_US 0b00000110 // 3 0 100 us
190#define RADIOLIB_RF69_PA_RAMP_62_US 0b00000111 // 3 0 62 us
191#define RADIOLIB_RF69_PA_RAMP_50_US 0b00001000 // 3 0 50 us
192#define RADIOLIB_RF69_PA_RAMP_40_US 0b00001001 // 3 0 40 us (default)
193#define RADIOLIB_RF69_PA_RAMP_31_US 0b00001010 // 3 0 31 us
194#define RADIOLIB_RF69_PA_RAMP_25_US 0b00001011 // 3 0 25 us
195#define RADIOLIB_RF69_PA_RAMP_20_US 0b00001100 // 3 0 20 us
196#define RADIOLIB_RF69_PA_RAMP_15_US 0b00001101 // 3 0 15 us
197#define RADIOLIB_RF69_PA_RAMP_12_US 0b00001110 // 3 0 12 us
198#define RADIOLIB_RF69_PA_RAMP_10_US 0b00001111 // 3 0 10 us
199
200// RADIOLIB_RF69_REG_OCP
201#define RADIOLIB_RF69_OCP_OFF 0b00000000 // 4 4 PA overload current protection disabled
202#define RADIOLIB_RF69_OCP_ON 0b00010000 // 4 4 PA overload current protection enabled
203#define RADIOLIB_RF69_OCP_TRIM 0b00001010 // 3 0 OCP current: I_max(OCP_TRIM = 0b1010) = 95 mA
204
205// RADIOLIB_RF69_REG_LNA
206#define RADIOLIB_RF69_LNA_Z_IN_50_OHM 0b00000000 // 7 7 LNA input impedance: 50 ohm
207#define RADIOLIB_RF69_LNA_Z_IN_200_OHM 0b10000000 // 7 7 200 ohm
208#define RADIOLIB_RF69_LNA_CURRENT_GAIN 0b00001000 // 5 3 manually set LNA current gain
209#define RADIOLIB_RF69_LNA_GAIN_AUTO 0b00000000 // 2 0 LNA gain setting: set automatically by AGC
210#define RADIOLIB_RF69_LNA_GAIN_MAX 0b00000001 // 2 0 max gain
211#define RADIOLIB_RF69_LNA_GAIN_MAX_6_DB 0b00000010 // 2 0 max gain - 6 dB
212#define RADIOLIB_RF69_LNA_GAIN_MAX_12_DB 0b00000011 // 2 0 max gain - 12 dB
213#define RADIOLIB_RF69_LNA_GAIN_MAX_24_DB 0b00000100 // 2 0 max gain - 24 dB
214#define RADIOLIB_RF69_LNA_GAIN_MAX_36_DB 0b00000101 // 2 0 max gain - 36 dB
215#define RADIOLIB_RF69_LNA_GAIN_MAX_48_DB 0b00000110 // 2 0 max gain - 48 dB
216
217// RADIOLIB_RF69_REG_RX_BW
218#define RADIOLIB_RF69_DCC_FREQ 0b01000000 // 7 5 DC offset canceller cutoff frequency (4% Rx BW by default)
219#define RADIOLIB_RF69_RX_BW_MANT_16 0b00000000 // 4 3 Channel filter bandwidth FSK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 2))
220#define RADIOLIB_RF69_RX_BW_MANT_20 0b00001000 // 4 3 OOK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 3))
221#define RADIOLIB_RF69_RX_BW_MANT_24 0b00010000 // 4 3
222#define RADIOLIB_RF69_RX_BW_EXP 0b00000101 // 2 0 default RxBwExp value = 5
223
224// RADIOLIB_RF69_REG_AFC_BW
225#define RADIOLIB_RF69_DCC_FREQ_AFC 0b10000000 // 7 5 default DccFreq parameter for AFC
226#define RADIOLIB_RF69_DCC_RX_BW_MANT_AFC 0b00001000 // 4 3 default RxBwMant parameter for AFC
227#define RADIOLIB_RF69_DCC_RX_BW_EXP_AFC 0b00000011 // 2 0 default RxBwExp parameter for AFC
228
229// RADIOLIB_RF69_REG_OOK_PEAK
230#define RADIOLIB_RF69_OOK_THRESH_FIXED 0b00000000 // 7 6 OOK threshold type: fixed
231#define RADIOLIB_RF69_OOK_THRESH_PEAK 0b01000000 // 7 6 peak (default)
232#define RADIOLIB_RF69_OOK_THRESH_AVERAGE 0b10000000 // 7 6 average
233#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_0_5_DB 0b00000000 // 5 3 OOK demodulator step size: 0.5 dB (default)
234#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_1_0_DB 0b00001000 // 5 3 1.0 dB
235#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_1_5_DB 0b00010000 // 5 3 1.5 dB
236#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_2_0_DB 0b00011000 // 5 3 2.0 dB
237#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_3_0_DB 0b00100000 // 5 3 3.0 dB
238#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_4_0_DB 0b00101000 // 5 3 4.0 dB
239#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_5_0_DB 0b00110000 // 5 3 5.0 dB
240#define RADIOLIB_RF69_OOK_PEAK_THRESH_STEP_6_0_DB 0b00111000 // 5 3 6.0 dB
241#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_1_CHIP 0b00000000 // 2 0 OOK demodulator step period: once per chip (default)
242#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_2_CHIP 0b00000001 // 2 0 once every 2 chips
243#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_4_CHIP 0b00000010 // 2 0 once every 4 chips
244#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_1_8_CHIP 0b00000011 // 2 0 once every 8 chips
245#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_2_1_CHIP 0b00000100 // 2 0 2 times per chip
246#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_4_1_CHIP 0b00000101 // 2 0 4 times per chip
247#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_8_1_CHIP 0b00000110 // 2 0 8 times per chip
248#define RADIOLIB_RF69_OOK_PEAK_THRESH_DEC_16_1_CHIP 0b00000111 // 2 0 16 times per chip
249
250// RADIOLIB_RF69_REG_OOK_AVG
251#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_32_PI 0b00000000 // 7 6 OOK average filter coefficient: chip rate / 32*pi
252#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_8_PI 0b01000000 // 7 6 chip rate / 8*pi
253#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_4_PI 0b10000000 // 7 6 chip rate / 4*pi (default)
254#define RADIOLIB_RF69_OOK_AVG_THRESH_FILT_2_PI 0b11000000 // 7 6 chip rate / 2*pi
255
256// RADIOLIB_RF69_REG_OOK_FIX
257#define RADIOLIB_RF69_OOK_FIXED_THRESH 0b00000110 // 7 0 default OOK fixed threshold (6 dB)
258
259// RADIOLIB_RF69_REG_AFC_FEI
260#define RADIOLIB_RF69_FEI_RUNNING 0b00000000 // 6 6 FEI status: on-going
261#define RADIOLIB_RF69_FEI_DONE 0b01000000 // 6 6 done
262#define RADIOLIB_RF69_FEI_START 0b00100000 // 5 5 force new FEI measurement
263#define RADIOLIB_RF69_AFC_RUNNING 0b00000000 // 4 4 AFC status: on-going
264#define RADIOLIB_RF69_AFC_DONE 0b00010000 // 4 4 done
265#define RADIOLIB_RF69_AFC_AUTOCLEAR_OFF 0b00000000 // 3 3 AFC register autoclear disabled
266#define RADIOLIB_RF69_AFC_AUTOCLEAR_ON 0b00001000 // 3 3 AFC register autoclear enabled
267#define RADIOLIB_RF69_AFC_AUTO_OFF 0b00000000 // 2 2 perform AFC only manually
268#define RADIOLIB_RF69_AFC_AUTO_ON 0b00000100 // 2 2 perform AFC each time Rx mode is started
269#define RADIOLIB_RF69_AFC_CLEAR 0b00000010 // 1 1 clear AFC register
270#define RADIOLIB_RF69_AFC_START 0b00000001 // 0 0 start AFC
271
272// RADIOLIB_RF69_REG_RSSI_CONFIG
273#define RADIOLIB_RF69_RSSI_RUNNING 0b00000000 // 1 1 RSSI status: on-going
274#define RADIOLIB_RF69_RSSI_DONE 0b00000010 // 1 1 done
275#define RADIOLIB_RF69_RSSI_START 0b00000001 // 0 0 start RSSI measurement
276
277// RADIOLIB_RF69_REG_DIO_MAPPING_1
278#define RADIOLIB_RF69_DIO0_CONT_MODE_READY 0b11000000 // 7 6
279#define RADIOLIB_RF69_DIO0_CONT_PLL_LOCK 0b00000000 // 7 6
280#define RADIOLIB_RF69_DIO0_CONT_SYNC_ADDRESS 0b00000000 // 7 6
281#define RADIOLIB_RF69_DIO0_CONT_TIMEOUT 0b01000000 // 7 6
282#define RADIOLIB_RF69_DIO0_CONT_RSSI 0b10000000 // 7 6
283#define RADIOLIB_RF69_DIO0_CONT_TX_READY 0b01000000 // 7 6
284#define RADIOLIB_RF69_DIO0_PACK_PLL_LOCK 0b11000000 // 7 6
285#define RADIOLIB_RF69_DIO0_PACK_CRC_OK 0b00000000 // 7 6
286#define RADIOLIB_RF69_DIO0_PACK_PAYLOAD_READY 0b01000000 // 7 6
287#define RADIOLIB_RF69_DIO0_PACK_SYNC_ADDRESS 0b10000000 // 7 6
288#define RADIOLIB_RF69_DIO0_PACK_RSSI 0b11000000 // 7 6
289#define RADIOLIB_RF69_DIO0_PACK_PACKET_SENT 0b00000000 // 7 6
290#define RADIOLIB_RF69_DIO0_PACK_TX_READY 0b01000000 // 7 6
291#define RADIOLIB_RF69_DIO1_CONT_PLL_LOCK 0b00110000 // 5 4
292#define RADIOLIB_RF69_DIO1_CONT_DCLK 0b00000000 // 5 4
293#define RADIOLIB_RF69_DIO1_CONT_RX_READY 0b00010000 // 5 4
294#define RADIOLIB_RF69_DIO1_CONT_SYNC_ADDRESS 0b00110000 // 5 4
295#define RADIOLIB_RF69_DIO1_CONT_TX_READY 0b00010000 // 5 4
296#define RADIOLIB_RF69_DIO1_PACK_FIFO_LEVEL 0b00000000 // 5 4
297#define RADIOLIB_RF69_DIO1_PACK_FIFO_FULL 0b00010000 // 5 4
298#define RADIOLIB_RF69_DIO1_PACK_FIFO_NOT_EMPTY 0b00100000 // 5 4
299#define RADIOLIB_RF69_DIO1_PACK_PLL_LOCK 0b00110000 // 5 4
300#define RADIOLIB_RF69_DIO1_PACK_TIMEOUT 0b00110000 // 5 4
301#define RADIOLIB_RF69_DIO2_CONT_DATA 0b00000000 // 3 2
302#define RADIOLIB_RF69_DIO2_PACK_FIFO_NOT_EMPTY 0b00000000 // 3 2
303#define RADIOLIB_RF69_DIO2_PACK_AUTO_MODE 0b00001100 // 3 2
304#define RADIOLIB_RF69_DIO2_PACK_DATA 0b00000100 // 3 2
305#define RADIOLIB_RF69_DIO3_CONT_AUTO_MODE 0b00000010 // 0 1
306#define RADIOLIB_RF69_DIO3_CONT_RSSI 0b00000000 // 0 1
307#define RADIOLIB_RF69_DIO3_CONT_RX_READY 0b00000001 // 0 1
308#define RADIOLIB_RF69_DIO3_CONT_TIMEOUT 0b00000011 // 0 1
309#define RADIOLIB_RF69_DIO3_CONT_TX_READY 0b00000001 // 0 1
310#define RADIOLIB_RF69_DIO3_PACK_FIFO_FULL 0b00000000 // 0 1
311#define RADIOLIB_RF69_DIO3_PACK_PLL_LOCK 0b00000011 // 0 1
312#define RADIOLIB_RF69_DIO3_PACK_RSSI 0b00000001 // 0 1
313#define RADIOLIB_RF69_DIO3_PACK_SYNC_ADDRESSS 0b00000010 // 0 1
314#define RADIOLIB_RF69_DIO3_PACK_TX_READY 0b00000001 // 0 1
315
316// RADIOLIB_RF69_REG_DIO_MAPPING_2
317#define RADIOLIB_RF69_DIO4_CONT_PLL_LOCK 0b11000000 // 7 6
318#define RADIOLIB_RF69_DIO4_CONT_TIMEOUT 0b00000000 // 7 6
319#define RADIOLIB_RF69_DIO4_CONT_RX_READY 0b01000000 // 7 6
320#define RADIOLIB_RF69_DIO4_CONT_SYNC_ADDRESS 0b10000000 // 7 6
321#define RADIOLIB_RF69_DIO4_CONT_TX_READY 0b01000000 // 7 6
322#define RADIOLIB_RF69_DIO4_PACK_PLL_LOCK 0b11000000 // 7 6
323#define RADIOLIB_RF69_DIO4_PACK_TIMEOUT 0b00000000 // 7 6
324#define RADIOLIB_RF69_DIO4_PACK_RSSI 0b01000000 // 7 6
325#define RADIOLIB_RF69_DIO4_PACK_RX_READY 0b10000000 // 7 6
326#define RADIOLIB_RF69_DIO4_PACK_MODE_READY 0b00000000 // 7 6
327#define RADIOLIB_RF69_DIO4_PACK_TX_READY 0b01000000 // 7 6
328#define RADIOLIB_RF69_DIO5_CONT_MODE_READY 0b00110000 // 5 4
329#define RADIOLIB_RF69_DIO5_CONT_CLK_OUT 0b00000000 // 5 4
330#define RADIOLIB_RF69_DIO5_CONT_RSSI 0b00010000 // 5 4
331#define RADIOLIB_RF69_DIO5_PACK_MODE_READY 0b00110000 // 5 4
332#define RADIOLIB_RF69_DIO5_PACK_CLK_OUT 0b00000000 // 5 4
333#define RADIOLIB_RF69_DIO5_PACK_DATA 0b00010000 // 5 4
334#define RADIOLIB_RF69_CLK_OUT_FXOSC 0b00000000 // 2 0 ClkOut frequency: F(XOSC)
335#define RADIOLIB_RF69_CLK_OUT_FXOSC_2 0b00000001 // 2 0 F(XOSC) / 2
336#define RADIOLIB_RF69_CLK_OUT_FXOSC_4 0b00000010 // 2 0 F(XOSC) / 4
337#define RADIOLIB_RF69_CLK_OUT_FXOSC_8 0b00000011 // 2 0 F(XOSC) / 8
338#define RADIOLIB_RF69_CLK_OUT_FXOSC_16 0b00000100 // 2 0 F(XOSC) / 16
339#define RADIOLIB_RF69_CLK_OUT_FXOSC_32 0b00000101 // 2 0 F(XOSC) / 31
340#define RADIOLIB_RF69_CLK_OUT_RC 0b00000110 // 2 0 RC
341#define RADIOLIB_RF69_CLK_OUT_OFF 0b00000111 // 2 0 disabled (default)
342
343// RADIOLIB_RF69_REG_IRQ_FLAGS_1
344#define RADIOLIB_RF69_IRQ_MODE_READY 0b10000000 // 7 7 requested mode was set
345#define RADIOLIB_RF69_IRQ_RX_READY 0b01000000 // 6 6 Rx mode ready
346#define RADIOLIB_RF69_IRQ_TX_READY 0b00100000 // 5 5 Tx mode ready
347#define RADIOLIB_RF69_IRQ_PLL_LOCK 0b00010000 // 4 4 PLL is locked
348#define RADIOLIB_RF69_IRQ_RSSI 0b00001000 // 3 3 RSSI value exceeded RssiThreshold
349#define RADIOLIB_RF69_IRQ_TIMEOUT 0b00000100 // 2 2 timeout occurred
350#define RADIOLIB_RF69_IRQ_AUTO_MODE 0b00000010 // 1 1 entered intermediate mode
351#define RADIOLIB_RF69_SYNC_ADDRESS_MATCH 0b00000001 // 0 0 sync address detected
352
353// RADIOLIB_RF69_REG_IRQ_FLAGS_2
354#define RADIOLIB_RF69_IRQ_FIFO_FULL 0b10000000 // 7 7 FIFO is full
355#define RADIOLIB_RF69_IRQ_FIFO_NOT_EMPTY 0b01000000 // 6 6 FIFO contains at least 1 byte
356#define RADIOLIB_RF69_IRQ_FIFO_LEVEL 0b00100000 // 5 5 FIFO contains more than FifoThreshold bytes
357#define RADIOLIB_RF69_IRQ_FIFO_OVERRUN 0b00010000 // 4 4 FIFO overrun occurred
358#define RADIOLIB_RF69_IRQ_PACKET_SENT 0b00001000 // 3 3 packet was sent
359#define RADIOLIB_RF69_IRQ_PAYLOAD_READY 0b00000100 // 2 2 last payload byte received and CRC check passed
360#define RADIOLIB_RF69_IRQ_CRC_OK 0b00000010 // 1 1 CRC check passed
361
362// RADIOLIB_RF69_REG_RSSI_THRESH
363#define RADIOLIB_RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default)
364
365// RADIOLIB_RF69_REG_RX_TIMEOUT_1
366#define RADIOLIB_RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default)
367#define RADIOLIB_RF69_TIMEOUT_RX_START 0xFF // 7 0 timeout will occur if RSSI interrupt is not received
368
369// RADIOLIB_RF69_REG_RX_TIMEOUT_2
370#define RADIOLIB_RF69_TIMEOUT_RSSI_THRESH_OFF 0x00 // 7 0 PayloadReady interrupt timeout disabled (default)
371#define RADIOLIB_RF69_TIMEOUT_RSSI_THRESH 0xFF // 7 0 timeout will occur if PayloadReady interrupt is not received
372
373// RADIOLIB_RF69_REG_PREAMBLE_MSB + REG_PREAMBLE_MSB
374#define RADIOLIB_RF69_PREAMBLE_MSB 0x00 // 7 0 2-byte preamble size value
375#define RADIOLIB_RF69_PREAMBLE_LSB 0x03 // 7 0
376
377// RADIOLIB_RF69_REG_SYNC_CONFIG
378#define RADIOLIB_RF69_SYNC_OFF 0b00000000 // 7 7 sync word detection off
379#define RADIOLIB_RF69_SYNC_ON 0b10000000 // 7 7 sync word detection on (default)
380#define RADIOLIB_RF69_FIFO_FILL_CONDITION_SYNC 0b00000000 // 6 6 FIFO fill condition: on SyncAddress interrupt (default)
381#define RADIOLIB_RF69_FIFO_FILL_CONDITION 0b01000000 // 6 6 as long as the bit is set
382#define RADIOLIB_RF69_SYNC_SIZE 0b00001000 // 5 3 size of sync word: SyncSize + 1 bytes
383#define RADIOLIB_RF69_SYNC_TOL 0b00000000 // 2 0 number of tolerated errors in sync word
384
385// RADIOLIB_RF69_REG_SYNC_VALUE_1 - SYNC_VALUE_8
386#define RADIOLIB_RF69_SYNC_BYTE_1 0x01 // 7 0 sync word: 1st byte (MSB)
387#define RADIOLIB_RF69_SYNC_BYTE_2 0x01 // 7 0 2nd byte
388#define RADIOLIB_RF69_SYNC_BYTE_3 0x01 // 7 0 3rd byte
389#define RADIOLIB_RF69_SYNC_BYTE_4 0x01 // 7 0 4th byte
390#define RADIOLIB_RF69_SYNC_BYTE_5 0x01 // 7 0 5th byte
391#define RADIOLIB_RF69_SYNC_BYTE_6 0x01 // 7 0 6th byte
392#define RADIOLIB_RF69_SYNC_BYTE_7 0x01 // 7 0 7th byte
393#define RADIOLIB_RF69_SYNC_BYTE_8 0x01 // 7 0 8th byte (LSB)
394
395// RADIOLIB_RF69_REG_PACKET_CONFIG_1
396#define RADIOLIB_RF69_PACKET_FORMAT_FIXED 0b00000000 // 7 7 fixed packet length (default)
397#define RADIOLIB_RF69_PACKET_FORMAT_VARIABLE 0b10000000 // 7 7 variable packet length
398#define RADIOLIB_RF69_DC_FREE_NONE 0b00000000 // 6 5 DC-free encoding: none (default)
399#define RADIOLIB_RF69_DC_FREE_MANCHESTER 0b00100000 // 6 5 Manchester
400#define RADIOLIB_RF69_DC_FREE_WHITENING 0b01000000 // 6 5 Whitening
401#define RADIOLIB_RF69_CRC_OFF 0b00000000 // 4 4 CRC disabled
402#define RADIOLIB_RF69_CRC_ON 0b00010000 // 4 4 CRC enabled (default)
403#define RADIOLIB_RF69_CRC_AUTOCLEAR_ON 0b00000000 // 3 3 discard packet when CRC check fails (default)
404#define RADIOLIB_RF69_CRC_AUTOCLEAR_OFF 0b00001000 // 3 3 keep packet when CRC check fails
405#define RADIOLIB_RF69_ADDRESS_FILTERING_OFF 0b00000000 // 2 1 address filtering: none (default)
406#define RADIOLIB_RF69_ADDRESS_FILTERING_NODE 0b00000010 // 2 1 node
407#define RADIOLIB_RF69_ADDRESS_FILTERING_NODE_BROADCAST 0b00000100 // 2 1 node or broadcast
408
409// RADIOLIB_RF69_REG_PAYLOAD_LENGTH
410#define RADIOLIB_RF69_PAYLOAD_LENGTH 0xFF // 7 0 payload length
411
412// RADIOLIB_RF69_REG_AUTO_MODES
413#define RADIOLIB_RF69_ENTER_COND_NONE 0b00000000 // 7 5 condition for entering intermediate mode: none, AutoModes disabled (default)
414#define RADIOLIB_RF69_ENTER_COND_FIFO_NOT_EMPTY 0b00100000 // 7 5 FifoNotEmpty rising edge
415#define RADIOLIB_RF69_ENTER_COND_FIFO_LEVEL 0b01000000 // 7 5 FifoLevel rising edge
416#define RADIOLIB_RF69_ENTER_COND_CRC_OK 0b01100000 // 7 5 CrcOk rising edge
417#define RADIOLIB_RF69_ENTER_COND_PAYLOAD_READY 0b10000000 // 7 5 PayloadReady rising edge
418#define RADIOLIB_RF69_ENTER_COND_SYNC_ADDRESS 0b10100000 // 7 5 SyncAddress rising edge
419#define RADIOLIB_RF69_ENTER_COND_PACKET_SENT 0b11000000 // 7 5 PacketSent rising edge
420#define RADIOLIB_RF69_ENTER_COND_FIFO_EMPTY 0b11100000 // 7 5 FifoNotEmpty falling edge
421#define RADIOLIB_RF69_EXIT_COND_NONE 0b00000000 // 4 2 condition for exiting intermediate mode: none, AutoModes disabled (default)
422#define RADIOLIB_RF69_EXIT_COND_FIFO_EMPTY 0b00100000 // 4 2 FifoNotEmpty falling edge
423#define RADIOLIB_RF69_EXIT_COND_FIFO_LEVEL 0b01000000 // 4 2 FifoLevel rising edge
424#define RADIOLIB_RF69_EXIT_COND_CRC_OK 0b01100000 // 4 2 CrcOk rising edge
425#define RADIOLIB_RF69_EXIT_COND_PAYLOAD_READY 0b10000000 // 4 2 PayloadReady rising edge
426#define RADIOLIB_RF69_EXIT_COND_SYNC_ADDRESS 0b10100000 // 4 2 SyncAddress rising edge
427#define RADIOLIB_RF69_EXIT_COND_PACKET_SENT 0b11000000 // 4 2 PacketSent rising edge
428#define RADIOLIB_RF69_EXIT_COND_TIMEOUT 0b11100000 // 4 2 timeout rising edge
429#define RADIOLIB_RF69_INTER_MODE_SLEEP 0b00000000 // 1 0 intermediate mode: sleep (default)
430#define RADIOLIB_RF69_INTER_MODE_STANDBY 0b00000001 // 1 0 standby
431#define RADIOLIB_RF69_INTER_MODE_RX 0b00000010 // 1 0 Rx
432#define RADIOLIB_RF69_INTER_MODE_TX 0b00000011 // 1 0 Tx
433
434// RADIOLIB_RF69_REG_FIFO_THRESH
435#define RADIOLIB_RF69_TX_START_CONDITION_FIFO_LEVEL 0b00000000 // 7 7 packet transmission start condition: FifoLevel
436#define RADIOLIB_RF69_TX_START_CONDITION_FIFO_NOT_EMPTY 0b10000000 // 7 7 FifoNotEmpty (default)
437#define RADIOLIB_RF69_FIFO_THRESH 0x1F // 6 0 default threshold to trigger FifoLevel interrupt
438
439// RADIOLIB_RF69_REG_PACKET_CONFIG_2
440#define RADIOLIB_RF69_INTER_PACKET_RX_DELAY 0b00000000 // 7 4 delay between FIFO empty and start of new RSSI phase
441#define RADIOLIB_RF69_RESTART_RX 0b00000100 // 2 2 force receiver into wait mode
442#define RADIOLIB_RF69_AUTO_RX_RESTART_OFF 0b00000000 // 1 1 auto Rx restart disabled
443#define RADIOLIB_RF69_AUTO_RX_RESTART_ON 0b00000010 // 1 1 auto Rx restart enabled (default)
444#define RADIOLIB_RF69_AES_OFF 0b00000000 // 0 0 AES encryption disabled (default)
445#define RADIOLIB_RF69_AES_ON 0b00000001 // 0 0 AES encryption enabled, payload size limited to 66 bytes
446
447// RADIOLIB_RF69_REG_TEST_LNA
448#define RADIOLIB_RF69_TEST_LNA_BOOST_NORMAL 0x1B // 7 0
449#define RADIOLIB_RF69_TEST_LNA_BOOST_HIGH 0x2D // 7 0
450
451// RADIOLIB_RF69_REG_TEMP_1
452#define RADIOLIB_RF69_TEMP_MEAS_START 0b00001000 // 3 3 trigger temperature measurement
453#define RADIOLIB_RF69_TEMP_MEAS_RUNNING 0b00000100 // 2 2 temperature measurement status: on-going
454#define RADIOLIB_RF69_TEMP_MEAS_DONE 0b00000000 // 2 2 done
455
456// RADIOLIB_RF69_REG_TEST_DAGC
457#define RADIOLIB_RF69_CONTINUOUS_DAGC_NORMAL 0x00 // 7 0 fading margin improvement: normal mode
458#define RADIOLIB_RF69_CONTINUOUS_DAGC_LOW_BETA_ON 0x20 // 7 0 improved mode for AfcLowBetaOn
459#define RADIOLIB_RF69_CONTINUOUS_DAGC_LOW_BETA_OFF 0x30 // 7 0 improved mode for AfcLowBetaOff (default)
460
461// RADIOLIB_RF69_REG_TEST_PA1
462#define RADIOLIB_RF69_PA1_NORMAL 0x55 // 7 0 PA_BOOST: none
463#define RADIOLIB_RF69_PA1_20_DBM 0x5D // 7 0 +20 dBm
464
465// RADIOLIB_RF69_REG_TEST_PA2
466#define RADIOLIB_RF69_PA2_NORMAL 0x70 // 7 0 PA_BOOST: none
467#define RADIOLIB_RF69_PA2_20_DBM 0x7C // 7 0 +20 dBm
468
469// RadioLib defaults
470#define RADIOLIB_RF69_DEFAULT_FREQ RADIOLIB_UNIT_MEGA(434)
471#define RADIOLIB_RF69_DEFAULT_BR 4800
472#define RADIOLIB_RF69_DEFAULT_FREQDEV 5000
473#define RADIOLIB_RF69_DEFAULT_RXBW RADIOLIB_UNIT_KILO(125)
474#define RADIOLIB_RF69_DEFAULT_POWER 10
475#define RADIOLIB_RF69_DEFAULT_PREAMBLELEN 16
476#define RADIOLIB_RF69_DEFAULT_SW {0x12, 0xAD}
477#define RADIOLIB_RF69_DEFAULT_SW_LEN 2
478
483class RF69: public PhysicalLayer {
484 public:
485 // introduce PhysicalLayer overloads
491
496 RF69(Module* module); // cppcheck-suppress noExplicitConstructor
497
498 // basic methods
499
507 int16_t begin(const ConfigFSK_t& config);
508
512 void reset();
513
522 int16_t transmit(const uint8_t* data, size_t len, uint8_t addr = 0) override;
523
533 int16_t receive(uint8_t* data, size_t len, RadioLibTime_t timeout = 0) override;
534
539 int16_t sleep() override;
540
545 int16_t standby() override;
546
552 int16_t standby(uint8_t mode) override;
553
559 int16_t transmitDirect(uint32_t frf = 0) override;
560
565 int16_t receiveDirect() override;
566
570 int16_t packetMode();
571
572 // hardware AES support
573
578 void setAESKey(const uint8_t* key);
579
584 int16_t enableAES();
585
590 int16_t disableAES();
591
592 // interrupt methods
593
598 void setDio0Action(void (*func)(void));
599
603 void clearDio0Action();
604
609 void setDio1Action(void (*func)(void));
610
614 void clearDio1Action();
615
620 void setFifoEmptyAction(void (*func)(void));
621
626
633 void setFifoThreshold(uint8_t threshold);
634
639 void setFifoFullAction(void (*func)(void));
640
644 void clearFifoFullAction();
645
653 bool fifoAdd(uint8_t* data, int totalLen, int* remLen);
654
662 bool fifoGet(volatile uint8_t* data, int totalLen, volatile int* rcvLen);
663
672 int16_t startTransmit(const uint8_t* data, size_t len, uint8_t addr = 0) override;
673
678 int16_t startReceive() override;
679
688 int16_t startReceive(uint32_t timeout, uint32_t irqFlags, uint32_t irqMask, size_t len) override;
689
698 int16_t readData(uint8_t* data, size_t len) override;
699
704 int16_t finishReceive() override;
705
706 // configuration methods
707
714 int16_t setFrequency(uint32_t freq) override;
715
721 int16_t getFrequency(uint32_t *freq);
722
728 int16_t setBitRate(uint32_t br) override;
729
737 int16_t setRxBandwidth(uint32_t rxBw);
738
744 int16_t setFrequencyDeviation(uint32_t freqDev) override;
745
751 int16_t getFrequencyDeviation(uint32_t *freqDev);
752
761 int16_t setOutputPower(int8_t power) override;
762
771 int16_t setOutputPower(int8_t power, bool highPower);
772
779 int16_t setSyncWord(uint8_t* syncWord, size_t len) override;
780
787 int16_t setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits);
788
795 int16_t setPreambleLength(size_t len, size_t detLen = 0xFFFFFFFF) override;
796
802 int16_t setNodeAddress(uint8_t nodeAddr);
803
809 int16_t setBroadcastAddress(uint8_t broadAddr);
810
815 int16_t disableAddressFiltering();
816
817 // measurement methods
818
823 void setAmbientTemperature(int16_t tempAmbient);
824
829 int16_t getTemperature();
830
836 size_t getPacketLength(bool update = true) override;
837
844 int16_t setOOK(bool enable);
845
852 int16_t setOokThresholdType(uint8_t type);
853
861 int16_t setOokFixedThreshold(uint8_t value);
862
868 int16_t setOokPeakThresholdDecrement(uint8_t value);
869
875 int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_RF69_MAX_PACKET_LENGTH);
876
882 int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_RF69_MAX_PACKET_LENGTH);
883
889 int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0);
890
895 int16_t disableSyncWordFiltering();
896
902
908
914 int16_t setCrcFiltering(bool enable = true);
915
921 int16_t setPromiscuousMode(bool enable = true);
922
930 int16_t setDataShaping(uint8_t sh) override;
931
938 int16_t setEncoding(uint8_t encoding) override;
939
945 int16_t setLnaTestBoost(bool value);
946
951 float getRSSI() override;
952
958 int16_t setRSSIThreshold(float dbm);
959
961 void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
962
964 void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]);
965
970 uint8_t randomByte() override;
971
976 int16_t getChipVersion();
977
978 #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
983 void setDirectAction(void (*func)(void)) override;
984
989 void readBit(uint32_t pin) override;
990 #endif
991
998 int16_t setDIOMapping(uint32_t pin, uint32_t value);
999
1000#if !RADIOLIB_GODMODE && !RADIOLIB_LOW_LEVEL
1001 protected:
1002#endif
1003 Module* getMod() override;
1004
1005#if !RADIOLIB_GODMODE
1006 protected:
1007#endif
1008 uint32_t bitRate = RADIOLIB_RF69_DEFAULT_BR;
1009 uint32_t rxBandwidth = RADIOLIB_RF69_DEFAULT_RXBW;
1010
1011 int16_t config();
1012 int16_t setMode(uint8_t mode);
1013
1014#if !RADIOLIB_GODMODE
1015 private:
1016#endif
1017 Module* mod;
1018
1019 bool ookEnabled = false;
1020 int16_t tempOffset = 0;
1021 int8_t power = RADIOLIB_RF69_DEFAULT_POWER;
1022
1023 size_t packetLength = 0;
1024 bool packetLengthQueried = false;
1025 uint8_t packetLengthConfig = RADIOLIB_RF69_PACKET_FORMAT_VARIABLE;
1026
1027 bool promiscuous = false;
1028
1029 bool bitSync = true;
1030 bool crcOn = true;
1031 uint16_t preambleLen = 0;
1032 uint8_t syncWordLen = 0;
1033
1034 int16_t directMode();
1035 int16_t setPacketMode(uint8_t mode, uint8_t len);
1036 void clearIRQFlags();
1037 void clearFIFO(size_t count);
1038};
1039
1040#endif
1041
1042#endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition Module.h:74
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code. Note: It is not recommended to use this c...
Definition Module.h:83
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition PhysicalLayer.cpp:235
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition PhysicalLayer.cpp:53
virtual int16_t setSyncWord(uint8_t *sync, size_t len)
Set sync word. Must be implemented in module class if the module supports it.
Definition PhysicalLayer.cpp:310
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition PhysicalLayer.cpp:157
virtual int16_t receive(uint8_t *data, size_t len, RadioLibTime_t timeout=0)
Binary receive method. Must be implemented in module class.
Definition PhysicalLayer.cpp:111
PhysicalLayer()
Default constructor.
Definition PhysicalLayer.cpp:5
int16_t getTemperature()
Measures temperature.
Definition RF69.cpp:788
int16_t setBitRate(uint32_t br) override
Sets bit rate. Allowed values range from 500 bps to 300 kbps.
Definition RF69.cpp:562
int16_t getChipVersion()
Read version SPI register. Should return RF69_CHIP_VERSION (0x24) if SX127x is connected and working.
Definition RF69.cpp:1013
int16_t setCrcFiltering(bool enable=true)
Enable CRC filtering and generation.
Definition RF69.cpp:858
int16_t setDIOMapping(uint32_t pin, uint32_t value)
Configure DIO pin mapping to get a given signal on a DIO pin (if available).
Definition RF69.cpp:997
void clearFifoEmptyAction()
Clears interrupt service routine to call when FIFO is empty.
Definition RF69.cpp:322
int16_t fixedPacketLengthMode(uint8_t len=RADIOLIB_RF69_MAX_PACKET_LENGTH)
Set modem in fixed packet length mode.
Definition RF69.cpp:818
int16_t disableAES()
Disables AES encryption.
Definition RF69.cpp:248
void setFifoFullAction(void(*func)(void))
Set interrupt service routine function to call when FIFO is full.
Definition RF69.cpp:330
int16_t setBroadcastAddress(uint8_t broadAddr)
Sets broadcast address. Calling this method will also enable address filtering for node and broadcast...
Definition RF69.cpp:762
int16_t enableAES()
Enables AES encryption.
Definition RF69.cpp:244
int16_t standby() override
Sets the module to standby mode.
Definition RF69.cpp:173
int16_t setOokThresholdType(uint8_t type)
Selects the type of threshold in the OOK data slicer.
Definition RF69.cpp:509
int16_t transmitDirect(uint32_t frf=0) override
Starts direct mode transmission.
Definition RF69.cpp:186
int16_t setOokFixedThreshold(uint8_t value)
Fixed threshold for the Data Slicer in OOK mode or floor threshold for the Data Slicer in OOK when Pe...
Definition RF69.cpp:516
int16_t begin(const ConfigFSK_t &config)
Initialization method for FSK modem.
Definition RF69.cpp:14
int16_t finishReceive() override
Clean up after reception is done.
Definition RF69.cpp:481
int16_t readData(uint8_t *data, size_t len) override
Reads data received after calling startReceive method. When the packet length is not known in advance...
Definition RF69.cpp:445
int16_t startReceive() override
Interrupt-driven receive method. GDO0 will be activated when full packet is received.
Definition RF69.cpp:252
int16_t disableSyncWordFiltering()
Disable preamble and sync word filtering and generation.
Definition RF69.cpp:835
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:904
int16_t setOokPeakThresholdDecrement(uint8_t value)
Period of decrement of the RSSI threshold in the OOK demodulator.
Definition RF69.cpp:520
int16_t setOutputPower(int8_t power) override
Sets output power. Allowed values range from -18 to 13 dBm for low power modules (RF69C/CW) or -2 to ...
Definition RF69.cpp:662
int16_t setOOK(bool enable)
Enables/disables OOK modulation instead of FSK. Note: This function calls setRxBandwidth again,...
Definition RF69.cpp:490
int16_t setFrequencyDeviation(uint32_t freqDev) override
Sets frequency deviation.
Definition RF69.cpp:629
int16_t disableAddressFiltering()
Disables address filtering. Calling this method will also erase previously set addresses.
Definition RF69.cpp:771
void readBit(uint32_t pin) override
Function to read and process data bit in direct reception mode.
Definition RF69.cpp:992
int16_t enableSyncWordFiltering(uint8_t maxErrBits=0)
Enable sync word filtering and generation.
Definition RF69.cpp:826
int16_t packetMode()
Stops direct mode. It is required to call this method to switch from direct transmissions to packet-b...
Definition RF69.cpp:236
int16_t getFrequencyDeviation(uint32_t *freqDev)
Gets frequency deviation.
Definition RF69.cpp:643
int16_t receive(uint8_t *data, size_t len, RadioLibTime_t timeout=0) override
Blocking binary receive method. Overloads for string-based transmissions are implemented in PhysicalL...
Definition RF69.cpp:139
void setFifoEmptyAction(void(*func)(void))
Set interrupt service routine function to call when FIFO is empty.
Definition RF69.cpp:311
int16_t enableContinuousModeBitSync()
Enable Bit synchronization in continuous mode.
Definition RF69.cpp:840
void setFifoThreshold(uint8_t threshold)
Set FIFO threshold level. Be aware that threshold is also set in setFifoFullAction method....
Definition RF69.cpp:326
int16_t setFrequency(uint32_t freq) override
Sets carrier frequency. Allowed values are in bands 290 to 340 MHz, 431 to 510 MHz and 862 to 1020 MH...
Definition RF69.cpp:524
size_t getPacketLength(bool update=true) override
Query modem for the packet length of received payload.
Definition RF69.cpp:805
int16_t transmit(const 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:108
void clearDio0Action()
Clears interrupt service routine to call when DIO0 activates.
Definition RF69.cpp:292
int16_t disableContinuousModeBitSync()
Disable Bit synchronization in continuous mode.
Definition RF69.cpp:849
void setDirectAction(void(*func)(void)) override
Set interrupt service routine function to call when data bit is received in direct mode.
Definition RF69.cpp:988
int16_t getFrequency(uint32_t *freq)
Gets carrier frequency.
Definition RF69.cpp:547
void setDio0Action(void(*func)(void))
Sets interrupt service routine to call when DIO0 activates.
Definition RF69.cpp:288
int16_t setLnaTestBoost(bool value)
Enable/disable LNA Boost mode (disabled by default).
Definition RF69.cpp:942
bool fifoGet(volatile uint8_t *data, int totalLen, volatile int *rcvLen)
Set interrupt service routine function to call when FIFO is sufficiently full to read.
Definition RF69.cpp:367
void setDio1Action(void(*func)(void))
Sets interrupt service routine to call when DIO1 activates.
Definition RF69.cpp:296
void setAESKey(const uint8_t *key)
Sets AES key.
Definition RF69.cpp:240
int16_t setEncoding(uint8_t encoding) override
Sets transmission encoding. Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER an...
Definition RF69.cpp:924
int16_t setRxBandwidth(uint32_t rxBw)
Sets FSK receiver bandwidth. Allowed values range from 5200 Hz to 1000 kHz. Only available in FSK mod...
Definition RF69.cpp:584
bool fifoAdd(uint8_t *data, int totalLen, int *remLen)
Set interrupt service routine function to call when FIFO is empty.
Definition RF69.cpp:344
int16_t setNodeAddress(uint8_t nodeAddr)
Sets node address. Calling this method will also enable address filtering for node address only.
Definition RF69.cpp:753
int16_t setSyncWord(uint8_t *syncWord, size_t len) override
Sets sync word. Up to 8 bytes can be set as sync word. Override for PhysicalLayer compatibility,...
Definition RF69.cpp:708
int16_t receiveDirect() override
Starts direct mode reception.
Definition RF69.cpp:207
void setRfSwitchPins(uint32_t rxEn, uint32_t txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition RF69.cpp:960
void setAmbientTemperature(int16_t tempAmbient)
Sets ambient temperature. Required to correct values from on-board temperature sensor.
Definition RF69.cpp:784
uint8_t randomByte() override
Get one truly random byte from RSSI noise.
Definition RF69.cpp:968
int16_t setPreambleLength(size_t len, size_t detLen=0xFFFFFFFF) override
Sets preamble length.
Definition RF69.cpp:738
void clearDio1Action()
Clears interrupt service routine to call when DIO1 activates.
Definition RF69.cpp:304
int16_t sleep() override
Sets the module to sleep mode.
Definition RF69.cpp:165
int16_t setPromiscuousMode(bool enable=true)
Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address,...
Definition RF69.cpp:866
void clearFifoFullAction()
Clears interrupt service routine to call when FIFO is full.
Definition RF69.cpp:339
float getRSSI() override
Gets RSSI (Received Signal Strength Indicator) of the last received packet.
Definition RF69.cpp:950
int16_t variablePacketLengthMode(uint8_t maxLen=RADIOLIB_RF69_MAX_PACKET_LENGTH)
Set modem in variable packet length mode.
Definition RF69.cpp:822
int16_t startTransmit(const 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:389
void reset()
Reset method. Will reset the chip to the default state using RST pin.
Definition RF69.cpp:100
RF69(Module *module)
Default constructor.
Definition RF69.cpp:5
int16_t setRSSIThreshold(float dbm)
Sets the RSSI value above which the RSSI interrupt is signaled.
Definition RF69.cpp:954
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 RF69.cpp:964
unsigned long RadioLibTime_t
Type used for durations in RadioLib.
Definition TypeDef.h:783
Definition PhysicalLayer.h:310
Description of RF switch pin states for a single mode. See setRfSwitchTable for details.
Definition Module.h:90