RadioLib
Universal wireless communication library for Arduino
Si443x.h
1 #if !defined(_RADIOLIB_SI443X_H)
2 #define _RADIOLIB_SI443X_H
3 
4 #include "../../TypeDef.h"
5 
6 #if !RADIOLIB_EXCLUDE_SI443X
7 
8 #include "../../Module.h"
9 
10 #include "../../protocols/PhysicalLayer/PhysicalLayer.h"
11 
12 // Si443x physical layer properties
13 #define RADIOLIB_SI443X_FREQUENCY_STEP_SIZE 156.25
14 #define RADIOLIB_SI443X_MAX_PACKET_LENGTH 64
15 
16 // Si443x series common registers
17 #define RADIOLIB_SI443X_REG_DEVICE_TYPE 0x00
18 #define RADIOLIB_SI443X_REG_DEVICE_VERSION 0x01
19 #define RADIOLIB_SI443X_REG_DEVICE_STATUS 0x02
20 #define RADIOLIB_SI443X_REG_INTERRUPT_STATUS_1 0x03
21 #define RADIOLIB_SI443X_REG_INTERRUPT_STATUS_2 0x04
22 #define RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1 0x05
23 #define RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2 0x06
24 #define RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1 0x07
25 #define RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2 0x08
26 #define RADIOLIB_SI443X_REG_XOSC_LOAD_CAPACITANCE 0x09
27 #define RADIOLIB_SI443X_REG_MCU_OUTPUT_CLOCK 0x0A
28 #define RADIOLIB_SI443X_REG_GPIO0_CONFIG 0x0B
29 #define RADIOLIB_SI443X_REG_GPIO1_CONFIG 0x0C
30 #define RADIOLIB_SI443X_REG_GPIO2_CONFIG 0x0D
31 #define RADIOLIB_SI443X_REG_IO_PORT_CONFIG 0x0E
32 #define RADIOLIB_SI443X_REG_ADC_CONFIG 0x0F
33 #define RADIOLIB_SI443X_REG_ADC_SENSOR_AMP_OFFSET 0x10
34 #define RADIOLIB_SI443X_REG_ADC_VALUE 0x11
35 #define RADIOLIB_SI443X_REG_TEMP_SENSOR_CONTROL 0x12
36 #define RADIOLIB_SI443X_REG_TEMP_VALUE_OFFSET 0x13
37 #define RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_1 0x14
38 #define RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_2 0x15
39 #define RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_3 0x16
40 #define RADIOLIB_SI443X_REG_WAKEUP_TIMER_VALUE_1 0x17
41 #define RADIOLIB_SI443X_REG_WAKEUP_TIMER_VALUE_2 0x18
42 #define RADIOLIB_SI443X_REG_LOW_DC_MODE_DURATION 0x19
43 #define RADIOLIB_SI443X_REG_LOW_BATT_DET_THRESHOLD 0x1A
44 #define RADIOLIB_SI443X_REG_BATT_VOLTAGE_LEVEL 0x1B
45 #define RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH 0x1C
46 #define RADIOLIB_SI443X_REG_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1D
47 #define RADIOLIB_SI443X_REG_AFC_TIMING_CONTROL 0x1E
48 #define RADIOLIB_SI443X_REG_CLOCK_REC_GEARSHIFT_OVERRIDE 0x1F
49 #define RADIOLIB_SI443X_REG_CLOCK_REC_OVERSAMP_RATIO 0x20
50 #define RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_2 0x21
51 #define RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_1 0x22
52 #define RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_0 0x23
53 #define RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_1 0x24
54 #define RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_0 0x25
55 #define RADIOLIB_SI443X_REG_RSSI 0x26
56 #define RADIOLIB_SI443X_REG_RSSI_CLEAR_CHANNEL_THRESHOLD 0x27
57 #define RADIOLIB_SI443X_REG_ANTENNA_DIVERSITY_1 0x28
58 #define RADIOLIB_SI443X_REG_ANTENNA_DIVERSITY_2 0x29
59 #define RADIOLIB_SI443X_REG_AFC_LIMITER 0x2A
60 #define RADIOLIB_SI443X_REG_AFC_CORRECTION 0x2B
61 #define RADIOLIB_SI443X_REG_OOK_COUNTER_1 0x2C
62 #define RADIOLIB_SI443X_REG_OOK_COUNTER_2 0x2D
63 #define RADIOLIB_SI443X_REG_SLICER_PEAK_HOLD 0x2E
64 #define RADIOLIB_SI443X_REG_DATA_ACCESS_CONTROL 0x30
65 #define RADIOLIB_SI443X_REG_EZMAC_STATUS 0x31
66 #define RADIOLIB_SI443X_REG_HEADER_CONTROL_1 0x32
67 #define RADIOLIB_SI443X_REG_HEADER_CONTROL_2 0x33
68 #define RADIOLIB_SI443X_REG_PREAMBLE_LENGTH 0x34
69 #define RADIOLIB_SI443X_REG_PREAMBLE_DET_CONTROL 0x35
70 #define RADIOLIB_SI443X_REG_SYNC_WORD_3 0x36
71 #define RADIOLIB_SI443X_REG_SYNC_WORD_2 0x37
72 #define RADIOLIB_SI443X_REG_SYNC_WORD_1 0x38
73 #define RADIOLIB_SI443X_REG_SYNC_WORD_0 0x39
74 #define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_3 0x3A
75 #define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_2 0x3B
76 #define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_1 0x3C
77 #define RADIOLIB_SI443X_REG_TRANSMIT_HEADER_0 0x3D
78 #define RADIOLIB_SI443X_REG_TRANSMIT_PACKET_LENGTH 0x3E
79 #define RADIOLIB_SI443X_REG_CHECK_HEADER_3 0x3F
80 #define RADIOLIB_SI443X_REG_CHECK_HEADER_2 0x40
81 #define RADIOLIB_SI443X_REG_CHECK_HEADER_1 0x41
82 #define RADIOLIB_SI443X_REG_CHECK_HEADER_0 0x42
83 #define RADIOLIB_SI443X_REG_HEADER_ENABLE_3 0x43
84 #define RADIOLIB_SI443X_REG_HEADER_ENABLE_2 0x44
85 #define RADIOLIB_SI443X_REG_HEADER_ENABLE_1 0x45
86 #define RADIOLIB_SI443X_REG_HEADER_ENABLE_0 0x46
87 #define RADIOLIB_SI443X_REG_RECEIVED_HEADER_3 0x47
88 #define RADIOLIB_SI443X_REG_RECEIVED_HEADER_2 0x48
89 #define RADIOLIB_SI443X_REG_RECEIVED_HEADER_1 0x49
90 #define RADIOLIB_SI443X_REG_RECEIVED_HEADER_0 0x4A
91 #define RADIOLIB_SI443X_REG_RECEIVED_PACKET_LENGTH 0x4B
92 #define RADIOLIB_SI443X_REG_ADC8_CONTROL 0x4F
93 #define RADIOLIB_SI443X_REG_CHANNEL_FILTER_COEFF 0x60
94 #define RADIOLIB_SI443X_REG_XOSC_CONTROL_TEST 0x62
95 #define RADIOLIB_SI443X_REG_AGC_OVERRIDE_1 0x69
96 #define RADIOLIB_SI443X_REG_TX_POWER 0x6D
97 #define RADIOLIB_SI443X_REG_TX_DATA_RATE_1 0x6E
98 #define RADIOLIB_SI443X_REG_TX_DATA_RATE_0 0x6F
99 #define RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1 0x70
100 #define RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2 0x71
101 #define RADIOLIB_SI443X_REG_FREQUENCY_DEVIATION 0x72
102 #define RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_1 0x73
103 #define RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_2 0x74
104 #define RADIOLIB_SI443X_REG_FREQUENCY_BAND_SELECT 0x75
105 #define RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_1 0x76
106 #define RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_0 0x77
107 #define RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_CHANNEL_SEL 0x79
108 #define RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_STEP_SIZE 0x7A
109 #define RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_1 0x7C
110 #define RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_2 0x7D
111 #define RADIOLIB_SI443X_REG_RX_FIFO_CONTROL 0x7E
112 #define RADIOLIB_SI443X_REG_FIFO_ACCESS 0x7F
113 
114 // RADIOLIB_SI443X_REG_DEVICE_TYPE MSB LSB DESCRIPTION
115 #define RADIOLIB_SI443X_DEVICE_TYPE 0x08 // 4 0 device identification register
116 
117 // RADIOLIB_SI443X_REG_DEVICE_VERSION
118 #define RADIOLIB_SI443X_DEVICE_VERSION 0x06 // 4 0 chip version register
119 
120 // RADIOLIB_SI443X_REG_DEVICE_STATUS
121 #define RADIOLIB_SI443X_RX_TX_FIFO_OVERFLOW 0b10000000 // 7 7 Rx/Tx FIFO overflow flag
122 #define RADIOLIB_SI443X_RX_TX_FIFO_UNDERFLOW 0b01000000 // 6 6 Rx/Tx FIFO underflow flag
123 #define RADIOLIB_SI443X_RX_FIFO_EMPTY 0b00100000 // 5 5 Rx FIFO empty flag
124 #define RADIOLIB_SI443X_HEADER_ERROR 0b00010000 // 4 4 header error flag
125 #define RADIOLIB_SI443X_FREQUENCY_ERROR 0b00001000 // 3 3 frequency error flag (frequency outside allowed range)
126 #define RADIOLIB_SI443X_TX 0b00000010 // 1 0 power state: Tx
127 #define RADIOLIB_SI443X_RX 0b00000001 // 1 0 Rx
128 #define RADIOLIB_SI443X_IDLE 0b00000000 // 1 0 idle
129 
130 // RADIOLIB_SI443X_REG_INTERRUPT_STATUS_1
131 #define RADIOLIB_SI443X_FIFO_LEVEL_ERROR_INTERRUPT 0b10000000 // 7 7 Tx/Rx FIFO overflow or underflow
132 #define RADIOLIB_SI443X_TX_FIFO_ALMOST_FULL_INTERRUPT 0b01000000 // 6 6 Tx FIFO almost full
133 #define RADIOLIB_SI443X_TX_FIFO_ALMOST_EMPTY_INTERRUPT 0b00100000 // 5 5 Tx FIFO almost empty
134 #define RADIOLIB_SI443X_RX_FIFO_ALMOST_FULL_INTERRUPT 0b00010000 // 4 4 Rx FIFO almost full
135 #define RADIOLIB_SI443X_EXTERNAL_INTERRUPT 0b00001000 // 3 3 external interrupt occurred on GPIOx
136 #define RADIOLIB_SI443X_PACKET_SENT_INTERRUPT 0b00000100 // 2 2 packet transmission done
137 #define RADIOLIB_SI443X_VALID_PACKET_RECEIVED_INTERRUPT 0b00000010 // 1 1 valid packet has been received
138 #define RADIOLIB_SI443X_CRC_ERROR_INTERRUPT 0b00000001 // 0 0 CRC failed
139 
140 // RADIOLIB_SI443X_REG_INTERRUPT_STATUS_2
141 #define RADIOLIB_SI443X_SYNC_WORD_DETECTED_INTERRUPT 0b10000000 // 7 7 sync word has been detected
142 #define RADIOLIB_SI443X_VALID_RADIOLIB_PREAMBLE_DETECTED_INTERRUPT 0b01000000 // 6 6 valid preamble has been detected
143 #define RADIOLIB_SI443X_INVALID_RADIOLIB_PREAMBLE_DETECTED_INTERRUPT 0b00100000 // 5 5 invalid preamble has been detected
144 #define RADIOLIB_SI443X_RSSI_INTERRUPT 0b00010000 // 4 4 RSSI exceeded programmed threshold
145 #define RADIOLIB_SI443X_WAKEUP_TIMER_INTERRUPT 0b00001000 // 3 3 wake-up timer expired
146 #define RADIOLIB_SI443X_LOW_BATTERY_INTERRUPT 0b00000100 // 2 2 low battery detected
147 #define RADIOLIB_SI443X_CHIP_READY_INTERRUPT 0b00000010 // 1 1 chip ready event detected
148 #define RADIOLIB_SI443X_POWER_ON_RESET_INTERRUPT 0b00000001 // 0 0 power-on-reset detected
149 
150 // RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_1
151 #define RADIOLIB_SI443X_FIFO_LEVEL_ERROR_ENABLED 0b10000000 // 7 7 Tx/Rx FIFO overflow or underflow interrupt enabled
152 #define RADIOLIB_SI443X_TX_FIFO_ALMOST_FULL_ENABLED 0b01000000 // 6 6 Tx FIFO almost full interrupt enabled
153 #define RADIOLIB_SI443X_TX_FIFO_ALMOST_EMPTY_ENABLED 0b00100000 // 5 5 Tx FIFO almost empty interrupt enabled
154 #define RADIOLIB_SI443X_RX_FIFO_ALMOST_FULL_ENABLED 0b00010000 // 4 4 Rx FIFO almost full interrupt enabled
155 #define RADIOLIB_SI443X_EXTERNAL_ENABLED 0b00001000 // 3 3 external interrupt interrupt enabled
156 #define RADIOLIB_SI443X_PACKET_SENT_ENABLED 0b00000100 // 2 2 packet transmission done interrupt enabled
157 #define RADIOLIB_SI443X_VALID_PACKET_RECEIVED_ENABLED 0b00000010 // 1 1 valid packet received interrupt enabled
158 #define RADIOLIB_SI443X_CRC_ERROR_ENABLED 0b00000001 // 0 0 CRC failed interrupt enabled
159 
160 // RADIOLIB_SI443X_REG_INTERRUPT_ENABLE_2
161 #define RADIOLIB_SI443X_SYNC_WORD_DETECTED_ENABLED 0b10000000 // 7 7 sync word interrupt enabled
162 #define RADIOLIB_SI443X_VALID_RADIOLIB_PREAMBLE_DETECTED_ENABLED 0b01000000 // 6 6 valid preamble interrupt enabled
163 #define RADIOLIB_SI443X_INVALID_RADIOLIB_PREAMBLE_DETECTED_ENABLED 0b00100000 // 5 5 invalid preamble interrupt enabled
164 #define RADIOLIB_SI443X_RSSI_ENABLED 0b00010000 // 4 4 RSSI exceeded programmed threshold interrupt enabled
165 #define RADIOLIB_SI443X_WAKEUP_TIMER_ENABLED 0b00001000 // 3 3 wake-up timer interrupt enabled
166 #define RADIOLIB_SI443X_LOW_BATTERY_ENABLED 0b00000100 // 2 2 low battery interrupt enabled
167 #define RADIOLIB_SI443X_CHIP_READY_ENABLED 0b00000010 // 1 1 chip ready event interrupt enabled
168 #define RADIOLIB_SI443X_POWER_ON_RESET_ENABLED 0b00000001 // 0 0 power-on-reset interrupt enabled
169 
170 // RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_1
171 #define RADIOLIB_SI443X_SOFTWARE_RESET 0b10000000 // 7 7 reset all registers to default values
172 #define RADIOLIB_SI443X_ENABLE_LOW_BATTERY_DETECT 0b01000000 // 6 6 enable low battery detection
173 #define RADIOLIB_SI443X_ENABLE_WAKEUP_TIMER 0b00100000 // 5 5 enable wakeup timer
174 #define RADIOLIB_SI443X_32_KHZ_RC 0b00000000 // 4 4 32.768 kHz source: RC oscillator (default)
175 #define RADIOLIB_SI443X_32_KHZ_XOSC 0b00010000 // 4 4 crystal oscillator
176 #define RADIOLIB_SI443X_TX_ON 0b00001000 // 3 3 Tx on in manual transmit mode
177 #define RADIOLIB_SI443X_RX_ON 0b00000100 // 2 2 Rx on in manual receive mode
178 #define RADIOLIB_SI443X_PLL_ON 0b00000010 // 1 1 PLL on (tune mode)
179 #define RADIOLIB_SI443X_XTAL_OFF 0b00000000 // 0 0 crystal oscillator: off (standby mode)
180 #define RADIOLIB_SI443X_XTAL_ON 0b00000001 // 0 0 on (ready mode)
181 
182 // RADIOLIB_SI443X_REG_OP_FUNC_CONTROL_2
183 #define RADIOLIB_SI443X_ANT_DIV_TR_HL_IDLE_L 0b00000000 // 7 5 GPIO1/2 states: Tx/Rx GPIO1 H, GPIO2 L; idle low (default)
184 #define RADIOLIB_SI443X_ANT_DIV_TR_LH_IDLE_L 0b00100000 // 7 5 Tx/Rx GPIO1 L, GPIO2 H; idle low
185 #define RADIOLIB_SI443X_ANT_DIV_TR_HL_IDLE_H 0b01000000 // 7 5 Tx/Rx GPIO1 H, GPIO2 L; idle high
186 #define RADIOLIB_SI443X_ANT_DIV_TR_LH_IDLE_H 0b01100000 // 7 5 Tx/Rx GPIO1 L, GPIO2 H; idle high
187 #define RADIOLIB_SI443X_ANT_DIV_TR_ALG_IDLE_L 0b10000000 // 7 5 Tx/Rx diversity algorithm; idle low
188 #define RADIOLIB_SI443X_ANT_DIV_TR_ALG_IDLE_H 0b10100000 // 7 5 Tx/Rx diversity algorithm; idle high
189 #define RADIOLIB_SI443X_ANT_DIV_TR_ALG_BEACON_IDLE_L 0b11000000 // 7 5 Tx/Rx diversity algorithm (beacon); idle low
190 #define RADIOLIB_SI443X_ANT_DIV_TR_ALG_BEACON_IDLE_H 0b11100000 // 7 5 Tx/Rx diversity algorithm (beacon); idle high
191 #define RADIOLIB_SI443X_RX_MULTIPACKET_OFF 0b00000000 // 4 4 Rx multipacket: disabled (default)
192 #define RADIOLIB_SI443X_RX_MULTIPACKET_ON 0b00010000 // 4 4 enabled
193 #define RADIOLIB_SI443X_AUTO_TX_OFF 0b00000000 // 3 3 Tx autotransmit on FIFO almost full: disabled (default)
194 #define RADIOLIB_SI443X_AUTO_TX_ON 0b00001000 // 3 3 enabled
195 #define RADIOLIB_SI443X_LOW_DUTY_CYCLE_OFF 0b00000000 // 2 2 low duty cycle mode: disabled (default)
196 #define RADIOLIB_SI443X_LOW_DUTY_CYCLE_ON 0b00000100 // 2 2 enabled
197 #define RADIOLIB_SI443X_RX_FIFO_RESET 0b00000010 // 1 1 Rx FIFO reset/clear: reset (call first)
198 #define RADIOLIB_SI443X_RX_FIFO_CLEAR 0b00000000 // 1 1 clear (call second)
199 #define RADIOLIB_SI443X_TX_FIFO_RESET 0b00000001 // 0 0 Tx FIFO reset/clear: reset (call first)
200 #define RADIOLIB_SI443X_TX_FIFO_CLEAR 0b00000000 // 0 0 clear (call second)
201 
202 // RADIOLIB_SI443X_REG_XOSC_LOAD_CAPACITANCE
203 #define RADIOLIB_SI443X_XTAL_SHIFT 0b00000000 // 7 7 crystal capacitance configuration:
204 #define RADIOLIB_SI443X_XTAL_LOAD_CAPACITANCE 0b01111111 // 6 0 C_int = 1.8 pF + 0.085 pF * RADIOLIB_SI443X_XTAL_LOAD_CAPACITANCE + 3.7 pF * RADIOLIB_SI443X_XTAL_SHIFT
205 
206 // RADIOLIB_SI443X_REG_MCU_OUTPUT_CLOCK
207 #define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_OFF 0b00000000 // 5 4 additional clock cycles: none (default)
208 #define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_128 0b00010000 // 5 4 128
209 #define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_256 0b00100000 // 5 4 256
210 #define RADIOLIB_SI443X_CLOCK_TAIL_CYCLES_512 0b00110000 // 5 4 512
211 #define RADIOLIB_SI443X_LOW_FREQ_CLOCK_OFF 0b00000000 // 3 3 32.768 kHz clock output: disabled (default)
212 #define RADIOLIB_SI443X_LOW_FREQ_CLOCK_ON 0b00001000 // 3 3 enabled
213 #define RADIOLIB_SI443X_MCU_CLOCK_30_MHZ 0b00000000 // 2 0 GPIO clock output: 30 MHz
214 #define RADIOLIB_SI443X_MCU_CLOCK_15_MHZ 0b00000001 // 2 0 15 MHz
215 #define RADIOLIB_SI443X_MCU_CLOCK_10_MHZ 0b00000010 // 2 0 10 MHz
216 #define RADIOLIB_SI443X_MCU_CLOCK_4_MHZ 0b00000011 // 2 0 4 MHz
217 #define RADIOLIB_SI443X_MCU_CLOCK_3_MHZ 0b00000100 // 2 0 3 MHz
218 #define RADIOLIB_SI443X_MCU_CLOCK_2_MHZ 0b00000101 // 2 0 2 MHz
219 #define RADIOLIB_SI443X_MCU_CLOCK_1_MHZ 0b00000110 // 2 0 1 MHz (default)
220 #define RADIOLIB_SI443X_MCU_CLOCK_32_KHZ 0b00000111 // 2 0 32.768 kHz
221 
222 // RADIOLIB_SI443X_REG_GPIO0_CONFIG + RADIOLIB_SI443X_REG_GPIO1_CONFIG + RADIOLIB_SI443X_REG_GPIO2_CONFIG
223 #define RADIOLIB_SI443X_GPIOX_DRIVE_STRENGTH 0b00000000 // 7 6 GPIOx drive strength (higher number = stronger drive)
224 #define RADIOLIB_SI443X_GPIOX_PULLUP_OFF 0b00000000 // 5 5 GPIOx internal 200k pullup: disabled (default)
225 #define RADIOLIB_SI443X_GPIOX_PULLUP_ON 0b00100000 // 5 5 enabled
226 #define RADIOLIB_SI443X_GPIO0_POWER_ON_RESET_OUT 0b00000000 // 4 0 GPIOx function: power-on-reset output (GPIO0 only, default)
227 #define RADIOLIB_SI443X_GPIO1_POWER_ON_RESET_INV_OUT 0b00000000 // 4 0 inverted power-on-reset output (GPIO1 only, default)
228 #define RADIOLIB_SI443X_GPIO2_MCU_CLOCK_OUT 0b00000000 // 4 0 MCU clock output (GPIO2 only, default)
229 #define RADIOLIB_SI443X_GPIOX_WAKEUP_OUT 0b00000001 // 4 0 wakeup timer expired output
230 #define RADIOLIB_SI443X_GPIOX_LOW_BATTERY_OUT 0b00000010 // 4 0 low battery detect output
231 #define RADIOLIB_SI443X_GPIOX_DIGITAL_OUT 0b00000011 // 4 0 direct digital output
232 #define RADIOLIB_SI443X_GPIOX_EXT_INT_FALLING_IN 0b00000100 // 4 0 external interrupt, falling edge
233 #define RADIOLIB_SI443X_GPIOX_EXT_INT_RISING_IN 0b00000101 // 4 0 external interrupt, rising edge
234 #define RADIOLIB_SI443X_GPIOX_EXT_INT_CHANGE_IN 0b00000110 // 4 0 external interrupt, state change
235 #define RADIOLIB_SI443X_GPIOX_ADC_IN 0b00000111 // 4 0 ADC analog input
236 #define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_N_IN 0b00001000 // 4 0 analog test N input
237 #define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_P_IN 0b00001001 // 4 0 analog test P input
238 #define RADIOLIB_SI443X_GPIOX_DIGITAL_IN 0b00001010 // 4 0 direct digital input
239 #define RADIOLIB_SI443X_GPIOX_DIGITAL_TEST_OUT 0b00001011 // 4 0 digital test output
240 #define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_N_OUT 0b00001100 // 4 0 analog test N output
241 #define RADIOLIB_SI443X_GPIOX_ANALOG_TEST_P_OUT 0b00001101 // 4 0 analog test P output
242 #define RADIOLIB_SI443X_GPIOX_REFERENCE_VOLTAGE_OUT 0b00001110 // 4 0 reference voltage output
243 #define RADIOLIB_SI443X_GPIOX_TX_RX_DATA_CLK_OUT 0b00001111 // 4 0 Tx/Rx clock output in direct mode
244 #define RADIOLIB_SI443X_GPIOX_TX_DATA_IN 0b00010000 // 4 0 Tx data input direct mode
245 #define RADIOLIB_SI443X_GPIOX_EXT_RETRANSMIT_REQUEST_IN 0b00010001 // 4 0 external retransmission request input
246 #define RADIOLIB_SI443X_GPIOX_TX_STATE_OUT 0b00010010 // 4 0 Tx state output
247 #define RADIOLIB_SI443X_GPIOX_TX_FIFO_ALMOST_FULL_OUT 0b00010011 // 4 0 Tx FIFO almost full output
248 #define RADIOLIB_SI443X_GPIOX_RX_DATA_OUT 0b00010100 // 4 0 Rx data output
249 #define RADIOLIB_SI443X_GPIOX_RX_STATE_OUT 0b00010101 // 4 0 Rx state output
250 #define RADIOLIB_SI443X_GPIOX_RX_FIFO_ALMOST_FULL_OUT 0b00010110 // 4 0 Rx FIFO almost full output
251 #define RADIOLIB_SI443X_GPIOX_ANT_DIV_1_OUT 0b00010111 // 4 0 antenna diversity output 1
252 #define RADIOLIB_SI443X_GPIOX_ANT_DIV_2_OUT 0b00011000 // 4 0 antenna diversity output 2
253 #define RADIOLIB_SI443X_GPIOX_VALID_PREAMBLE_OUT 0b00011001 // 4 0 valid preamble detected output
254 #define RADIOLIB_SI443X_GPIOX_INVALID_PREAMBLE_OUT 0b00011010 // 4 0 invalid preamble detected output
255 #define RADIOLIB_SI443X_GPIOX_SYNC_WORD_DETECTED_OUT 0b00011011 // 4 0 sync word detected output
256 #define RADIOLIB_SI443X_GPIOX_CLEAR_CHANNEL_OUT 0b00011100 // 4 0 clear channel assessment output
257 #define RADIOLIB_SI443X_GPIOX_VDD 0b00011101 // 4 0 VDD
258 #define RADIOLIB_SI443X_GPIOX_GND 0b00011110 // 4 0 GND
259 
260 // RADIOLIB_SI443X_REG_IO_PORT_CONFIG
261 #define RADIOLIB_SI443X_GPIO2_EXT_INT_STATE_MASK 0b01000000 // 6 6 external interrupt state mask for: GPIO2
262 #define RADIOLIB_SI443X_GPIO1_EXT_INT_STATE_MASK 0b00100000 // 5 5 GPIO1
263 #define RADIOLIB_SI443X_GPIO0_EXT_INT_STATE_MASK 0b00010000 // 4 4 GPIO0
264 #define RADIOLIB_SI443X_IRQ_BY_SDO_OFF 0b00000000 // 3 3 output IRQ state on SDO pin: disabled (default)
265 #define RADIOLIB_SI443X_IRQ_BY_SDO_ON 0b00001000 // 3 3 enabled
266 #define RADIOLIB_SI443X_GPIO2_DIGITAL_STATE_MASK 0b00000100 // 2 2 digital state mask for: GPIO2
267 #define RADIOLIB_SI443X_GPIO1_DIGITAL_STATE_MASK 0b00000010 // 1 1 GPIO1
268 #define RADIOLIB_SI443X_GPIO0_DIGITAL_STATE_MASK 0b00000001 // 0 0 GPIO0
269 
270 // RADIOLIB_SI443X_REG_ADC_CONFIG
271 #define RADIOLIB_SI443X_ADC_START 0b10000000 // 7 7 ADC control: start measurement
272 #define RADIOLIB_SI443X_ADC_RUNNING 0b00000000 // 7 7 measurement in progress
273 #define RADIOLIB_SI443X_ADC_DONE 0b10000000 // 7 7 done
274 #define RADIOLIB_SI443X_ADC_SOURCE_TEMPERATURE 0b00000000 // 6 4 ADC source: internal temperature sensor (default)
275 #define RADIOLIB_SI443X_ADC_SOURCE_GPIO0_SINGLE 0b00010000 // 6 4 single-ended on GPIO0
276 #define RADIOLIB_SI443X_ADC_SOURCE_GPIO1_SINGLE 0b00100000 // 6 4 single-ended on GPIO1
277 #define RADIOLIB_SI443X_ADC_SOURCE_GPIO2_SINGLE 0b00110000 // 6 4 single-ended on GPIO2
278 #define RADIOLIB_SI443X_ADC_SOURCE_GPIO01_DIFF 0b01000000 // 6 4 differential on GPIO0 (+) and GPIO1 (-)
279 #define RADIOLIB_SI443X_ADC_SOURCE_GPIO12_DIFF 0b01010000 // 6 4 differential on GPIO1 (+) and GPIO2 (-)
280 #define RADIOLIB_SI443X_ADC_SOURCE_GPIO02_DIFF 0b01100000 // 6 4 differential on GPIO0 (+) and GPIO2 (-)
281 #define RADIOLIB_SI443X_ADC_SOURCE_GND 0b01110000 // 6 4 GND
282 #define RADIOLIB_SI443X_ADC_REFERNCE_BAND_GAP 0b00000000 // 3 2 ADC reference: internal bandgap 1.2 V (default)
283 #define RADIOLIB_SI443X_ADC_REFERNCE_VDD_3 0b00001000 // 3 2 VDD/3
284 #define RADIOLIB_SI443X_ADC_REFERNCE_VDD_2 0b00001100 // 3 2 VDD/2
285 #define RADIOLIB_SI443X_ADC_GAIN 0b00000000 // 1 0 ADC amplifier gain
286 
287 // RADIOLIB_SI443X_REG_ADC_SENSOR_AMP_OFFSET
288 #define RADIOLIB_SI443X_ADC_OFFSET 0b00000000 // 3 0 ADC offset
289 
290 // RADIOLIB_SI443X_REG_TEMP_SENSOR_CONTROL
291 #define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_64_TO_64_C 0b00000000 // 7 6 temperature sensor range: -64 to 64 deg. C, 0.5 deg. C resolution (default)
292 #define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_64_TO_192_C 0b01000000 // 7 6 -64 to 192 deg. C, 1.0 deg. C resolution
293 #define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_0_TO_128_C 0b11000000 // 7 6 0 to 128 deg. C, 0.5 deg. C resolution
294 #define RADIOLIB_SI443X_TEMP_SENSOR_RANGE_40_TO_216_F 0b10000000 // 7 6 -40 to 216 deg. F, 1.0 deg. F resolution
295 #define RADIOLIB_SI443X_TEMP_SENSOR_KELVIN_TO_CELSIUS_OFF 0b00000000 // 5 5 Kelvin to Celsius offset: disabled
296 #define RADIOLIB_SI443X_TEMP_SENSOR_KELVIN_TO_CELSIUS_ON 0b00100000 // 5 5 enabled (default)
297 #define RADIOLIB_SI443X_TEMP_SENSOR_TRIM_OFF 0b00000000 // 4 4 temperature sensor trim: disabled (default)
298 #define RADIOLIB_SI443X_TEMP_SENSOR_TRIM_ON 0b00010000 // 4 4 enabled
299 #define RADIOLIB_SI443X_TEMP_SENSOR_TRIM_VALUE 0b00000000 // 3 0 temperature sensor trim value
300 
301 // RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_1
302 #define RADIOLIB_SI443X_WAKEUP_TIMER_EXPONENT 0b00000011 // 4 0 wakeup timer value exponent
303 
304 // RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_2 + RADIOLIB_SI443X_REG_WAKEUP_TIMER_PERIOD_3
305 #define RADIOLIB_SI443X_WAKEUP_TIMER_MANTISSA_MSB 0x00 // 7 0 wakeup timer value:
306 #define RADIOLIB_SI443X_WAKEUP_TIMER_MANTISSA_LSB 0x01 // 7 0 T = (4 * RADIOLIB_SI443X_WAKEUP_TIMER_MANTISSA * 2 ^ RADIOLIB_SI443X_WAKEUP_TIMER_EXPONENT) / 32.768 ms
307 
308 // RADIOLIB_SI443X_REG_LOW_DC_MODE_DURATION
309 #define RADIOLIB_SI443X_LOW_DC_MODE_DURATION_MANTISSA 0x01 // 7 0 low duty cycle mode duration: T = (4 * RADIOLIB_SI443X_LOW_DC_MODE_DURATION_MANTISSA * 2 ^ RADIOLIB_SI443X_WAKEUP_TIMER_EXPONENT) / 32.768 ms
310 
311 // RADIOLIB_SI443X_REG_LOW_BATT_DET_THRESHOLD
312 #define RADIOLIB_SI443X_LOW_BATT_DET_THRESHOLD 0b00010100 // 4 0 low battery detection threshold: Vth = 1.7 + RADIOLIB_SI443X_LOW_BATT_DET_THRESHOLD * 0.05 V (defaults to 2.7 V)
313 
314 // RADIOLIB_SI443X_REG_IF_FILTER_BANDWIDTH
315 #define RADIOLIB_SI443X_BYPASS_DEC_BY_3_OFF 0b00000000 // 7 7 bypass decimate-by-3 stage: disabled (default)
316 #define RADIOLIB_SI443X_BYPASS_DEC_BY_3_ON 0b10000000 // 7 7 enabled
317 #define RADIOLIB_SI443X_IF_FILTER_DEC_RATE 0b00000000 // 6 4 IF filter decimation rate
318 #define RADIOLIB_SI443X_IF_FILTER_COEFF_SET 0b00000001 // 3 0 IF filter coefficient set selection
319 
320 // RADIOLIB_SI443X_REG_AFC_LOOP_GEARSHIFT_OVERRIDE
321 #define RADIOLIB_SI443X_AFC_WIDEBAND_OFF 0b00000000 // 7 7 AFC wideband: disabled (default)
322 #define RADIOLIB_SI443X_AFC_WIDEBAND_ON 0b10000000 // 7 7 enabled
323 #define RADIOLIB_SI443X_AFC_OFF 0b00000000 // 6 6 AFC: disabled
324 #define RADIOLIB_SI443X_AFC_ON 0b01000000 // 6 6 enabled (default)
325 #define RADIOLIB_SI443X_AFC_HIGH_GEAR_SETTING 0b00000000 // 5 3 AFC high gear setting
326 #define RADIOLIB_SI443X_SECOND_PHASE_BIAS_0_DB 0b00000100 // 2 2 second phase antenna selection bias: 0 dB (default)
327 #define RADIOLIB_SI443X_SECOND_PHASE_BIAS_1_5_DB 0b00000000 // 2 2 1.5 dB
328 #define RADIOLIB_SI443X_MOVING_AVERAGE_TAP_8 0b00000010 // 1 1 moving average filter tap length: 8*Tb
329 #define RADIOLIB_SI443X_MOVING_AVERAGE_TAP_4 0b00000000 // 1 1 4*Tb after first preamble (default)
330 #define RADIOLIB_SI443X_ZERO_PHASE_RESET_5 0b00000000 // 0 0 reset preamble detector after: 5 zero phases (default)
331 #define RADIOLIB_SI443X_ZERO_PHASE_RESET_2 0b00000001 // 0 0 3 zero phases
332 
333 // RADIOLIB_SI443X_REG_AFC_TIMING_CONTROL
334 #define RADIOLIB_SI443X_SW_ANT_TIMER 0b00000000 // 7 6 number of periods to wait for RSSI to stabilize during antenna switching
335 #define RADIOLIB_SI443X_SHORT_WAIT 0b00001000 // 5 3 period to wait after AFC correction
336 #define RADIOLIB_SI443X_ANTENNA_SWITCH_WAIT 0b00000010 // 2 0 antenna switching wait time
337 
338 // RADIOLIB_SI443X_REG_CLOCK_REC_GEARSHIFT_OVERRIDE
339 #define RADIOLIB_SI443X_CLOCK_RECOVER_FAST_GEARSHIFT 0b00000000 // 5 3 clock recovery fast gearshift value
340 #define RADIOLIB_SI443X_CLOCK_RECOVER_SLOW_GEARSHIFT 0b00000011 // 2 0 clock recovery slow gearshift value
341 
342 // RADIOLIB_SI443X_REG_CLOCK_REC_OVERSAMP_RATIO
343 #define RADIOLIB_SI443X_CLOCK_REC_OVERSAMP_RATIO_LSB 0b01100100 // 7 0 oversampling rate LSB, defaults to 12.5 clock cycles per bit
344 
345 // RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_2
346 #define RADIOLIB_SI443X_CLOCK_REC_OVERSAMP_RATIO_MSB 0b00000000 // 7 5 oversampling rate MSB, defaults to 12.5 clock cycles per bit
347 #define RADIOLIB_SI443X_SECOND_PHASE_SKIP_THRESHOLD 0b00000000 // 4 4 skip seconds phase antenna diversity threshold
348 #define RADIOLIB_SI443X_NCO_OFFSET_MSB 0b00000001 // 3 0 NCO offset MSB
349 
350 // RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_1
351 #define RADIOLIB_SI443X_NCO_OFFSET_MID 0b01000111 // 7 0 NCO offset MID
352 
353 // RADIOLIB_SI443X_REG_CLOCK_REC_OFFSET_0
354 #define RADIOLIB_SI443X_NCO_OFFSET_LSB 0b10101110 // 7 0 NCO offset LSB
355 
356 // RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_1
357 #define RADIOLIB_SI443X_RX_COMPENSATION_OFF 0b00000000 // 4 4 Rx compensation for high data rate: disabled (default)
358 #define RADIOLIB_SI443X_RX_COMPENSATION_ON 0b00010000 // 4 4 enabled
359 #define RADIOLIB_SI443X_CLOCK_REC_GAIN_DOUBLE_OFF 0b00000000 // 3 3 clock recovery gain doubling: disabled (default)
360 #define RADIOLIB_SI443X_CLOCK_REC_GAIN_DOUBLE_ON 0b00001000 // 3 3 enabled
361 #define RADIOLIB_SI443X_CLOCK_REC_LOOP_GAIN_MSB 0b00000010 // 2 0 clock recovery timing loop gain MSB
362 
363 // RADIOLIB_SI443X_REG_CLOCK_REC_TIMING_LOOP_GAIN_0
364 #define RADIOLIB_SI443X_CLOCK_REC_LOOP_GAIN_LSB 0b10001111 // 7 0 clock recovery timing loop gain LSB
365 
366 // RADIOLIB_SI443X_REG_RSSI_CLEAR_CHANNEL_THRESHOLD
367 #define RADIOLIB_SI443X_RSSI_CLEAR_CHANNEL_THRESHOLD 0b00011110 // 7 0 RSSI clear channel interrupt threshold
368 
369 // RADIOLIB_SI443X_REG_AFC_LIMITER
370 #define RADIOLIB_SI443X_AFC_LIMITER 0x00 // 7 0 AFC limiter value
371 
372 // RADIOLIB_SI443X_REG_OOK_COUNTER_1
373 #define RADIOLIB_SI443X_OOK_FREEZE_OFF 0b00000000 // 5 5 OOK moving average detector freeze: disabled (default)
374 #define RADIOLIB_SI443X_OOK_FREEZE_ON 0b00100000 // 5 5 enabled
375 #define RADIOLIB_SI443X_PEAK_DETECTOR_OFF 0b00000000 // 4 4 peak detector: disabled
376 #define RADIOLIB_SI443X_PEAK_DETECTOR_ON 0b00010000 // 4 4 enabled (default)
377 #define RADIOLIB_SI443X_OOK_MOVING_AVERAGE_OFF 0b00000000 // 3 3 OOK moving average: disabled
378 #define RADIOLIB_SI443X_OOK_MOVING_AVERAGE_ON 0b00001000 // 3 3 enabled (default)
379 #define RADIOLIB_SI443X_OOK_COUNTER_MSB 0b00000000 // 2 0 OOK counter MSB
380 
381 // RADIOLIB_SI443X_REG_OOK_COUNTER_2
382 #define RADIOLIB_SI443X_OOK_COUNTER_LSB 0b10111100 // 7 0 OOK counter LSB
383 
384 // RADIOLIB_SI443X_REG_SLICER_PEAK_HOLD
385 #define RADIOLIB_SI443X_PEAK_DETECTOR_ATTACK 0b00010000 // 6 4 OOK peak detector attach time
386 #define RADIOLIB_SI443X_PEAK_DETECTOR_DECAY 0b00001100 // 3 0 OOK peak detector decay time
387 
388 // RADIOLIB_SI443X_REG_DATA_ACCESS_CONTROL
389 #define RADIOLIB_SI443X_PACKET_RX_HANDLING_OFF 0b00000000 // 7 7 packet Rx handling: disabled
390 #define RADIOLIB_SI443X_PACKET_RX_HANDLING_ON 0b10000000 // 7 7 enabled (default)
391 #define RADIOLIB_SI443X_LSB_FIRST_OFF 0b00000000 // 6 6 LSB first transmission: disabled (default)
392 #define RADIOLIB_SI443X_LSB_FIRST_ON 0b01000000 // 6 6 enabled
393 #define RADIOLIB_SI443X_CRC_DATA_ONLY_OFF 0b00000000 // 5 5 CRC calculated only from data fields: disabled (default)
394 #define RADIOLIB_SI443X_CRC_DATA_ONLY_ON 0b00100000 // 5 5 enabled
395 #define RADIOLIB_SI443X_SKIP_SECOND_PHASE_PREAMBLE_DET_OFF 0b00000000 // 4 4 skip second phase of preamble detection: disabled (default)
396 #define RADIOLIB_SI443X_SKIP_SECOND_PHASE_PREAMBLE_DET_ON 0b00010000 // 4 4 enabled
397 #define RADIOLIB_SI443X_PACKET_TX_HANDLING_OFF 0b00000000 // 3 3 packet Tx handling: disabled
398 #define RADIOLIB_SI443X_PACKET_TX_HANDLING_ON 0b00001000 // 3 3 enabled (default)
399 #define RADIOLIB_SI443X_CRC_OFF 0b00000000 // 2 2 CRC: disabled
400 #define RADIOLIB_SI443X_CRC_ON 0b00000100 // 2 2 enabled (default)
401 #define RADIOLIB_SI443X_CRC_CCITT 0b00000000 // 1 0 CRC type: CCITT
402 #define RADIOLIB_SI443X_CRC_IBM_CRC16 0b00000001 // 1 0 IBM CRC-16 (default)
403 #define RADIOLIB_SI443X_CRC_IEC16 0b00000010 // 1 0 IEC-16
404 #define RADIOLIB_SI443X_CRC_BIACHEVA 0b00000011 // 1 0 Biacheva
405 
406 // RADIOLIB_SI443X_REG_EZMAC_STATUS
407 #define RADIOLIB_SI443X_CRC_ALL_ONE 0b01000000 // 6 6 last received CRC was all ones
408 #define RADIOLIB_SI443X_PACKET_SEARCHING 0b00100000 // 5 5 radio is searching for a valid packet
409 #define RADIOLIB_SI443X_PACKET_RECEIVING 0b00010000 // 4 4 radio is currently receiving packet
410 #define RADIOLIB_SI443X_VALID_PACKET_RECEIVED 0b00001000 // 3 3 valid packet was received
411 #define RADIOLIB_SI443X_CRC_ERROR 0b00000100 // 2 2 CRC check failed
412 #define RADIOLIB_SI443X_PACKET_TRANSMITTING 0b00000010 // 1 1 radio is currently transmitting packet
413 #define RADIOLIB_SI443X_PACKET_SENT 0b00000001 // 0 0 packet sent
414 
415 // RADIOLIB_SI443X_REG_HEADER_CONTROL_1
416 #define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_NONE 0b00000000 // 7 4 broadcast address check: none (default)
417 #define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE0 0b00010000 // 7 4 on byte 0
418 #define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE1 0b00100000 // 7 4 on byte 1
419 #define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE2 0b01000000 // 7 4 on byte 2
420 #define RADIOLIB_SI443X_BROADCAST_ADDR_CHECK_BYTE3 0b10000000 // 7 4 on byte 3
421 #define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_NONE 0b00000000 // 3 0 received header check: none
422 #define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE0 0b00000001 // 3 0 on byte 0
423 #define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE1 0b00000010 // 3 0 on byte 1
424 #define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE2 0b00000100 // 3 0 on byte 2 (default)
425 #define RADIOLIB_SI443X_RECEIVED_HEADER_CHECK_BYTE3 0b00001000 // 3 0 on byte 3 (default)
426 
427 // RADIOLIB_SI443X_REG_HEADER_CONTROL_2
428 #define RADIOLIB_SI443X_SYNC_WORD_TIMEOUT_OFF 0b00000000 // 7 7 ignore timeout period when searching for sync word: disabled (default)
429 #define RADIOLIB_SI443X_SYNC_WORD_TIMEOUT_ON 0b10000000 // 7 7 enabled
430 #define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_NONE 0b00000000 // 6 4 header length: none
431 #define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_3 0b00010000 // 6 4 header 3
432 #define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_32 0b00100000 // 6 4 header 3 and 2
433 #define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_321 0b00110000 // 6 4 header 3, 2 and 1 (default)
434 #define RADIOLIB_SI443X_HEADER_LENGTH_HEADER_3210 0b01000000 // 6 4 header 3, 2, 1, and 0
435 #define RADIOLIB_SI443X_FIXED_PACKET_LENGTH_OFF 0b00000000 // 3 3 fixed packet length mode: disabled (default)
436 #define RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON 0b00001000 // 3 3 enabled
437 #define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_3 0b00000000 // 2 1 sync word length: sync 3
438 #define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_32 0b00000010 // 2 1 sync 3 and 2 (default)
439 #define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_321 0b00000100 // 2 1 sync 3, 2 and 1
440 #define RADIOLIB_SI443X_SYNC_LENGTH_SYNC_3210 0b00000110 // 2 1 sync 3, 2, 1 and 0
441 #define RADIOLIB_SI443X_PREAMBLE_LENGTH_MSB 0b00000000 // 0 0 preamble length MSB
442 
443 // RADIOLIB_SI443X_REG_PREAMBLE_LENGTH
444 #define RADIOLIB_SI443X_PREAMBLE_LENGTH_LSB 0b00001000 // 0 0 preamble length LSB, defaults to 32 bits
445 
446 // RADIOLIB_SI443X_REG_PREAMBLE_DET_CONTROL
447 #define RADIOLIB_SI443X_PREAMBLE_DET_THRESHOLD 0b00101000 // 7 3 number of 4-bit nibbles in valid preamble, defaults to 20 bits
448 #define RADIOLIB_SI443X_RSSI_OFFSET 0b00000010 // 2 0 RSSI calculation offset, defaults to +8 dB
449 
450 // RADIOLIB_SI443X_REG_SYNC_WORD_3 - RADIOLIB_SI443X_REG_SYNC_WORD_0
451 #define RADIOLIB_SI443X_SYNC_WORD_3 0x2D // 7 0 sync word: 4th byte (MSB)
452 #define RADIOLIB_SI443X_SYNC_WORD_2 0xD4 // 7 0 3rd byte
453 #define RADIOLIB_SI443X_SYNC_WORD_1 0x00 // 7 0 2nd byte
454 #define RADIOLIB_SI443X_SYNC_WORD_0 0x00 // 7 0 1st byte (LSB)
455 
456 // RADIOLIB_SI443X_REG_CHANNEL_FILTER_COEFF
457 #define RADIOLIB_SI443X_INVALID_PREAMBLE_THRESHOLD 0b00000000 // 7 4 invalid preamble threshold in nibbles
458 
459 // RADIOLIB_SI443X_REG_XOSC_CONTROL_TEST
460 #define RADIOLIB_SI443X_STATE_LOW_POWER 0b00000000 // 7 5 chip power state: low power
461 #define RADIOLIB_SI443X_STATE_READY 0b00100000 // 7 5 ready
462 #define RADIOLIB_SI443X_STATE_TUNE 0b01100000 // 7 5 tune
463 #define RADIOLIB_SI443X_STATE_TX 0b01000000 // 7 5 Tx
464 #define RADIOLIB_SI443X_STATE_RX 0b11100000 // 7 5 Rx
465 
466 // RADIOLIB_SI443X_REG_AGC_OVERRIDE_1
467 #define RADIOLIB_SI443X_AGC_GAIN_INCREASE_OFF 0b00000000 // 6 6 AGC gain increase override: disabled (default)
468 #define RADIOLIB_SI443X_AGC_GAIN_INCREASE_ON 0b01000000 // 6 6 enabled
469 #define RADIOLIB_SI443X_AGC_OFF 0b00000000 // 5 5 AGC loop: disabled
470 #define RADIOLIB_SI443X_AGC_ON 0b00100000 // 5 5 enabled (default)
471 #define RADIOLIB_SI443X_LNA_GAIN_MIN 0b00000000 // 4 4 LNA gain select: 5 dB (default)
472 #define RADIOLIB_SI443X_LNA_GAIN_MAX 0b00010000 // 4 4 25 dB
473 #define RADIOLIB_SI443X_PGA_GAIN_OVERRIDE 0b00000000 // 3 0 PGA gain override, gain = RADIOLIB_SI443X_PGA_GAIN_OVERRIDE * 3 dB
474 
475 // RADIOLIB_SI443X_REG_TX_POWER
476 #define RADIOLIB_SI443X_LNA_SWITCH_OFF 0b00000000 // 3 3 LNA switch control: disabled
477 #define RADIOLIB_SI443X_LNA_SWITCH_ON 0b00001000 // 3 3 enabled (default)
478 #define RADIOLIB_SI443X_OUTPUT_POWER 0b00000000 // 2 0 output power in 3 dB steps, 0 is chip min, 7 is chip max
479 
480 // RADIOLIB_SI443X_REG_TX_DATA_RATE_1 + RADIOLIB_SI443X_REG_TX_DATA_RATE_0
481 #define RADIOLIB_SI443X_DATA_RATE_MSB 0x0A // 7 0 data rate: DR = 10^6 * (RADIOLIB_SI443X_DATA_RATE / 2^16) in high data rate mode or
482 #define RADIOLIB_SI443X_DATA_RATE_LSB 0x3D // 7 0 DR = 10^6 * (RADIOLIB_SI443X_DATA_RATE / 2^21) in low data rate mode (defaults to 40 kbps)
483 
484 // RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_1
485 #define RADIOLIB_SI443X_HIGH_DATA_RATE_MODE 0b00000000 // 5 5 data rate: above 30 kbps (default)
486 #define RADIOLIB_SI443X_LOW_DATA_RATE_MODE 0b00100000 // 5 5 below 30 kbps
487 #define RADIOLIB_SI443X_PACKET_HANDLER_POWER_DOWN_OFF 0b00000000 // 4 4 power off packet handler in low power mode: disabled (default)
488 #define RADIOLIB_SI443X_PACKET_HANDLER_POWER_DOWN_ON 0b00010000 // 4 4 enabled
489 #define RADIOLIB_SI443X_MANCHESTER_PREAMBLE_POL_LOW 0b00000000 // 3 3 preamble polarity in Manchester mode: low
490 #define RADIOLIB_SI443X_MANCHESTER_PREAMBLE_POL_HIGH 0b00001000 // 3 3 high (default)
491 #define RADIOLIB_SI443X_MANCHESTER_INVERTED_OFF 0b00000000 // 2 2 inverted Manchester encoding: disabled
492 #define RADIOLIB_SI443X_MANCHESTER_INVERTED_ON 0b00000100 // 2 2 enabled (default)
493 #define RADIOLIB_SI443X_MANCHESTER_OFF 0b00000000 // 1 1 Manchester encoding: disabled (default)
494 #define RADIOLIB_SI443X_MANCHESTER_ON 0b00000010 // 1 1 enabled
495 #define RADIOLIB_SI443X_WHITENING_OFF 0b00000000 // 0 0 data whitening: disabled (default)
496 #define RADIOLIB_SI443X_WHITENING_ON 0b00000001 // 0 0 enabled
497 
498 // RADIOLIB_SI443X_REG_MODULATION_MODE_CONTROL_2
499 #define RADIOLIB_SI443X_TX_DATA_CLOCK_NONE 0b00000000 // 7 6 Tx data clock: disabled (default)
500 #define RADIOLIB_SI443X_TX_DATA_CLOCK_GPIO 0b01000000 // 7 6 GPIO pin
501 #define RADIOLIB_SI443X_TX_DATA_CLOCK_SDI 0b10000000 // 7 6 SDI pin
502 #define RADIOLIB_SI443X_TX_DATA_CLOCK_NIRQ 0b11000000 // 7 6 nIRQ pin
503 #define RADIOLIB_SI443X_TX_DATA_SOURCE_GPIO 0b00000000 // 5 4 Tx data source in direct mode: GPIO pin (default)
504 #define RADIOLIB_SI443X_TX_DATA_SOURCE_SDI 0b00010000 // 5 4 SDI pin
505 #define RADIOLIB_SI443X_TX_DATA_SOURCE_FIFO 0b00100000 // 5 4 FIFO
506 #define RADIOLIB_SI443X_TX_DATA_SOURCE_PN9 0b00110000 // 5 4 PN9 internal
507 #define RADIOLIB_SI443X_TX_RX_INVERTED_OFF 0b00000000 // 3 3 Tx/Rx data inverted: disabled (default)
508 #define RADIOLIB_SI443X_TX_RX_INVERTED_ON 0b00001000 // 3 3 enabled
509 #define RADIOLIB_SI443X_FREQUENCY_DEVIATION_MSB 0b00000000 // 2 2 frequency deviation MSB
510 #define RADIOLIB_SI443X_MODULATION_NONE 0b00000000 // 1 0 modulation type: unmodulated carrier (default)
511 #define RADIOLIB_SI443X_MODULATION_OOK 0b00000001 // 1 0 OOK
512 #define RADIOLIB_SI443X_MODULATION_FSK 0b00000010 // 1 0 FSK
513 #define RADIOLIB_SI443X_MODULATION_GFSK 0b00000011 // 1 0 GFSK
514 
515 // RADIOLIB_SI443X_REG_FREQUENCY_DEVIATION
516 #define RADIOLIB_SI443X_FREQUENCY_DEVIATION_LSB 0b00100000 // 7 0 frequency deviation LSB, Fd = 625 Hz * RADIOLIB_SI443X_FREQUENCY_DEVIATION, defaults to 20 kHz
517 
518 // RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_1 + RADIOLIB_SI443X_REG_FREQUENCY_OFFSET_2
519 #define RADIOLIB_SI443X_FREQUENCY_OFFSET_MSB 0x00 // 7 0 frequency offset:
520 #define RADIOLIB_SI443X_FREQUENCY_OFFSET_LSB 0x00 // 1 0 Foff = 156.25 Hz * (RADIOLIB_SI443X_BAND_SELECT + 1) * RADIOLIB_SI443X_FREQUENCY_OFFSET, defaults to 156.25 Hz
521 
522 // RADIOLIB_SI443X_REG_FREQUENCY_BAND_SELECT
523 #define RADIOLIB_SI443X_SIDE_BAND_SELECT_LOW 0b00000000 // 6 6 Rx LO tuning: below channel frequency (default)
524 #define RADIOLIB_SI443X_SIDE_BAND_SELECT_HIGH 0b01000000 // 6 6 above channel frequency
525 #define RADIOLIB_SI443X_BAND_SELECT_LOW 0b00000000 // 5 5 band select: low, 240 - 479.9 MHz
526 #define RADIOLIB_SI443X_BAND_SELECT_HIGH 0b00100000 // 5 5 high, 480 - 960 MHz (default)
527 #define RADIOLIB_SI443X_FREQUENCY_BAND_SELECT 0b00010101 // 4 0 frequency band select
528 
529 // RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_1 + RADIOLIB_SI443X_REG_NOM_CARRIER_FREQUENCY_0
530 #define RADIOLIB_SI443X_NOM_CARRIER_FREQUENCY_MSB 0b10111011 // 7 0 nominal carrier frequency:
531 #define RADIOLIB_SI443X_NOM_CARRIER_FREQUENCY_LSB 0b10000000 // 7 0 Fc = (RADIOLIB_SI443X_BAND_SELECT + 1)*10*(RADIOLIB_SI443X_FREQUENCY_BAND_SELECT + 24) + (RADIOLIB_SI443X_NOM_CARRIER_FREQUENCY - RADIOLIB_SI443X_FREQUENCY_OFFSET)/6400 [MHz]
532 
533 // RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_CHANNEL_SEL
534 #define RADIOLIB_SI443X_FREQUENCY_HOPPING_CHANNEL 0x00 // 7 0 frequency hopping channel number
535 
536 // RADIOLIB_SI443X_REG_FREQUENCY_HOPPING_STEP_SIZE
537 #define RADIOLIB_SI443X_FREQUENCY_HOPPING_STEP_SIZE 0x00 // 7 0 frequency hopping step size
538 
539 // RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_1
540 #define RADIOLIB_SI443X_TX_FIFO_ALMOST_FULL_THRESHOLD 0x37 // 5 0 Tx FIFO almost full threshold
541 
542 // RADIOLIB_SI443X_REG_TX_FIFO_CONTROL_2
543 #define RADIOLIB_SI443X_TX_FIFO_ALMOST_EMPTY_THRESHOLD 0x04 // 5 0 Tx FIFO almost full threshold
544 
545 // RADIOLIB_SI443X_REG_RX_FIFO_CONTROL
546 #define RADIOLIB_SI443X_RX_FIFO_ALMOST_FULL_THRESHOLD 0x37 // 5 0 Rx FIFO almost full threshold
547 
553 class Si443x: public PhysicalLayer {
554  public:
555  // introduce PhysicalLayer overloads
560 
561  // constructor
562 
567  Si443x(Module* mod);
568 
569  // basic methods
570 
579  int16_t begin(float br, float freqDev, float rxBw, uint8_t preambleLen);
580 
584  void reset();
585 
594  int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override;
595 
603  int16_t receive(uint8_t* data, size_t len) override;
604 
610  int16_t sleep();
611 
616  int16_t standby() override;
617 
623  int16_t standby(uint8_t mode) override;
624 
630  int16_t transmitDirect(uint32_t frf = 0) override;
631 
636  int16_t receiveDirect() override;
637 
642  int16_t packetMode();
643 
644  // interrupt methods
645 
650  void setIrqAction(void (*func)(void));
651 
655  void clearIrqAction();
656 
661  void setPacketReceivedAction(void (*func)(void));
662 
667 
672  void setPacketSentAction(void (*func)(void));
673 
677  void clearPacketSentAction();
678 
686  int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override;
687 
692  int16_t finishTransmit() override;
693 
698  int16_t startReceive();
699 
708  int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len);
709 
718  int16_t readData(uint8_t* data, size_t len) override;
719 
720  // configuration methods
721 
727  int16_t setBitRate(float br);
728 
734  int16_t setFrequencyDeviation(float freqDev) override;
735 
741  int16_t setRxBandwidth(float rxBw);
742 
748  int16_t setSyncWord(uint8_t* syncWord, size_t len);
749 
755  int16_t setPreambleLength(uint8_t preambleLen);
756 
762  size_t getPacketLength(bool update = true) override;
763 
770  int16_t setEncoding(uint8_t encoding) override;
771 
778  int16_t setDataShaping(uint8_t sh) override;
779 
781  void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
782 
784  void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]);
785 
790  uint8_t randomByte();
791 
796  int16_t getChipVersion();
797 
798  #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
803  void setDirectAction(void (*func)(void));
804 
809  void readBit(uint32_t pin);
810  #endif
811 
817  int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_SI443X_MAX_PACKET_LENGTH);
818 
824  int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_SI443X_MAX_PACKET_LENGTH);
825 
826 #if !RADIOLIB_GODMODE && !RADIOLIB_LOW_LEVEL
827  protected:
828 #endif
829  Module* getMod();
830 
831 #if !RADIOLIB_GODMODE
832  protected:
833 #endif
834  int16_t setFrequencyRaw(float newFreq);
835 
836 #if !RADIOLIB_GODMODE
837  private:
838 #endif
839  Module* mod;
840 
841  float bitRate = 0;
842  float frequencyDev = 0;
843  float frequency = 0;
844 
845  size_t packetLength = 0;
846  bool packetLengthQueried = false;
847  uint8_t packetLengthConfig = RADIOLIB_SI443X_FIXED_PACKET_LENGTH_ON;
848 
849  bool findChip();
850  void clearIRQFlags();
851  void clearFIFO(size_t count);
852  int16_t config();
853  int16_t updateClockRecovery();
854  int16_t directMode();
855  int16_t setPacketMode(uint8_t mode, uint8_t len);
856 };
857 
858 #endif
859 
860 #endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:68
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:77
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:54
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:209
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition: PhysicalLayer.cpp:52
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:149
virtual int16_t receive(uint8_t *data, size_t len)
Binary receive method. Must be implemented in module class.
Definition: PhysicalLayer.cpp:112
Base class for Si443x series. All derived classes for Si443x (e.g. Si4431 or Si4432) inherit from thi...
Definition: Si443x.h:553
int16_t startReceive()
Interrupt-driven receive method. IRQ will be activated when full valid packet is received.
Definition: Si443x.cpp:278
int16_t setEncoding(uint8_t encoding) override
Sets transmission encoding. Only available in FSK mode. Allowed values are RADIOLIB_ENCODING_NRZ,...
Definition: Si443x.cpp:552
int16_t receiveDirect() override
Enables direct reception mode. While in direct mode, the module will not be able to transmit or recei...
Definition: Si443x.cpp:185
void clearPacketSentAction()
Clears interrupt service routine to call when a packet is sent.
Definition: Si443x.cpp:225
void setPacketReceivedAction(void(*func)(void))
Sets interrupt service routine to call when a packet is received.
Definition: Si443x.cpp:213
size_t getPacketLength(bool update=true) override
Query modem for the packet length of received payload.
Definition: Si443x.cpp:539
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:209
void setRfSwitchPins(uint32_t rxEn, uint32_t txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition: Si443x.cpp:591
int16_t begin(float br, float freqDev, float rxBw, uint8_t preambleLen)
Initialization method.
Definition: Si443x.cpp:9
int16_t setPreambleLength(uint8_t preambleLen)
Sets preamble length.
Definition: Si443x.cpp:523
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition: PhysicalLayer.cpp:52
int16_t setSyncWord(uint8_t *syncWord, size_t len)
Sets sync word. Up to 4 bytes can be set as sync word.
Definition: Si443x.cpp:506
int16_t setRxBandwidth(float rxBw)
Sets receiver bandwidth. Allowed values range from 2.6 to 620.7 kHz.
Definition: Si443x.cpp:399
int16_t getChipVersion()
Read version SPI register. Should return RADIOLIB_SI443X_DEVICE_VERSION (0x06) if Si443x is connected...
Definition: Si443x.cpp:618
void setDirectAction(void(*func)(void))
Set interrupt service routine function to call when data bit is received in direct mode.
Definition: Si443x.cpp:623
int16_t transmitDirect(uint32_t frf=0) override
Enables direct transmission mode. While in direct mode, the module will not be able to transmit or re...
Definition: Si443x.cpp:143
int16_t packetMode()
Disables direct mode and enables packet mode, allowing the module to receive packets.
Definition: Si443x.cpp:198
void clearPacketReceivedAction()
Clears interrupt service routine to call when a packet is received.
Definition: Si443x.cpp:217
int16_t finishTransmit() override
Clean up after transmission is done.
Definition: Si443x.cpp:270
uint8_t randomByte()
Get one truly random byte from RSSI noise.
Definition: Si443x.cpp:599
int16_t setFrequencyDeviation(float freqDev) override
Sets FSK frequency deviation from carrier frequency. Allowed values range from 0.625 to 320....
Definition: Si443x.cpp:376
void setIrqAction(void(*func)(void))
Sets interrupt service routine to call when IRQ activates.
Definition: Si443x.cpp:205
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: Si443x.cpp:595
void clearIrqAction()
Clears interrupt service routine to call when IRQ activates.
Definition: Si443x.cpp:209
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:149
void setPacketSentAction(void(*func)(void))
Sets interrupt service routine to call when a packet is sent.
Definition: Si443x.cpp:221
virtual int16_t receive(uint8_t *data, size_t len)
Binary receive method. Must be implemented in module class.
Definition: PhysicalLayer.cpp:112
int16_t variablePacketLengthMode(uint8_t maxLen=RADIOLIB_SI443X_MAX_PACKET_LENGTH)
Set modem in variable packet length mode.
Definition: Si443x.cpp:636
int16_t standby() override
Sets the module to standby (with XTAL on).
Definition: Si443x.cpp:133
int16_t fixedPacketLengthMode(uint8_t len=RADIOLIB_SI443X_MAX_PACKET_LENGTH)
Set modem in fixed packet length mode.
Definition: Si443x.cpp:632
int16_t setBitRate(float br)
Sets FSK bit rate. Allowed values range from 0.123 to 256.0 kbps.
Definition: Si443x.cpp:345
int16_t sleep()
Sets the module to sleep to save power. Module will not be able to transmit or receive any data while...
Definition: Si443x.cpp:117
int16_t setDataShaping(uint8_t sh) override
Sets Gaussian filter bandwidth-time product that will be used for data shaping. Only available in FSK...
Definition: Si443x.cpp:571
void reset()
Reset method. Will reset the chip to the default state using SDN pin.
Definition: Si443x.cpp:66
Si443x(Module *mod)
Default constructor.
Definition: Si443x.cpp:5
void readBit(uint32_t pin)
Function to read and process data bit in direct reception mode.
Definition: Si443x.cpp:627
Description of RF switch pin states for a single mode. See setRfSwitchTable for details.
Definition: Module.h:84