RadioLib
Universal wireless communication library for Arduino
Loading...
Searching...
No Matches
CC1101.h
1#if !defined(_RADIOLIB_CC1101_H) && !RADIOLIB_EXCLUDE_CC1101
2#define _RADIOLIB_CC1101_H
3
4#include "../../TypeDef.h"
5#include "../../Module.h"
6
7#include "../../protocols/PhysicalLayer/PhysicalLayer.h"
8
9// CC1101 physical layer properties
10#define RADIOLIB_CC1101_FREQUENCY_STEP_SIZE 396.7285156
11#define RADIOLIB_CC1101_MAX_PACKET_LENGTH 255
12#define RADIOLIB_CC1101_FIFO_SIZE 64
13#define RADIOLIB_CC1101_CRYSTAL_FREQ 26.0f
14#define RADIOLIB_CC1101_DIV_EXPONENT 16
15#define RADIOLIB_CC1101_POUT_MIN -30
16#define RADIOLIB_CC1101_POUT_MAX 10
17
18// CC1101 SPI commands
19#define RADIOLIB_CC1101_CMD_READ 0b10000000
20#define RADIOLIB_CC1101_CMD_WRITE 0b00000000
21#define RADIOLIB_CC1101_CMD_BURST 0b01000000
22#define RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG 0b01000000
23#define RADIOLIB_CC1101_CMD_FIFO_RX 0b10000000
24#define RADIOLIB_CC1101_CMD_FIFO_TX 0b00000000
25#define RADIOLIB_CC1101_CMD_RESET 0x30
26#define RADIOLIB_CC1101_CMD_FSTXON 0x31
27#define RADIOLIB_CC1101_CMD_XOFF 0x32
28#define RADIOLIB_CC1101_CMD_CAL 0x33
29#define RADIOLIB_CC1101_CMD_RX 0x34
30#define RADIOLIB_CC1101_CMD_TX 0x35
31#define RADIOLIB_CC1101_CMD_IDLE 0x36
32#define RADIOLIB_CC1101_CMD_WOR 0x38
33#define RADIOLIB_CC1101_CMD_POWER_DOWN 0x39
34#define RADIOLIB_CC1101_CMD_FLUSH_RX 0x3A
35#define RADIOLIB_CC1101_CMD_FLUSH_TX 0x3B
36#define RADIOLIB_CC1101_CMD_WOR_RESET 0x3C
37#define RADIOLIB_CC1101_CMD_NOP 0x3D
38
39// CC1101 register map
40#define RADIOLIB_CC1101_REG_IOCFG2 0x00
41#define RADIOLIB_CC1101_REG_IOCFG1 0x01
42#define RADIOLIB_CC1101_REG_IOCFG0 0x02
43#define RADIOLIB_CC1101_REG_FIFOTHR 0x03
44#define RADIOLIB_CC1101_REG_SYNC1 0x04
45#define RADIOLIB_CC1101_REG_SYNC0 0x05
46#define RADIOLIB_CC1101_REG_PKTLEN 0x06
47#define RADIOLIB_CC1101_REG_PKTCTRL1 0x07
48#define RADIOLIB_CC1101_REG_PKTCTRL0 0x08
49#define RADIOLIB_CC1101_REG_ADDR 0x09
50#define RADIOLIB_CC1101_REG_CHANNR 0x0A
51#define RADIOLIB_CC1101_REG_FSCTRL1 0x0B
52#define RADIOLIB_CC1101_REG_FSCTRL0 0x0C
53#define RADIOLIB_CC1101_REG_FREQ2 0x0D
54#define RADIOLIB_CC1101_REG_FREQ1 0x0E
55#define RADIOLIB_CC1101_REG_FREQ0 0x0F
56#define RADIOLIB_CC1101_REG_MDMCFG4 0x10
57#define RADIOLIB_CC1101_REG_MDMCFG3 0x11
58#define RADIOLIB_CC1101_REG_MDMCFG2 0x12
59#define RADIOLIB_CC1101_REG_MDMCFG1 0x13
60#define RADIOLIB_CC1101_REG_MDMCFG0 0x14
61#define RADIOLIB_CC1101_REG_DEVIATN 0x15
62#define RADIOLIB_CC1101_REG_MCSM2 0x16
63#define RADIOLIB_CC1101_REG_MCSM1 0x17
64#define RADIOLIB_CC1101_REG_MCSM0 0x18
65#define RADIOLIB_CC1101_REG_FOCCFG 0x19
66#define RADIOLIB_CC1101_REG_BSCFG 0x1A
67#define RADIOLIB_CC1101_REG_AGCCTRL2 0x1B
68#define RADIOLIB_CC1101_REG_AGCCTRL1 0x1C
69#define RADIOLIB_CC1101_REG_AGCCTRL0 0x1D
70#define RADIOLIB_CC1101_REG_WOREVT1 0x1E
71#define RADIOLIB_CC1101_REG_WOREVT0 0x1F
72#define RADIOLIB_CC1101_REG_WORCTRL 0x20
73#define RADIOLIB_CC1101_REG_FREND1 0x21
74#define RADIOLIB_CC1101_REG_FREND0 0x22
75#define RADIOLIB_CC1101_REG_FSCAL3 0x23
76#define RADIOLIB_CC1101_REG_FSCAL2 0x24
77#define RADIOLIB_CC1101_REG_FSCAL1 0x25
78#define RADIOLIB_CC1101_REG_FSCAL0 0x26
79#define RADIOLIB_CC1101_REG_RCCTRL1 0x27
80#define RADIOLIB_CC1101_REG_RCCTRL0 0x28
81#define RADIOLIB_CC1101_REG_FSTEST 0x29
82#define RADIOLIB_CC1101_REG_PTEST 0x2A
83#define RADIOLIB_CC1101_REG_AGCTEST 0x2B
84#define RADIOLIB_CC1101_REG_TEST2 0x2C
85#define RADIOLIB_CC1101_REG_TEST1 0x2D
86#define RADIOLIB_CC1101_REG_TEST0 0x2E
87#define RADIOLIB_CC1101_REG_PARTNUM 0x30
88#define RADIOLIB_CC1101_REG_VERSION 0x31
89#define RADIOLIB_CC1101_REG_FREQEST 0x32
90#define RADIOLIB_CC1101_REG_LQI 0x33
91#define RADIOLIB_CC1101_REG_RSSI 0x34
92#define RADIOLIB_CC1101_REG_MARCSTATE 0x35
93#define RADIOLIB_CC1101_REG_WORTIME1 0x36
94#define RADIOLIB_CC1101_REG_WORTIME0 0x37
95#define RADIOLIB_CC1101_REG_PKTSTATUS 0x38
96#define RADIOLIB_CC1101_REG_VCO_VC_DAC 0x39
97#define RADIOLIB_CC1101_REG_TXBYTES 0x3A
98#define RADIOLIB_CC1101_REG_RXBYTES 0x3B
99#define RADIOLIB_CC1101_REG_RCCTRL1_STATUS 0x3C
100#define RADIOLIB_CC1101_REG_RCCTRL0_STATUS 0x3D
101#define RADIOLIB_CC1101_REG_PATABLE 0x3E
102#define RADIOLIB_CC1101_REG_FIFO 0x3F
103
104// status byte (returned during SPI transactions) MSB LSB DESCRIPTION
105#define RADIOLIB_CC1101_STATUS_CHIP_READY 0b00000000 // 7 7 chip ready
106#define RADIOLIB_CC1101_STATUS_CHIP_NOT_READY 0b10000000 // 7 7 chip not ready (power/crystal not stable)
107#define RADIOLIB_CC1101_STATUS_IDLE 0b00000000 // 6 4 idle
108#define RADIOLIB_CC1101_STATUS_RX 0b00010000 // 6 4 Rx
109#define RADIOLIB_CC1101_STATUS_TX 0b00100000 // 6 4 Tx
110#define RADIOLIB_CC1101_STATUS_FSTXON 0b00110000 // 6 4 Fast Tx ready
111#define RADIOLIB_CC1101_STATUS_CALIBRATE 0b01000000 // 6 4 synthesizer calibration running
112#define RADIOLIB_CC1101_STATUS_SETTLING 0b01010000 // 6 4 PLL settling
113#define RADIOLIB_CC1101_STATUS_RXFIFO_OVERFLOW 0b01100000 // 6 4 Rx FIFO overflow
114#define RADIOLIB_CC1101_STATUS_TXFIFO_UNDERFLOW 0b01110000 // 6 4 Tx FIFO underflow
115
116// RADIOLIB_CC1101_REG_IOCFG2
117#define RADIOLIB_CC1101_GDO2_NORM 0b00000000 // 6 6 GDO2 output: active high (default)
118#define RADIOLIB_CC1101_GDO2_INV 0b01000000 // 6 6 active low
119
120// RADIOLIB_CC1101_REG_IOCFG1
121#define RADIOLIB_CC1101_GDO_DS_LOW 0b00000000 // 7 7 GDOx output drive strength: low (default)
122#define RADIOLIB_CC1101_GDO_DS_HIGH 0b10000000 // 7 7 high
123#define RADIOLIB_CC1101_GDO1_NORM 0b00000000 // 6 6 GDO1 output: active high (default)
124#define RADIOLIB_CC1101_GDO1_INV 0b01000000 // 6 6 active low
125
126// RADIOLIB_CC1101_REG_IOCFG0
127#define RADIOLIB_CC1101_GDO0_TEMP_SENSOR_OFF 0b00000000 // 7 7 analog temperature sensor output: disabled (default)
128#define RADIOLIB_CC1101_GDO0_TEMP_SENSOR_ON 0b10000000 // 7 7 enabled
129#define RADIOLIB_CC1101_GDO0_NORM 0b00000000 // 6 6 GDO0 output: active high (default)
130#define RADIOLIB_CC1101_GDO0_INV 0b01000000 // 6 6 active low
131
132// RADIOLIB_CC1101_REG_IOCFG2 + REG_IOCFG1 + REG_IOCFG0
133#define RADIOLIB_CC1101_GDOX_RX_FIFO_FULL 0x00 // 5 0 Rx FIFO full or above threshold
134#define RADIOLIB_CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END 0x01 // 5 0 Rx FIFO full or above threshold or reached packet end
135#define RADIOLIB_CC1101_GDOX_TX_FIFO_ABOVE_THR 0x02 // 5 0 Tx FIFO above threshold
136#define RADIOLIB_CC1101_GDOX_TX_FIFO_FULL 0x03 // 5 0 Tx FIFO full
137#define RADIOLIB_CC1101_GDOX_RX_FIFO_OVERFLOW 0x04 // 5 0 Rx FIFO overflowed
138#define RADIOLIB_CC1101_GDOX_TX_FIFO_UNDERFLOW 0x05 // 5 0 Tx FIFO underflowed
139#define RADIOLIB_CC1101_GDOX_SYNC_WORD_SENT_OR_PKT_RECEIVED 0x06 // 5 0 sync word was sent or packet was received
140#define RADIOLIB_CC1101_GDOX_PKT_RECEIVED_CRC_OK 0x07 // 5 0 packet received and CRC check passed
141#define RADIOLIB_CC1101_GDOX_PREAMBLE_QUALITY_REACHED 0x08 // 5 0 received preamble quality is above threshold
142#define RADIOLIB_CC1101_GDOX_CHANNEL_CLEAR 0x09 // 5 0 RSSI level below threshold (channel is clear)
143#define RADIOLIB_CC1101_GDOX_PLL_LOCKED 0x0A // 5 0 PLL is locked
144#define RADIOLIB_CC1101_GDOX_SERIAL_CLOCK 0x0B // 5 0 serial data clock
145#define RADIOLIB_CC1101_GDOX_SERIAL_DATA_SYNC 0x0C // 5 0 serial data output in: synchronous mode
146#define RADIOLIB_CC1101_GDOX_SERIAL_DATA_ASYNC 0x0D // 5 0 asynchronous mode
147#define RADIOLIB_CC1101_GDOX_CARRIER_SENSE 0x0E // 5 0 RSSI above threshold
148#define RADIOLIB_CC1101_GDOX_CRC_OK 0x0F // 5 0 CRC check passed
149#define RADIOLIB_CC1101_GDOX_RX_HARD_DATA1 0x16 // 5 0 direct access to demodulated data
150#define RADIOLIB_CC1101_GDOX_RX_HARD_DATA0 0x17 // 5 0 direct access to demodulated data
151#define RADIOLIB_CC1101_GDOX_PA_PD 0x1B // 5 0 power amplifier circuit is powered down
152#define RADIOLIB_CC1101_GDOX_LNA_PD 0x1C // 5 0 low-noise amplifier circuit is powered down
153#define RADIOLIB_CC1101_GDOX_RX_SYMBOL_TICK 0x1D // 5 0 direct access to symbol tick of received data
154#define RADIOLIB_CC1101_GDOX_WOR_EVNT0 0x24 // 5 0 wake-on-radio event 0
155#define RADIOLIB_CC1101_GDOX_WOR_EVNT1 0x25 // 5 0 wake-on-radio event 1
156#define RADIOLIB_CC1101_GDOX_CLK_256 0x26 // 5 0 256 Hz clock
157#define RADIOLIB_CC1101_GDOX_CLK_32K 0x27 // 5 0 32 kHz clock
158#define RADIOLIB_CC1101_GDOX_CHIP_RDYN 0x29 // 5 0 (default for GDO2)
159#define RADIOLIB_CC1101_GDOX_XOSC_STABLE 0x2B // 5 0
160#define RADIOLIB_CC1101_GDOX_HIGH_Z 0x2E // 5 0 high impedance state (default for GDO1)
161#define RADIOLIB_CC1101_GDOX_HW_TO_0 0x2F // 5 0
162#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_1 0x30 // 5 0 crystal oscillator clock: f = f(XOSC)/1
163#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_1_5 0x31 // 5 0 f = f(XOSC)/1.5
164#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_2 0x32 // 5 0 f = f(XOSC)/2
165#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_3 0x33 // 5 0 f = f(XOSC)/3
166#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_4 0x34 // 5 0 f = f(XOSC)/4
167#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_6 0x35 // 5 0 f = f(XOSC)/6
168#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_8 0x36 // 5 0 f = f(XOSC)/8
169#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_12 0x37 // 5 0 f = f(XOSC)/12
170#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_16 0x38 // 5 0 f = f(XOSC)/16
171#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_24 0x39 // 5 0 f = f(XOSC)/24
172#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_32 0x3A // 5 0 f = f(XOSC)/32
173#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_48 0x3B // 5 0 f = f(XOSC)/48
174#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_64 0x3C // 5 0 f = f(XOSC)/64
175#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_96 0x3D // 5 0 f = f(XOSC)/96
176#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_128 0x3E // 5 0 f = f(XOSC)/128
177#define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_192 0x3F // 5 0 f = f(XOSC)/192 (default for GDO0)
178
179// RADIOLIB_CC1101_REG_FIFOTHR
180#define RADIOLIB_CC1101_ADC_RETENTION_OFF 0b00000000 // 6 6 do not retain ADC settings in sleep mode (default)
181#define RADIOLIB_CC1101_ADC_RETENTION_ON 0b01000000 // 6 6 retain ADC settings in sleep mode
182#define RADIOLIB_CC1101_RX_ATTEN_0_DB 0b00000000 // 5 4 Rx attenuation: 0 dB (default)
183#define RADIOLIB_CC1101_RX_ATTEN_6_DB 0b00010000 // 5 4 6 dB
184#define RADIOLIB_CC1101_RX_ATTEN_12_DB 0b00100000 // 5 4 12 dB
185#define RADIOLIB_CC1101_RX_ATTEN_18_DB 0b00110000 // 5 4 18 dB
186#define RADIOLIB_CC1101_FIFO_THR_TX_61_RX_4 0b00000000 // 3 0 TX fifo threshold: 61, RX fifo threshold: 4
187#define RADIOLIB_CC1101_FIFO_THR_TX_33_RX_32 0b00000111 // 3 0 TX fifo threshold: 33, RX fifo threshold: 32
188#define RADIOLIB_CC1101_FIFO_THR_TX_1_RX_64 0b00001111 // 3 0 TX fifo threshold: 1, RX fifo threshold: 64
189#define RADIOLIB_CC1101_FIFO_THRESH_TX 33
190#define RADIOLIB_CC1101_FIFO_THRESH_RX 32
191
192// RADIOLIB_CC1101_REG_SYNC1
193#define RADIOLIB_CC1101_SYNC_WORD_MSB 0xD3 // 7 0 sync word MSB
194
195// RADIOLIB_CC1101_REG_SYNC0
196#define RADIOLIB_CC1101_SYNC_WORD_LSB 0x91 // 7 0 sync word LSB
197
198// RADIOLIB_CC1101_REG_PKTCTRL1
199#define RADIOLIB_CC1101_PQT 0x00 // 7 5 preamble quality threshold
200#define RADIOLIB_CC1101_CRC_AUTOFLUSH_OFF 0b00000000 // 3 3 automatic Rx FIFO flush on CRC check fail: disabled (default)
201#define RADIOLIB_CC1101_CRC_AUTOFLUSH_ON 0b00001000 // 3 3 enabled
202#define RADIOLIB_CC1101_APPEND_STATUS_OFF 0b00000000 // 2 2 append 2 status bytes to packet: disabled
203#define RADIOLIB_CC1101_APPEND_STATUS_ON 0b00000100 // 2 2 enabled (default)
204#define RADIOLIB_CC1101_ADR_CHK_NONE 0b00000000 // 1 0 address check: none (default)
205#define RADIOLIB_CC1101_ADR_CHK_NO_BROADCAST 0b00000001 // 1 0 without broadcast
206#define RADIOLIB_CC1101_ADR_CHK_SINGLE_BROADCAST 0b00000010 // 1 0 broadcast address 0x00
207#define RADIOLIB_CC1101_ADR_CHK_DOUBLE_BROADCAST 0b00000011 // 1 0 broadcast addresses 0x00 and 0xFF
208
209// RADIOLIB_CC1101_REG_PKTCTRL0
210#define RADIOLIB_CC1101_WHITE_DATA_OFF 0b00000000 // 6 6 data whitening: disabled
211#define RADIOLIB_CC1101_WHITE_DATA_ON 0b01000000 // 6 6 enabled (default)
212#define RADIOLIB_CC1101_PKT_FORMAT_NORMAL 0b00000000 // 5 4 packet format: normal (FIFOs)
213#define RADIOLIB_CC1101_PKT_FORMAT_SYNCHRONOUS 0b00010000 // 5 4 synchronous serial
214#define RADIOLIB_CC1101_PKT_FORMAT_RANDOM 0b00100000 // 5 4 random transmissions
215#define RADIOLIB_CC1101_PKT_FORMAT_ASYNCHRONOUS 0b00110000 // 5 4 asynchronous serial
216#define RADIOLIB_CC1101_CRC_OFF 0b00000000 // 2 2 CRC disabled
217#define RADIOLIB_CC1101_CRC_ON 0b00000100 // 2 2 CRC enabled (default)
218#define RADIOLIB_CC1101_LENGTH_CONFIG_FIXED 0b00000000 // 1 0 packet length: fixed
219#define RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE 0b00000001 // 1 0 variable (default)
220#define RADIOLIB_CC1101_LENGTH_CONFIG_INFINITE 0b00000010 // 1 0 infinite
221
222// RADIOLIB_CC1101_REG_ADDR
223#define RADIOLIB_CC1101_DEVICE_ADDR 0x00 // 7 0 device address
224
225// RADIOLIB_CC1101_REG_CHANNR
226#define RADIOLIB_CC1101_CHAN 0x00 // 7 0 channel number
227
228// RADIOLIB_CC1101_REG_FSCTRL1
229#define RADIOLIB_CC1101_FREQ_IF 0x0F // 4 0 IF frequency setting; f_IF = (f(XOSC) / 2^10) * CC1101_FREQ_IF
230
231// CC1101_REG_FSCTRL0
232#define RADIOLIB_CC1101_FREQOFF 0x00 // 7 0 base frequency offset (2s-compliment)
233
234// RADIOLIB_CC1101_REG_FREQ2 + REG_FREQ1 + REG_FREQ0
235#define RADIOLIB_CC1101_FREQ_MSB 0x1E // 5 0 base frequency setting: f_carrier = (f(XOSC) / 2^16) * FREQ
236#define RADIOLIB_CC1101_FREQ_MID 0xC4 // 7 0 where f(XOSC) = 26 MHz
237#define RADIOLIB_CC1101_FREQ_LSB 0xEC // 7 0 FREQ = 3-byte value of FREQ registers
238
239// RADIOLIB_CC1101_REG_MDMCFG4
240#define RADIOLIB_CC1101_CHANBW_E 0b10000000 // 7 6 channel bandwidth: BW_channel = f(XOSC) / (8 * (4 + CHANBW_M)*2^CHANBW_E) [Hz]
241#define RADIOLIB_CC1101_CHANBW_M 0b00000000 // 5 4 default value for 26 MHz crystal: 203 125 Hz
242#define RADIOLIB_CC1101_DRATE_E 0x0C // 3 0 symbol rate: R_data = (((256 + DRATE_M) * 2^DRATE_E) / 2^28) * f(XOSC) [Baud]
243
244// RADIOLIB_CC1101_REG_MDMCFG3
245#define RADIOLIB_CC1101_DRATE_M 0x22 // 7 0 default value for 26 MHz crystal: 115 051 Baud
246
247// RADIOLIB_CC1101_REG_MDMCFG2
248#define RADIOLIB_CC1101_DEM_DCFILT_OFF 0b10000000 // 7 7 digital DC filter: disabled
249#define RADIOLIB_CC1101_DEM_DCFILT_ON 0b00000000 // 7 7 enabled - only for data rates above 250 kBaud (default)
250#define RADIOLIB_CC1101_MOD_FORMAT_2_FSK 0b00000000 // 6 4 modulation format: 2-FSK (default)
251#define RADIOLIB_CC1101_MOD_FORMAT_GFSK 0b00010000 // 6 4 GFSK
252#define RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK 0b00110000 // 6 4 ASK/OOK
253#define RADIOLIB_CC1101_MOD_FORMAT_4_FSK 0b01000000 // 6 4 4-FSK
254#define RADIOLIB_CC1101_MOD_FORMAT_MFSK 0b01110000 // 6 4 MFSK - only for data rates above 26 kBaud
255#define RADIOLIB_CC1101_MANCHESTER_EN_OFF 0b00000000 // 3 3 Manchester encoding: disabled (default)
256#define RADIOLIB_CC1101_MANCHESTER_EN_ON 0b00001000 // 3 3 enabled
257#define RADIOLIB_CC1101_SYNC_MODE_NONE 0b00000000 // 2 0 synchronization: no preamble/sync
258#define RADIOLIB_CC1101_SYNC_MODE_15_16 0b00000001 // 2 0 15/16 sync word bits
259#define RADIOLIB_CC1101_SYNC_MODE_16_16 0b00000010 // 2 0 16/16 sync word bits (default)
260#define RADIOLIB_CC1101_SYNC_MODE_30_32 0b00000011 // 2 0 30/32 sync word bits
261#define RADIOLIB_CC1101_SYNC_MODE_NONE_THR 0b00000100 // 2 0 no preamble sync, carrier sense above threshold
262#define RADIOLIB_CC1101_SYNC_MODE_15_16_THR 0b00000101 // 2 0 15/16 sync word bits, carrier sense above threshold
263#define RADIOLIB_CC1101_SYNC_MODE_16_16_THR 0b00000110 // 2 0 16/16 sync word bits, carrier sense above threshold
264#define RADIOLIB_CC1101_SYNC_MODE_30_32_THR 0b00000111 // 2 0 30/32 sync word bits, carrier sense above threshold
265
266// RADIOLIB_CC1101_REG_MDMCFG1
267#define RADIOLIB_CC1101_FEC_OFF 0b00000000 // 7 7 forward error correction: disabled (default)
268#define RADIOLIB_CC1101_FEC_ON 0b10000000 // 7 7 enabled - only for fixed packet length
269#define RADIOLIB_CC1101_NUM_PREAMBLE_2 0b00000000 // 6 4 number of preamble bytes: 2
270#define RADIOLIB_CC1101_NUM_PREAMBLE_3 0b00010000 // 6 4 3
271#define RADIOLIB_CC1101_NUM_PREAMBLE_4 0b00100000 // 6 4 4 (default)
272#define RADIOLIB_CC1101_NUM_PREAMBLE_6 0b00110000 // 6 4 6
273#define RADIOLIB_CC1101_NUM_PREAMBLE_8 0b01000000 // 6 4 8
274#define RADIOLIB_CC1101_NUM_PREAMBLE_12 0b01010000 // 6 4 12
275#define RADIOLIB_CC1101_NUM_PREAMBLE_16 0b01100000 // 6 4 16
276#define RADIOLIB_CC1101_NUM_PREAMBLE_24 0b01110000 // 6 4 24
277#define RADIOLIB_CC1101_CHANSPC_E 0x02 // 1 0 channel spacing: df_channel = (f(XOSC) / 2^18) * (256 + CHANSPC_M) * 2^CHANSPC_E [Hz]
278
279// RADIOLIB_CC1101_REG_MDMCFG0
280#define RADIOLIB_CC1101_CHANSPC_M 0xF8 // 7 0 default value for 26 MHz crystal: 199 951 kHz
281
282// RADIOLIB_CC1101_REG_DEVIATN
283#define RADIOLIB_CC1101_DEVIATION_E 0b01000000 // 6 4 frequency deviation: f_dev = (f(XOSC) / 2^17) * (8 + DEVIATION_M) * 2^DEVIATION_E [Hz]
284#define RADIOLIB_CC1101_DEVIATION_M 0b00000111 // 2 0 default value for 26 MHz crystal: +- 47 607 Hz
285#define RADIOLIB_CC1101_MSK_PHASE_CHANGE_PERIOD 0x07 // 2 0 phase change symbol period fraction: 1 / (MSK_PHASE_CHANGE_PERIOD + 1)
286
287// RADIOLIB_CC1101_REG_MCSM2
288#define RADIOLIB_CC1101_RX_TIMEOUT_RSSI_OFF 0b00000000 // 4 4 Rx timeout based on RSSI value: disabled (default)
289#define RADIOLIB_CC1101_RX_TIMEOUT_RSSI_ON 0b00010000 // 4 4 enabled
290#define RADIOLIB_CC1101_RX_TIMEOUT_QUAL_OFF 0b00000000 // 3 3 check for sync word on Rx timeout
291#define RADIOLIB_CC1101_RX_TIMEOUT_QUAL_ON 0b00001000 // 3 3 check for PQI set on Rx timeout
292#define RADIOLIB_CC1101_RX_TIMEOUT_OFF 0b00000111 // 2 0 Rx timeout: disabled (default)
293#define RADIOLIB_CC1101_RX_TIMEOUT_MAX 0b00000000 // 2 0 max value (actual value depends on WOR_RES, EVENT0 and f(XOSC))
294
295// RADIOLIB_CC1101_REG_MCSM1
296#define RADIOLIB_CC1101_CCA_MODE_ALWAYS 0b00000000 // 5 4 clear channel indication: always
297#define RADIOLIB_CC1101_CCA_MODE_RSSI_THR 0b00010000 // 5 4 RSSI below threshold
298#define RADIOLIB_CC1101_CCA_MODE_RX_PKT 0b00100000 // 5 4 unless receiving packet
299#define RADIOLIB_CC1101_CCA_MODE_RSSI_THR_RX_PKT 0b00110000 // 5 4 RSSI below threshold unless receiving packet (default)
300#define RADIOLIB_CC1101_RXOFF_IDLE 0b00000000 // 3 2 next mode after packet reception: idle (default)
301#define RADIOLIB_CC1101_RXOFF_FSTXON 0b00000100 // 3 2 FSTxOn
302#define RADIOLIB_CC1101_RXOFF_TX 0b00001000 // 3 2 Tx
303#define RADIOLIB_CC1101_RXOFF_RX 0b00001100 // 3 2 Rx
304#define RADIOLIB_CC1101_TXOFF_IDLE 0b00000000 // 1 0 next mode after packet transmission: idle (default)
305#define RADIOLIB_CC1101_TXOFF_FSTXON 0b00000001 // 1 0 FSTxOn
306#define RADIOLIB_CC1101_TXOFF_TX 0b00000010 // 1 0 Tx
307#define RADIOLIB_CC1101_TXOFF_RX 0b00000011 // 1 0 Rx
308
309// RADIOLIB_CC1101_REG_MCSM0
310#define RADIOLIB_CC1101_FS_AUTOCAL_NEVER 0b00000000 // 5 4 automatic calibration: never (default)
311#define RADIOLIB_CC1101_FS_AUTOCAL_IDLE_TO_RXTX 0b00010000 // 5 4 every transition from idle to Rx/Tx
312#define RADIOLIB_CC1101_FS_AUTOCAL_RXTX_TO_IDLE 0b00100000 // 5 4 every transition from Rx/Tx to idle
313#define RADIOLIB_CC1101_FS_AUTOCAL_RXTX_TO_IDLE_4TH 0b00110000 // 5 4 every 4th transition from Rx/Tx to idle
314#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_1 0b00000000 // 3 2 number of counter expirations before CHP_RDYN goes low: 1 (default)
315#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_16 0b00000100 // 3 2 16
316#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_64 0b00001000 // 3 2 64
317#define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_256 0b00001100 // 3 2 256
318#define RADIOLIB_CC1101_PIN_CTRL_OFF 0b00000000 // 1 1 pin radio control: disabled (default)
319#define RADIOLIB_CC1101_PIN_CTRL_ON 0b00000010 // 1 1 enabled
320#define RADIOLIB_CC1101_XOSC_FORCE_OFF 0b00000000 // 0 0 do not force XOSC to remain on in sleep (default)
321#define RADIOLIB_CC1101_XOSC_FORCE_ON 0b00000001 // 0 0 force XOSC to remain on in sleep
322
323// RADIOLIB_CC1101_REG_FOCCFG
324#define RADIOLIB_CC1101_FOC_BS_CS_GATE_OFF 0b00000000 // 5 5 do not freeze frequency compensation until CS goes high
325#define RADIOLIB_CC1101_FOC_BS_CS_GATE_ON 0b00100000 // 5 5 freeze frequency compensation until CS goes high (default)
326#define RADIOLIB_CC1101_FOC_PRE_K 0b00000000 // 4 3 frequency compensation loop gain before sync word: K
327#define RADIOLIB_CC1101_FOC_PRE_2K 0b00001000 // 4 3 2K
328#define RADIOLIB_CC1101_FOC_PRE_3K 0b00010000 // 4 3 3K (default)
329#define RADIOLIB_CC1101_FOC_PRE_4K 0b00011000 // 4 3 4K
330#define RADIOLIB_CC1101_FOC_POST_K 0b00000000 // 2 2 frequency compensation loop gain after sync word: same as FOC_PRE
331#define RADIOLIB_CC1101_FOC_POST_K_2 0b00000100 // 2 2 K/2 (default)
332#define RADIOLIB_CC1101_FOC_LIMIT_NO_COMPENSATION 0b00000000 // 1 0 frequency compensation saturation point: no compensation - required for ASK/OOK
333#define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_8 0b00000001 // 1 0 +- BW_chan/8
334#define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_4 0b00000010 // 1 0 +- BW_chan/4 (default)
335#define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_2 0b00000011 // 1 0 +- BW_chan/2
336
337// RADIOLIB_CC1101_REG_BSCFG
338#define RADIOLIB_CC1101_BS_PRE_KI 0b00000000 // 7 6 clock recovery integral gain before sync word: Ki
339#define RADIOLIB_CC1101_BS_PRE_2KI 0b01000000 // 7 6 2Ki (default)
340#define RADIOLIB_CC1101_BS_PRE_3KI 0b10000000 // 7 6 3Ki
341#define RADIOLIB_CC1101_BS_PRE_4KI 0b11000000 // 7 6 4Ki
342#define RADIOLIB_CC1101_BS_PRE_KP 0b00000000 // 5 4 clock recovery proportional gain before sync word: Kp
343#define RADIOLIB_CC1101_BS_PRE_2KP 0b00010000 // 5 4 2Kp
344#define RADIOLIB_CC1101_BS_PRE_3KP 0b00100000 // 5 4 3Kp (default)
345#define RADIOLIB_CC1101_BS_PRE_4KP 0b00110000 // 5 4 4Kp
346#define RADIOLIB_CC1101_BS_POST_KI 0b00000000 // 3 3 clock recovery integral gain after sync word: same as BS_PRE
347#define RADIOLIB_CC1101_BS_POST_KI_2 0b00001000 // 3 3 Ki/2 (default)
348#define RADIOLIB_CC1101_BS_POST_KP 0b00000000 // 2 2 clock recovery proportional gain after sync word: same as BS_PRE
349#define RADIOLIB_CC1101_BS_POST_KP_1 0b00000100 // 2 2 Kp (default)
350#define RADIOLIB_CC1101_BS_LIMIT_NO_COMPENSATION 0b00000000 // 1 0 data rate compensation saturation point: no compensation
351#define RADIOLIB_CC1101_BS_LIMIT_3_125 0b00000001 // 1 0 +- 3.125 %
352#define RADIOLIB_CC1101_BS_LIMIT_6_25 0b00000010 // 1 0 +- 6.25 %
353#define RADIOLIB_CC1101_BS_LIMIT_12_5 0b00000011 // 1 0 +- 12.5 %
354
355// RADIOLIB_CC1101_REG_AGCCTRL2
356#define RADIOLIB_CC1101_MAX_DVGA_GAIN_0 0b00000000 // 7 6 reduce maximum available DVGA gain: no reduction (default)
357#define RADIOLIB_CC1101_MAX_DVGA_GAIN_1 0b01000000 // 7 6 disable top gain setting
358#define RADIOLIB_CC1101_MAX_DVGA_GAIN_2 0b10000000 // 7 6 disable top two gain setting
359#define RADIOLIB_CC1101_MAX_DVGA_GAIN_3 0b11000000 // 7 6 disable top three gain setting
360#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_0_DB 0b00000000 // 5 3 reduce maximum LNA gain by: 0 dB (default)
361#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_2_6_DB 0b00001000 // 5 3 2.6 dB
362#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_6_1_DB 0b00010000 // 5 3 6.1 dB
363#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_7_4_DB 0b00011000 // 5 3 7.4 dB
364#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_9_2_DB 0b00100000 // 5 3 9.2 dB
365#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_11_5_DB 0b00101000 // 5 3 11.5 dB
366#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_14_6_DB 0b00110000 // 5 3 14.6 dB
367#define RADIOLIB_CC1101_LNA_GAIN_REDUCE_17_1_DB 0b00111000 // 5 3 17.1 dB
368#define RADIOLIB_CC1101_MAGN_TARGET_24_DB 0b00000000 // 2 0 average amplitude target for filter: 24 dB
369#define RADIOLIB_CC1101_MAGN_TARGET_27_DB 0b00000001 // 2 0 27 dB
370#define RADIOLIB_CC1101_MAGN_TARGET_30_DB 0b00000010 // 2 0 30 dB
371#define RADIOLIB_CC1101_MAGN_TARGET_33_DB 0b00000011 // 2 0 33 dB (default)
372#define RADIOLIB_CC1101_MAGN_TARGET_36_DB 0b00000100 // 2 0 36 dB
373#define RADIOLIB_CC1101_MAGN_TARGET_38_DB 0b00000101 // 2 0 38 dB
374#define RADIOLIB_CC1101_MAGN_TARGET_40_DB 0b00000110 // 2 0 40 dB
375#define RADIOLIB_CC1101_MAGN_TARGET_42_DB 0b00000111 // 2 0 42 dB
376
377// RADIOLIB_CC1101_REG_AGCCTRL1
378#define RADIOLIB_CC1101_AGC_LNA_PRIORITY_LNA2 0b00000000 // 6 6 LNA priority setting: LNA2 first
379#define RADIOLIB_CC1101_AGC_LNA_PRIORITY_LNA 0b01000000 // 6 6 LNA first (default)
380#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_OFF 0b00000000 // 5 4 RSSI relative change to assert carrier sense: disabled (default)
381#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_6_DB 0b00010000 // 5 4 6 dB
382#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_10_DB 0b00100000 // 5 4 10 dB
383#define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_14_DB 0b00110000 // 5 4 14 dB
384#define RADIOLIB_CC1101_CARRIER_SENSE_ABS_THR 0x00 // 3 0 RSSI threshold to assert carrier sense in 2s compliment, Thr = MAGN_TARGET + CARRIER_SENSE_ABS_TH [dB]
385
386// RADIOLIB_CC1101_REG_AGCCTRL0
387#define RADIOLIB_CC1101_HYST_LEVEL_NONE 0b00000000 // 7 6 AGC hysteresis level: none
388#define RADIOLIB_CC1101_HYST_LEVEL_LOW 0b01000000 // 7 6 low
389#define RADIOLIB_CC1101_HYST_LEVEL_MEDIUM 0b10000000 // 7 6 medium (default)
390#define RADIOLIB_CC1101_HYST_LEVEL_HIGH 0b11000000 // 7 6 high
391#define RADIOLIB_CC1101_WAIT_TIME_8_SAMPLES 0b00000000 // 5 4 AGC wait time: 8 samples
392#define RADIOLIB_CC1101_WAIT_TIME_16_SAMPLES 0b00010000 // 5 4 16 samples (default)
393#define RADIOLIB_CC1101_WAIT_TIME_24_SAMPLES 0b00100000 // 5 4 24 samples
394#define RADIOLIB_CC1101_WAIT_TIME_32_SAMPLES 0b00110000 // 5 4 32 samples
395#define RADIOLIB_CC1101_AGC_FREEZE_NEVER 0b00000000 // 3 2 freeze AGC gain: never (default)
396#define RADIOLIB_CC1101_AGC_FREEZE_SYNC_WORD 0b00000100 // 3 2 when sync word is found
397#define RADIOLIB_CC1101_AGC_FREEZE_MANUAL_A 0b00001000 // 3 2 manually freeze analog control
398#define RADIOLIB_CC1101_AGC_FREEZE_MANUAL_AD 0b00001100 // 3 2 manually freeze analog and digital control
399#define RADIOLIB_CC1101_FILTER_LENGTH_8 0b00000000 // 1 0 averaging length for channel filter: 8 samples
400#define RADIOLIB_CC1101_FILTER_LENGTH_16 0b00000001 // 1 0 16 samples (default)
401#define RADIOLIB_CC1101_FILTER_LENGTH_32 0b00000010 // 1 0 32 samples
402#define RADIOLIB_CC1101_FILTER_LENGTH_64 0b00000011 // 1 0 64 samples
403#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_4_DB 0b00000000 // 1 0 ASK/OOK decision boundary: 4 dB
404#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_8_DB 0b00000001 // 1 0 8 dB (default)
405#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_12_DB 0b00000010 // 1 0 12 dB
406#define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_16_DB 0b00000011 // 1 0 16 dB
407
408// RADIOLIB_CC1101_REG_WOREVT1 + REG_WOREVT0
409#define RADIOLIB_CC1101_EVENT0_TIMEOUT_MSB 0x87 // 7 0 EVENT0 timeout: t_event0 = (750 / f(XOSC)) * EVENT0_TIMEOUT * 2^(5 * WOR_RES) [s]
410#define RADIOLIB_CC1101_EVENT0_TIMEOUT_LSB 0x6B // 7 0 default value for 26 MHz crystal: 1.0 s
411
412// RADIOLIB_CC1101_REG_WORCTRL
413#define RADIOLIB_CC1101_RC_POWER_UP 0b00000000 // 7 7 power up RC oscillator
414#define RADIOLIB_CC1101_RC_POWER_DOWN 0b10000000 // 7 7 power down RC oscillator
415#define RADIOLIB_CC1101_EVENT1_TIMEOUT_4 0b00000000 // 6 4 EVENT1 timeout: 4 RC periods
416#define RADIOLIB_CC1101_EVENT1_TIMEOUT_6 0b00010000 // 6 4 6 RC periods
417#define RADIOLIB_CC1101_EVENT1_TIMEOUT_8 0b00100000 // 6 4 8 RC periods
418#define RADIOLIB_CC1101_EVENT1_TIMEOUT_12 0b00110000 // 6 4 12 RC periods
419#define RADIOLIB_CC1101_EVENT1_TIMEOUT_16 0b01000000 // 6 4 16 RC periods
420#define RADIOLIB_CC1101_EVENT1_TIMEOUT_24 0b01010000 // 6 4 24 RC periods
421#define RADIOLIB_CC1101_EVENT1_TIMEOUT_32 0b01100000 // 6 4 32 RC periods
422#define RADIOLIB_CC1101_EVENT1_TIMEOUT_48 0b01110000 // 6 4 48 RC periods (default)
423#define RADIOLIB_CC1101_RC_CAL_OFF 0b00000000 // 3 3 disable RC oscillator calibration
424#define RADIOLIB_CC1101_RC_CAL_ON 0b00001000 // 3 3 enable RC oscillator calibration (default)
425#define RADIOLIB_CC1101_WOR_RES_1 0b00000000 // 1 0 EVENT0 resolution: 1 period (default)
426#define RADIOLIB_CC1101_WOR_RES_2_5 0b00000001 // 1 0 2^5 periods
427#define RADIOLIB_CC1101_WOR_RES_2_10 0b00000010 // 1 0 2^10 periods
428#define RADIOLIB_CC1101_WOR_RES_2_15 0b00000011 // 1 0 2^15 periods
429
430// RADIOLIB_CC1101_REG_FREND1
431#define RADIOLIB_CC1101_LNA_CURRENT 0x01 // 7 6 front-end LNA PTAT current output adjustment
432#define RADIOLIB_CC1101_LNA2MIX_CURRENT 0x01 // 5 4 front-end PTAT output adjustment
433#define RADIOLIB_CC1101_LODIV_BUF_CURRENT_RX 0x01 // 3 2 Rx LO buffer current adjustment
434#define RADIOLIB_CC1101_MIX_CURRENT 0x02 // 1 0 mixer current adjustment
435
436// RADIOLIB_CC1101_REG_FREND0
437#define RADIOLIB_CC1101_LODIV_BUF_CURRENT_TX 0x01 // 5 4 Tx LO buffer current adjustment
438#define RADIOLIB_CC1101_PA_POWER 0x00 // 2 0 set power amplifier power according to PATABLE
439
440// RADIOLIB_CC1101_REG_FSCAL3
441#define RADIOLIB_CC1101_CHP_CURR_CAL_OFF 0b00000000 // 5 4 disable charge pump calibration
442#define RADIOLIB_CC1101_CHP_CURR_CAL_ON 0b00100000 // 5 4 enable charge pump calibration (default)
443#define RADIOLIB_CC1101_FSCAL3 0x09 // 3 0 charge pump output current: I_out = I_0 * 2^(FSCAL3/4) [A]
444
445// RADIOLIB_CC1101_REG_FSCAL2
446#define RADIOLIB_CC1101_VCO_CORE_LOW 0b00000000 // 5 5 VCO: low (default)
447#define RADIOLIB_CC1101_VCO_CORE_HIGH 0b00100000 // 5 5 high
448#define RADIOLIB_CC1101_FSCAL2 0x0A // 4 0 VCO current result/override
449
450// RADIOLIB_CC1101_REG_FSCAL1
451#define RADIOLIB_CC1101_FSCAL1 0x20 // 5 0 capacitor array setting for coarse VCO tuning
452
453// RADIOLIB_CC1101_REG_FSCAL0
454#define RADIOLIB_CC1101_FSCAL0 0x0D // 6 0 frequency synthesizer calibration setting
455
456// RADIOLIB_CC1101_REG_RCCTRL1
457#define RADIOLIB_CC1101_RCCTRL1 0x41 // 6 0 RC oscillator configuration
458
459// RADIOLIB_CC1101_REG_RCCTRL0
460#define RADIOLIB_CC1101_RCCTRL0 0x00 // 6 0 RC oscillator configuration
461
462// RADIOLIB_CC1101_REG_PTEST
463#define RADIOLIB_CC1101_TEMP_SENS_IDLE_OFF 0x7F // 7 0 temperature sensor will not be available in idle mode (default)
464#define RADIOLIB_CC1101_TEMP_SENS_IDLE_ON 0xBF // 7 0 temperature sensor will be available in idle mode
465
466// RADIOLIB_CC1101_REG_TEST0
467#define RADIOLIB_CC1101_VCO_SEL_CAL_OFF 0b00000000 // 1 1 disable VCO selection calibration stage
468#define RADIOLIB_CC1101_VCO_SEL_CAL_ON 0b00000010 // 1 1 enable VCO selection calibration stage
469
470// RADIOLIB_CC1101_REG_PARTNUM
471#define RADIOLIB_CC1101_PARTNUM 0x00
472
473// RADIOLIB_CC1101_REG_VERSION
474#define RADIOLIB_CC1101_VERSION_CURRENT 0x14
475#define RADIOLIB_CC1101_VERSION_LEGACY 0x04
476#define RADIOLIB_CC1101_VERSION_CLONE 0x17
477#define RADIOLIB_CC1101_VERSION_CLONE2 0x03
478
479// RADIOLIB_CC1101_REG_MARCSTATE
480#define RADIOLIB_CC1101_MARC_STATE_SLEEP 0x00 // 4 0 main radio control state: sleep
481#define RADIOLIB_CC1101_MARC_STATE_IDLE 0x01 // 4 0 idle
482#define RADIOLIB_CC1101_MARC_STATE_XOFF 0x02 // 4 0 XOFF
483#define RADIOLIB_CC1101_MARC_STATE_VCOON_MC 0x03 // 4 0 VCOON_MC
484#define RADIOLIB_CC1101_MARC_STATE_REGON_MC 0x04 // 4 0 REGON_MC
485#define RADIOLIB_CC1101_MARC_STATE_MANCAL 0x05 // 4 0 MANCAL
486#define RADIOLIB_CC1101_MARC_STATE_VCOON 0x06 // 4 0 VCOON
487#define RADIOLIB_CC1101_MARC_STATE_REGON 0x07 // 4 0 REGON
488#define RADIOLIB_CC1101_MARC_STATE_STARTCAL 0x08 // 4 0 STARTCAL
489#define RADIOLIB_CC1101_MARC_STATE_BWBOOST 0x09 // 4 0 BWBOOST
490#define RADIOLIB_CC1101_MARC_STATE_FS_LOCK 0x0A // 4 0 FS_LOCK
491#define RADIOLIB_CC1101_MARC_STATE_IFADCON 0x0B // 4 0 IFADCON
492#define RADIOLIB_CC1101_MARC_STATE_ENDCAL 0x0C // 4 0 ENDCAL
493#define RADIOLIB_CC1101_MARC_STATE_RX 0x0D // 4 0 RX
494#define RADIOLIB_CC1101_MARC_STATE_RX_END 0x0E // 4 0 RX_END
495#define RADIOLIB_CC1101_MARC_STATE_RX_RST 0x0F // 4 0 RX_RST
496#define RADIOLIB_CC1101_MARC_STATE_TXRX_SWITCH 0x10 // 4 0 TXRX_SWITCH
497#define RADIOLIB_CC1101_MARC_STATE_RXFIFO_OVERFLOW 0x11 // 4 0 RXFIFO_OVERFLOW
498#define RADIOLIB_CC1101_MARC_STATE_FSTXON 0x12 // 4 0 FSTXON
499#define RADIOLIB_CC1101_MARC_STATE_TX 0x13 // 4 0 TX
500#define RADIOLIB_CC1101_MARC_STATE_TX_END 0x14 // 4 0 TX_END
501#define RADIOLIB_CC1101_MARC_STATE_RXTX_SWITCH 0x15 // 4 0 RXTX_SWITCH
502#define RADIOLIB_CC1101_MARC_STATE_TXFIFO_UNDERFLOW 0x16 // 4 0 TXFIFO_UNDERFLOW
503
504// RADIOLIB_CC1101_REG_WORTIME1 + REG_WORTIME0
505#define RADIOLIB_CC1101_WORTIME_MSB 0x00 // 7 0 WOR timer value
506#define RADIOLIB_CC1101_WORTIME_LSB 0x00 // 7 0
507
508// RADIOLIB_CC1101_REG_PKTSTATUS
509#define RADIOLIB_CC1101_CRC_OK 0b10000000 // 7 7 CRC check passed
510#define RADIOLIB_CC1101_CRC_ERROR 0b00000000 // 7 7 CRC check failed
511#define RADIOLIB_CC1101_CS 0b01000000 // 6 6 carrier sense
512#define RADIOLIB_CC1101_PQT_REACHED 0b00100000 // 5 5 preamble quality reached
513#define RADIOLIB_CC1101_CCA 0b00010000 // 4 4 channel clear
514#define RADIOLIB_CC1101_SFD 0b00001000 // 3 3 start of frame delimiter - sync word received
515#define RADIOLIB_CC1101_GDO2_ACTIVE 0b00000100 // 2 2 GDO2 is active/asserted
516#define RADIOLIB_CC1101_GDO0_ACTIVE 0b00000001 // 0 0 GDO0 is active/asserted
517
518// RadioLib defaults
519#define RADIOLIB_CC1101_DEFAULT_FREQ RADIOLIB_UNIT_MEGA(434)
520#define RADIOLIB_CC1101_DEFAULT_BR 4800
521#define RADIOLIB_CC1101_DEFAULT_FREQDEV 5000
522#define RADIOLIB_CC1101_DEFAULT_RXBW RADIOLIB_UNIT_KILO(58)
523#define RADIOLIB_CC1101_DEFAULT_POWER 10
524#define RADIOLIB_CC1101_DEFAULT_PREAMBLELEN 16
525#define RADIOLIB_CC1101_DEFAULT_SW {0x12, 0xAD}
526#define RADIOLIB_CC1101_DEFAULT_SW_LEN 2
527
532class CC1101: public PhysicalLayer {
533 public:
534 // introduce PhysicalLayer overloads
539
544 // cppcheck-suppress noExplicitConstructor
545 CC1101(Module* module);
546
547 // basic methods
548
556 int16_t begin(const ConfigFSK_t& config);
557
565 int16_t beginFSK4(const ConfigFSK_t& config);
566
570 void reset();
571
580 int16_t transmit(const uint8_t* data, size_t len, uint8_t addr = 0) override;
581
591 int16_t receive(uint8_t* data, size_t len, RadioLibTime_t timeout = 0) override;
592
597 int16_t standby() override;
598
604 int16_t standby(uint8_t mode) override;
605
610 int16_t sleep() override;
611
617 int16_t transmitDirect(uint32_t frf = 0) override;
618
623 int16_t receiveDirect() override;
624
630 int16_t transmitDirectAsync(uint32_t frf = 0);
631
636 int16_t receiveDirectAsync();
637
642 int16_t packetMode();
643
644 // interrupt methods
645
651 void setGdo0Action(void (*func)(void), uint32_t dir);
652
656 void clearGdo0Action();
657
663 void setGdo2Action(void (*func)(void), uint32_t dir);
664
668 void clearGdo2Action();
669
681 int16_t startTransmit(const uint8_t* data, size_t len, uint8_t addr = 0) override;
682
687 int16_t finishTransmit() override;
688
693 int16_t startReceive() override;
694
703 int16_t startReceive(uint32_t timeout, uint32_t irqFlags, uint32_t irqMask, size_t len) override;
704
713 int16_t readData(uint8_t* data, size_t len) override;
714
719 int16_t finishReceive() override;
720
721 // configuration methods
722
729 int16_t setFrequency(uint32_t freq) override;
730
736 int16_t setBitRate(uint32_t br) override;
737
743 int16_t setBitRateTolerance(uint8_t brt);
744
752 int16_t setRxBandwidth(uint32_t rxBw);
753
760 int16_t autoSetRxBandwidth();
761
767 int16_t setFrequencyDeviation(uint32_t freqDev) override;
768
774 int16_t getFrequencyDeviation(uint32_t *freqDev);
775
781 int16_t setOutputPower(int8_t pwr) override;
782
789 int16_t setSyncWord(uint8_t *sync, size_t len) override;
790
800 int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0, bool requireCarrierSense = false, bool repeatSync = false);
801
811 int16_t setSyncWord(const uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0, bool requireCarrierSense = false, bool repeatSync = false);
812
819 int16_t setPreambleLength(size_t preambleLength, size_t qualityThreshold = 0) override;
820
826 int16_t enableRxAfterTx(bool enable = true);
827
835 int16_t setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs = 0);
836
841 int16_t disableAddressFiltering();
842
848 int16_t setOOK(bool enableOOK);
849
855 float getRSSI() override;
856
861 uint8_t getLQI() const;
862
868 size_t getPacketLength(bool update = true) override;
869
875 int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_CC1101_MAX_PACKET_LENGTH);
876
882 int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_CC1101_MAX_PACKET_LENGTH);
883
891 int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0, bool requireCarrierSense = false, bool repeatSync = false);
892
898 int16_t disableSyncWordFiltering(bool requireCarrierSense = false);
899
905 int16_t setCrcFiltering(bool enable = true);
906
913 int16_t setPromiscuousMode(bool enable = true, bool requireCarrierSense = false);
914
920 bool getPromiscuousMode();
921
928 int16_t setDataShaping(uint8_t sh) override;
929
936 int16_t setEncoding(uint8_t encoding) override;
937
939 void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
940
942 void setRfSwitchTable(const uint32_t (&pins)[Module::RFSWITCH_MAX_PINS], const Module::RfSwitchMode_t table[]);
943
948 uint8_t randomByte() override;
949
955 int16_t getChipVersion();
956
957 #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
962 void setDirectAction(void (*func)(void)) override;
963
968 void readBit(uint32_t pin) override;
969 #endif
970
977 int16_t setDIOMapping(uint32_t pin, uint32_t value);
978
979 #if !RADIOLIB_GODMODE && !RADIOLIB_LOW_LEVEL
980 protected:
981 #endif
982 Module* getMod() override;
983
984 // SPI read overrides to set bit for burst write and status registers access
985 int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0);
986 int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2);
987 void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes);
988 uint8_t SPIreadRegister(uint8_t reg);
989 void SPIwriteRegisterBurst(uint8_t reg, const uint8_t* data, size_t len);
990 void SPIwriteRegister(uint8_t reg, uint8_t data);
991
992 void SPIsendCommand(uint8_t cmd);
993
994 #if !RADIOLIB_GODMODE
995 private:
996 #endif
997 Module* mod;
998
999 uint32_t frequency = RADIOLIB_CC1101_DEFAULT_FREQ;
1000 uint32_t bitRate = RADIOLIB_CC1101_DEFAULT_BR;
1001 uint8_t rawRSSI = 0;
1002 uint8_t rawLQI = 0;
1003 uint8_t modulation = RADIOLIB_CC1101_MOD_FORMAT_2_FSK;
1004
1005 size_t packetLength = 0;
1006 bool packetLengthQueried = false;
1007 uint8_t packetLengthConfig = RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE;
1008
1009 bool promiscuous = false;
1010 bool crcOn = true;
1011 bool directModeEnabled = false;
1012 uint8_t preambleLen = RADIOLIB_CC1101_DEFAULT_PREAMBLELEN;
1013
1014 int8_t power = RADIOLIB_CC1101_DEFAULT_POWER;
1015
1016 int16_t beginCommon(const ConfigFSK_t& config);
1017 int16_t config();
1018 int16_t transmitDirect(bool sync, uint32_t frf);
1019 int16_t receiveDirect(bool sync);
1020 int16_t directMode(bool sync);
1021 static void getExpMant(uint32_t target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant);
1022 int16_t setPacketMode(uint8_t mode, uint16_t len);
1023};
1024
1025#endif
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 CC1101.cpp:999
int16_t sleep() override
Sets the module to sleep mode.
Definition CC1101.cpp:134
void readBit(uint32_t pin) override
Function to read and process data bit in direct reception mode.
Definition CC1101.cpp:994
size_t getPacketLength(bool update=true) override
Query modem for the packet length of received payload.
Definition CC1101.cpp:806
uint8_t randomByte() override
Get one truly random byte from RSSI noise.
Definition CC1101.cpp:966
int16_t setRxBandwidth(uint32_t rxBw)
Sets receiver bandwidth. Allowed values are 58, 68, 81, 102, 116, 135, 162, 203, 232,...
Definition CC1101.cpp:503
void reset()
Reset method - resets the chip using manual reset sequence (without RESET pin).
Definition CC1101.cpp:26
int16_t transmitDirect(uint32_t frf=0) override
Starts synchronous direct mode transmission.
Definition CC1101.cpp:140
void setDirectAction(void(*func)(void)) override
Set interrupt service routine function to call when data bit is receveid in direct mode.
Definition CC1101.cpp:990
int16_t getChipVersion()
Read version SPI register. Should return CC1101_VERSION_LEGACY (0x04) or CC1101_VERSION_CURRENT (0x14...
Definition CC1101.cpp:985
int16_t setFrequency(uint32_t freq) override
Sets carrier frequency. Allowed values are in bands 300 to 348 MHz, 387 to 464 MHz and 779 to 928 MHz...
Definition CC1101.cpp:452
int16_t packetMode()
Stops direct mode. It is required to call this method to switch from direct transmissions to packet-b...
Definition CC1101.cpp:196
int16_t autoSetRxBandwidth()
calculates and sets Rx bandwidth based on the freq, baud and freq uncertainty. Reimplement of atlas0f...
Definition CC1101.cpp:534
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 CC1101.cpp:73
int16_t disableSyncWordFiltering(bool requireCarrierSense=false)
Disable preamble and sync word filtering and generation.
Definition CC1101.cpp:859
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 CC1101.cpp:31
int16_t variablePacketLengthMode(uint8_t maxLen=RADIOLIB_CC1101_MAX_PACKET_LENGTH)
Set modem in variable packet length mode.
Definition CC1101.cpp:830
uint8_t getLQI() const
Gets LQI (Link Quality Indicator) of the last received packet.
Definition CC1101.cpp:802
int16_t setOutputPower(int8_t pwr) override
Sets output power. Allowed values are -30, -20, -15, -10, 0, 5, 7 or 10 dBm.
Definition CC1101.cpp:587
void setRfSwitchPins(uint32_t rxEn, uint32_t txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition CC1101.cpp:958
int16_t setCrcFiltering(bool enable=true)
Enable CRC filtering and generation.
Definition CC1101.cpp:864
CC1101(Module *module)
Default constructor.
Definition CC1101.cpp:5
int16_t getFrequencyDeviation(uint32_t *freqDev)
Gets frequency deviation.
Definition CC1101.cpp:565
int16_t setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs=0)
Sets node and broadcast addresses. Calling this method will also enable address filtering.
Definition CC1101.cpp:732
int16_t startTransmit(const uint8_t *data, size_t len, uint8_t addr=0) override
Interrupt-driven binary transmit method for packets less than 64 bytes. Method blocks for packets lon...
Definition CC1101.cpp:226
int16_t setBitRate(uint32_t br) override
Sets bit rate. Allowed values range from 25 bps to 600 kbps.
Definition CC1101.cpp:478
int16_t standby() override
Sets the module to standby mode.
Definition CC1101.cpp:110
int16_t enableSyncWordFiltering(uint8_t maxErrBits=0, bool requireCarrierSense=false, bool repeatSync=false)
Enable sync word filtering and generation.
Definition CC1101.cpp:834
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 CC1101.cpp:962
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 CC1101.cpp:394
int16_t disableAddressFiltering()
Disables address filtering. Calling this method will also erase previously set addresses.
Definition CC1101.cpp:743
void setGdo0Action(void(*func)(void), uint32_t dir)
Sets interrupt service routine to call when GDO0 activates.
Definition CC1101.cpp:203
int16_t receiveDirectAsync()
Starts asynchronous direct mode reception.
Definition CC1101.cpp:175
int16_t receiveDirect() override
Starts synchronous direct mode reception.
Definition CC1101.cpp:171
int16_t setSyncWord(uint8_t *sync, size_t len) override
Set 1 or 2 bytes of sync word.
Definition CC1101.cpp:651
int16_t setEncoding(uint8_t encoding) override
Sets transmission encoding. Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER,...
Definition CC1101.cpp:934
void clearGdo0Action()
Clears interrupt service routine to call when GDO0 activates.
Definition CC1101.cpp:207
float getRSSI() override
Gets RSSI (Received Signal Strength Indicator) of the last received packet. In direct or asynchronous...
Definition CC1101.cpp:782
int16_t setPromiscuousMode(bool enable=true, bool requireCarrierSense=false)
Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address,...
Definition CC1101.cpp:874
int16_t beginFSK4(const ConfigFSK_t &config)
Initialization method for 4-FSK modem.
Definition CC1101.cpp:20
void clearGdo2Action()
Clears interrupt service routine to call when GDO0 activates.
Definition CC1101.cpp:219
int16_t enableRxAfterTx(bool enable=true)
Enables/disables automatic switch to reception after transmission. Uses the TXOFF_RX mode of CC1101.
Definition CC1101.cpp:727
int16_t begin(const ConfigFSK_t &config)
Initialization method for FSK modem.
Definition CC1101.cpp:14
int16_t fixedPacketLengthMode(uint8_t len=RADIOLIB_CC1101_MAX_PACKET_LENGTH)
Set modem in fixed packet length mode.
Definition CC1101.cpp:820
void setGdo2Action(void(*func)(void), uint32_t dir)
Sets interrupt service routine to call when GDO2 activates.
Definition CC1101.cpp:211
int16_t setPreambleLength(size_t preambleLength, size_t qualityThreshold=0) override
Sets preamble length.
Definition CC1101.cpp:683
int16_t setBitRateTolerance(uint8_t brt)
Sets bit rate tolerance in BSCFG register. Allowed values are 0:(0%), 1(3,125%), 2:(6,...
Definition CC1101.cpp:498
int16_t setFrequencyDeviation(uint32_t freqDev) override
Sets frequency deviation. Allowed values range from 1.587 to 380.8 kHz.
Definition CC1101.cpp:543
int16_t setDataShaping(uint8_t sh) override
Sets Gaussian filter bandwidth-time product that will be used for data shaping. Allowed value is RADI...
Definition CC1101.cpp:915
int16_t startReceive() override
Interrupt-driven receive method. GDO0 will be activated when full packet is received.
Definition CC1101.cpp:358
int16_t finishReceive() override
Clean up after reception is done.
Definition CC1101.cpp:442
bool getPromiscuousMode()
Get whether the modem is in promiscuous mode: no packet filtering (e.g., no preamble,...
Definition CC1101.cpp:911
int16_t transmitDirectAsync(uint32_t frf=0)
Starts asynchronous direct mode transmission.
Definition CC1101.cpp:144
int16_t finishTransmit() override
Clean up after transmission is done.
Definition CC1101.cpp:328
int16_t setOOK(bool enableOOK)
Enables/disables OOK modulation instead of FSK.
Definition CC1101.cpp:753
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:226
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition PhysicalLayer.cpp:53
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
unsigned long RadioLibTime_t
Type used for durations in RadioLib.
Definition TypeDef.h:778
Definition PhysicalLayer.h:310
Description of RF switch pin states for a single mode. See setRfSwitchTable for details.
Definition Module.h:90