acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
CC1101.h (62284B)
1 #if !defined(_RADIOLIB_CC1101_H) && !defined(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_CRYSTAL_FREQ 26.0 13 #define RADIOLIB_CC1101_DIV_EXPONENT 16 14 #define RADIOLIB_CC1101_FIFO_SIZE 64 15 16 // CC1101 SPI commands 17 #define RADIOLIB_CC1101_CMD_READ 0b10000000 18 #define RADIOLIB_CC1101_CMD_WRITE 0b00000000 19 #define RADIOLIB_CC1101_CMD_BURST 0b01000000 20 #define RADIOLIB_CC1101_CMD_ACCESS_STATUS_REG 0b01000000 21 #define RADIOLIB_CC1101_CMD_FIFO_RX 0b10000000 22 #define RADIOLIB_CC1101_CMD_FIFO_TX 0b00000000 23 #define RADIOLIB_CC1101_CMD_RESET 0x30 24 #define RADIOLIB_CC1101_CMD_FSTXON 0x31 25 #define RADIOLIB_CC1101_CMD_XOFF 0x32 26 #define RADIOLIB_CC1101_CMD_CAL 0x33 27 #define RADIOLIB_CC1101_CMD_RX 0x34 28 #define RADIOLIB_CC1101_CMD_TX 0x35 29 #define RADIOLIB_CC1101_CMD_IDLE 0x36 30 #define RADIOLIB_CC1101_CMD_WOR 0x38 31 #define RADIOLIB_CC1101_CMD_POWER_DOWN 0x39 32 #define RADIOLIB_CC1101_CMD_FLUSH_RX 0x3A 33 #define RADIOLIB_CC1101_CMD_FLUSH_TX 0x3B 34 #define RADIOLIB_CC1101_CMD_WOR_RESET 0x3C 35 #define RADIOLIB_CC1101_CMD_NOP 0x3D 36 37 // CC1101 register map 38 #define RADIOLIB_CC1101_REG_IOCFG2 0x00 39 #define RADIOLIB_CC1101_REG_IOCFG1 0x01 40 #define RADIOLIB_CC1101_REG_IOCFG0 0x02 41 #define RADIOLIB_CC1101_REG_FIFOTHR 0x03 42 #define RADIOLIB_CC1101_REG_SYNC1 0x04 43 #define RADIOLIB_CC1101_REG_SYNC0 0x05 44 #define RADIOLIB_CC1101_REG_PKTLEN 0x06 45 #define RADIOLIB_CC1101_REG_PKTCTRL1 0x07 46 #define RADIOLIB_CC1101_REG_PKTCTRL0 0x08 47 #define RADIOLIB_CC1101_REG_ADDR 0x09 48 #define RADIOLIB_CC1101_REG_CHANNR 0x0A 49 #define RADIOLIB_CC1101_REG_FSCTRL1 0x0B 50 #define RADIOLIB_CC1101_REG_FSCTRL0 0x0C 51 #define RADIOLIB_CC1101_REG_FREQ2 0x0D 52 #define RADIOLIB_CC1101_REG_FREQ1 0x0E 53 #define RADIOLIB_CC1101_REG_FREQ0 0x0F 54 #define RADIOLIB_CC1101_REG_MDMCFG4 0x10 55 #define RADIOLIB_CC1101_REG_MDMCFG3 0x11 56 #define RADIOLIB_CC1101_REG_MDMCFG2 0x12 57 #define RADIOLIB_CC1101_REG_MDMCFG1 0x13 58 #define RADIOLIB_CC1101_REG_MDMCFG0 0x14 59 #define RADIOLIB_CC1101_REG_DEVIATN 0x15 60 #define RADIOLIB_CC1101_REG_MCSM2 0x16 61 #define RADIOLIB_CC1101_REG_MCSM1 0x17 62 #define RADIOLIB_CC1101_REG_MCSM0 0x18 63 #define RADIOLIB_CC1101_REG_FOCCFG 0x19 64 #define RADIOLIB_CC1101_REG_BSCFG 0x1A 65 #define RADIOLIB_CC1101_REG_AGCCTRL2 0x1B 66 #define RADIOLIB_CC1101_REG_AGCCTRL1 0x1C 67 #define RADIOLIB_CC1101_REG_AGCCTRL0 0x1D 68 #define RADIOLIB_CC1101_REG_WOREVT1 0x1E 69 #define RADIOLIB_CC1101_REG_WOREVT0 0x1F 70 #define RADIOLIB_CC1101_REG_WORCTRL 0x20 71 #define RADIOLIB_CC1101_REG_FREND1 0x21 72 #define RADIOLIB_CC1101_REG_FREND0 0x22 73 #define RADIOLIB_CC1101_REG_FSCAL3 0x23 74 #define RADIOLIB_CC1101_REG_FSCAL2 0x24 75 #define RADIOLIB_CC1101_REG_FSCAL1 0x25 76 #define RADIOLIB_CC1101_REG_FSCAL0 0x26 77 #define RADIOLIB_CC1101_REG_RCCTRL1 0x27 78 #define RADIOLIB_CC1101_REG_RCCTRL0 0x28 79 #define RADIOLIB_CC1101_REG_FSTEST 0x29 80 #define RADIOLIB_CC1101_REG_PTEST 0x2A 81 #define RADIOLIB_CC1101_REG_AGCTEST 0x2B 82 #define RADIOLIB_CC1101_REG_TEST2 0x2C 83 #define RADIOLIB_CC1101_REG_TEST1 0x2D 84 #define RADIOLIB_CC1101_REG_TEST0 0x2E 85 #define RADIOLIB_CC1101_REG_PARTNUM 0x30 86 #define RADIOLIB_CC1101_REG_VERSION 0x31 87 #define RADIOLIB_CC1101_REG_FREQEST 0x32 88 #define RADIOLIB_CC1101_REG_LQI 0x33 89 #define RADIOLIB_CC1101_REG_RSSI 0x34 90 #define RADIOLIB_CC1101_REG_MARCSTATE 0x35 91 #define RADIOLIB_CC1101_REG_WORTIME1 0x36 92 #define RADIOLIB_CC1101_REG_WORTIME0 0x37 93 #define RADIOLIB_CC1101_REG_PKTSTATUS 0x38 94 #define RADIOLIB_CC1101_REG_VCO_VC_DAC 0x39 95 #define RADIOLIB_CC1101_REG_TXBYTES 0x3A 96 #define RADIOLIB_CC1101_REG_RXBYTES 0x3B 97 #define RADIOLIB_CC1101_REG_RCCTRL1_STATUS 0x3C 98 #define RADIOLIB_CC1101_REG_RCCTRL0_STATUS 0x3D 99 #define RADIOLIB_CC1101_REG_PATABLE 0x3E 100 #define RADIOLIB_CC1101_REG_FIFO 0x3F 101 102 // CC1101_REG_IOCFG2 MSB LSB DESCRIPTION 103 #define RADIOLIB_CC1101_GDO2_NORM 0b00000000 // 6 6 GDO2 output: active high (default) 104 #define RADIOLIB_CC1101_GDO2_INV 0b01000000 // 6 6 active low 105 106 // CC1101_REG_IOCFG1 107 #define RADIOLIB_CC1101_GDO1_DS_LOW 0b00000000 // 7 7 GDO1 output drive strength: low (default) 108 #define RADIOLIB_CC1101_GDO1_DS_HIGH 0b10000000 // 7 7 high 109 #define RADIOLIB_CC1101_GDO1_NORM 0b00000000 // 6 6 GDO1 output: active high (default) 110 #define RADIOLIB_CC1101_GDO1_INV 0b01000000 // 6 6 active low 111 112 // CC1101_REG_IOCFG0 113 #define RADIOLIB_CC1101_GDO0_TEMP_SENSOR_OFF 0b00000000 // 7 7 analog temperature sensor output: disabled (default) 114 #define RADIOLIB_CC1101_GDO0_TEMP_SENSOR_ON 0b10000000 // 7 0 enabled 115 #define RADIOLIB_CC1101_GDO0_NORM 0b00000000 // 6 6 GDO0 output: active high (default) 116 #define RADIOLIB_CC1101_GDO0_INV 0b01000000 // 6 6 active low 117 118 // CC1101_REG_IOCFG2 + REG_IOCFG1 + REG_IOCFG0 119 #define RADIOLIB_CC1101_GDOX_RX_FIFO_FULL 0x00 // 5 0 Rx FIFO full or above threshold 120 #define RADIOLIB_CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END 0x01 // 5 0 Rx FIFO full or above threshold or reached packet end 121 #define RADIOLIB_CC1101_GDOX_TX_FIFO_ABOVE_THR 0x02 // 5 0 Tx FIFO above threshold 122 #define RADIOLIB_CC1101_GDOX_TX_FIFO_FULL 0x03 // 5 0 Tx FIFO full 123 #define RADIOLIB_CC1101_GDOX_RX_FIFO_OVERFLOW 0x04 // 5 0 Rx FIFO overflowed 124 #define RADIOLIB_CC1101_GDOX_TX_FIFO_UNDERFLOW 0x05 // 5 0 Tx FIFO underflowed 125 #define RADIOLIB_CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED 0x06 // 5 0 sync word was sent or received 126 #define RADIOLIB_CC1101_GDOX_PKT_RECEIVED_CRC_OK 0x07 // 5 0 packet received and CRC check passed 127 #define RADIOLIB_CC1101_GDOX_PREAMBLE_QUALITY_REACHED 0x08 // 5 0 received preamble quality is above threshold 128 #define RADIOLIB_CC1101_GDOX_CHANNEL_CLEAR 0x09 // 5 0 RSSI level below threshold (channel is clear) 129 #define RADIOLIB_CC1101_GDOX_PLL_LOCKED 0x0A // 5 0 PLL is locked 130 #define RADIOLIB_CC1101_GDOX_SERIAL_CLOCK 0x0B // 5 0 serial data clock 131 #define RADIOLIB_CC1101_GDOX_SERIAL_DATA_SYNC 0x0C // 5 0 serial data output in: synchronous mode 132 #define RADIOLIB_CC1101_GDOX_SERIAL_DATA_ASYNC 0x0D // 5 0 asynchronous mode 133 #define RADIOLIB_CC1101_GDOX_CARRIER_SENSE 0x0E // 5 0 RSSI above threshold 134 #define RADIOLIB_CC1101_GDOX_CRC_OK 0x0F // 5 0 CRC check passed 135 #define RADIOLIB_CC1101_GDOX_RX_HARD_DATA1 0x16 // 5 0 direct access to demodulated data 136 #define RADIOLIB_CC1101_GDOX_RX_HARD_DATA0 0x17 // 5 0 direct access to demodulated data 137 #define RADIOLIB_CC1101_GDOX_PA_PD 0x1B // 5 0 power amplifier circuit is powered down 138 #define RADIOLIB_CC1101_GDOX_LNA_PD 0x1C // 5 0 low-noise amplifier circuit is powered down 139 #define RADIOLIB_CC1101_GDOX_RX_SYMBOL_TICK 0x1D // 5 0 direct access to symbol tick of received data 140 #define RADIOLIB_CC1101_GDOX_WOR_EVNT0 0x24 // 5 0 wake-on-radio event 0 141 #define RADIOLIB_CC1101_GDOX_WOR_EVNT1 0x25 // 5 0 wake-on-radio event 1 142 #define RADIOLIB_CC1101_GDOX_CLK_256 0x26 // 5 0 256 Hz clock 143 #define RADIOLIB_CC1101_GDOX_CLK_32K 0x27 // 5 0 32 kHz clock 144 #define RADIOLIB_CC1101_GDOX_CHIP_RDYN 0x29 // 5 0 (default for GDO2) 145 #define RADIOLIB_CC1101_GDOX_XOSC_STABLE 0x2B // 5 0 146 #define RADIOLIB_CC1101_GDOX_HIGH_Z 0x2E // 5 0 high impedance state (default for GDO1) 147 #define RADIOLIB_CC1101_GDOX_HW_TO_0 0x2F // 5 0 148 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_1 0x30 // 5 0 crystal oscillator clock: f = f(XOSC)/1 149 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_1_5 0x31 // 5 0 f = f(XOSC)/1.5 150 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_2 0x32 // 5 0 f = f(XOSC)/2 151 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_3 0x33 // 5 0 f = f(XOSC)/3 152 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_4 0x34 // 5 0 f = f(XOSC)/4 153 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_6 0x35 // 5 0 f = f(XOSC)/6 154 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_8 0x36 // 5 0 f = f(XOSC)/8 155 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_12 0x37 // 5 0 f = f(XOSC)/12 156 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_16 0x38 // 5 0 f = f(XOSC)/16 157 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_24 0x39 // 5 0 f = f(XOSC)/24 158 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_32 0x3A // 5 0 f = f(XOSC)/32 159 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_48 0x3B // 5 0 f = f(XOSC)/48 160 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_64 0x3C // 5 0 f = f(XOSC)/64 161 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_96 0x3D // 5 0 f = f(XOSC)/96 162 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_128 0x3E // 5 0 f = f(XOSC)/128 163 #define RADIOLIB_CC1101_GDOX_CLOCK_XOSC_192 0x3F // 5 0 f = f(XOSC)/192 (default for GDO0) 164 165 // CC1101_REG_FIFOTHR 166 #define RADIOLIB_CC1101_ADC_RETENTION_OFF 0b00000000 // 6 6 do not retain ADC settings in sleep mode (default) 167 #define RADIOLIB_CC1101_ADC_RETENTION_ON 0b01000000 // 6 6 retain ADC settings in sleep mode 168 #define RADIOLIB_CC1101_RX_ATTEN_0_DB 0b00000000 // 5 4 Rx attenuation: 0 dB (default) 169 #define RADIOLIB_CC1101_RX_ATTEN_6_DB 0b00010000 // 5 4 6 dB 170 #define RADIOLIB_CC1101_RX_ATTEN_12_DB 0b00100000 // 5 4 12 dB 171 #define RADIOLIB_CC1101_RX_ATTEN_18_DB 0b00110000 // 5 4 18 dB 172 #define RADIOLIB_CC1101_FIFO_THR_TX_61_RX_4 0b00000000 // 3 0 TX fifo threshold: 61, RX fifo threshold: 4 173 174 // CC1101_REG_SYNC1 175 #define RADIOLIB_CC1101_SYNC_WORD_MSB 0xD3 // 7 0 sync word MSB 176 177 // CC1101_REG_SYNC0 178 #define RADIOLIB_CC1101_SYNC_WORD_LSB 0x91 // 7 0 sync word LSB 179 180 // CC1101_REG_PKTLEN 181 #define RADIOLIB_CC1101_PACKET_LENGTH 0xFF // 7 0 packet length in bytes 182 183 // CC1101_REG_PKTCTRL1 184 #define RADIOLIB_CC1101_PQT 0x00 // 7 5 preamble quality threshold 185 #define RADIOLIB_CC1101_CRC_AUTOFLUSH_OFF 0b00000000 // 3 3 automatic Rx FIFO flush on CRC check fail: disabled (default) 186 #define RADIOLIB_CC1101_CRC_AUTOFLUSH_ON 0b00001000 // 3 3 enabled 187 #define RADIOLIB_CC1101_APPEND_STATUS_OFF 0b00000000 // 2 2 append 2 status bytes to packet: disabled 188 #define RADIOLIB_CC1101_APPEND_STATUS_ON 0b00000100 // 2 2 enabled (default) 189 #define RADIOLIB_CC1101_ADR_CHK_NONE 0b00000000 // 1 0 address check: none (default) 190 #define RADIOLIB_CC1101_ADR_CHK_NO_BROADCAST 0b00000001 // 1 0 without broadcast 191 #define RADIOLIB_CC1101_ADR_CHK_SINGLE_BROADCAST 0b00000010 // 1 0 broadcast address 0x00 192 #define RADIOLIB_CC1101_ADR_CHK_DOUBLE_BROADCAST 0b00000011 // 1 0 broadcast addresses 0x00 and 0xFF 193 194 // CC1101_REG_PKTCTRL0 195 #define RADIOLIB_CC1101_WHITE_DATA_OFF 0b00000000 // 6 6 data whitening: disabled 196 #define RADIOLIB_CC1101_WHITE_DATA_ON 0b01000000 // 6 6 enabled (default) 197 #define RADIOLIB_CC1101_PKT_FORMAT_NORMAL 0b00000000 // 5 4 packet format: normal (FIFOs) 198 #define RADIOLIB_CC1101_PKT_FORMAT_SYNCHRONOUS 0b00010000 // 5 4 synchronous serial 199 #define RADIOLIB_CC1101_PKT_FORMAT_RANDOM 0b00100000 // 5 4 random transmissions 200 #define RADIOLIB_CC1101_PKT_FORMAT_ASYNCHRONOUS 0b00110000 // 5 4 asynchronous serial 201 #define RADIOLIB_CC1101_CRC_OFF 0b00000000 // 2 2 CRC disabled 202 #define RADIOLIB_CC1101_CRC_ON 0b00000100 // 2 2 CRC enabled (default) 203 #define RADIOLIB_CC1101_LENGTH_CONFIG_FIXED 0b00000000 // 1 0 packet length: fixed 204 #define RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE 0b00000001 // 1 0 variable (default) 205 #define RADIOLIB_CC1101_LENGTH_CONFIG_INFINITE 0b00000010 // 1 0 infinite 206 207 // CC1101_REG_ADDR 208 #define RADIOLIB_CC1101_DEVICE_ADDR 0x00 // 7 0 device address 209 210 // CC1101_REG_CHANNR 211 #define RADIOLIB_CC1101_CHAN 0x00 // 7 0 channel number 212 213 // CC1101_REG_FSCTRL1 214 #define RADIOLIB_CC1101_FREQ_IF 0x0F // 4 0 IF frequency setting; f_IF = (f(XOSC) / 2^10) * CC1101_FREQ_IF 215 216 // CC1101_REG_FSCTRL0 217 #define RADIOLIB_CC1101_FREQOFF 0x00 // 7 0 base frequency offset (2s-compliment) 218 219 // CC1101_REG_FREQ2 + REG_FREQ1 + REG_FREQ0 220 #define RADIOLIB_CC1101_FREQ_MSB 0x1E // 5 0 base frequency setting: f_carrier = (f(XOSC) / 2^16) * FREQ 221 #define RADIOLIB_CC1101_FREQ_MID 0xC4 // 7 0 where f(XOSC) = 26 MHz 222 #define RADIOLIB_CC1101_FREQ_LSB 0xEC // 7 0 FREQ = 3-byte value of FREQ registers 223 224 // CC1101_REG_MDMCFG4 225 #define RADIOLIB_CC1101_CHANBW_E 0b10000000 // 7 6 channel bandwidth: BW_channel = f(XOSC) / (8 * (4 + CHANBW_M)*2^CHANBW_E) [Hz] 226 #define RADIOLIB_CC1101_CHANBW_M 0b00000000 // 5 4 default value for 26 MHz crystal: 203 125 Hz 227 #define RADIOLIB_CC1101_DRATE_E 0x0C // 3 0 symbol rate: R_data = (((256 + DRATE_M) * 2^DRATE_E) / 2^28) * f(XOSC) [Baud] 228 229 // CC1101_REG_MDMCFG3 230 #define RADIOLIB_CC1101_DRATE_M 0x22 // 7 0 default value for 26 MHz crystal: 115 051 Baud 231 232 // CC1101_REG_MDMCFG2 233 #define RADIOLIB_CC1101_DEM_DCFILT_OFF 0b10000000 // 7 7 digital DC filter: disabled 234 #define RADIOLIB_CC1101_DEM_DCFILT_ON 0b00000000 // 7 7 enabled - only for data rates above 250 kBaud (default) 235 #define RADIOLIB_CC1101_MOD_FORMAT_2_FSK 0b00000000 // 6 4 modulation format: 2-FSK (default) 236 #define RADIOLIB_CC1101_MOD_FORMAT_GFSK 0b00010000 // 6 4 GFSK 237 #define RADIOLIB_CC1101_MOD_FORMAT_ASK_OOK 0b00110000 // 6 4 ASK/OOK 238 #define RADIOLIB_CC1101_MOD_FORMAT_4_FSK 0b01000000 // 6 4 4-FSK 239 #define RADIOLIB_CC1101_MOD_FORMAT_MFSK 0b01110000 // 6 4 MFSK - only for data rates above 26 kBaud 240 #define RADIOLIB_CC1101_MANCHESTER_EN_OFF 0b00000000 // 3 3 Manchester encoding: disabled (default) 241 #define RADIOLIB_CC1101_MANCHESTER_EN_ON 0b00001000 // 3 3 enabled 242 #define RADIOLIB_CC1101_SYNC_MODE_NONE 0b00000000 // 2 0 synchronization: no preamble/sync 243 #define RADIOLIB_CC1101_SYNC_MODE_15_16 0b00000001 // 2 0 15/16 sync word bits 244 #define RADIOLIB_CC1101_SYNC_MODE_16_16 0b00000010 // 2 0 16/16 sync word bits (default) 245 #define RADIOLIB_CC1101_SYNC_MODE_30_32 0b00000011 // 2 0 30/32 sync word bits 246 #define RADIOLIB_CC1101_SYNC_MODE_NONE_THR 0b00000100 // 2 0 no preamble sync, carrier sense above threshold 247 #define RADIOLIB_CC1101_SYNC_MODE_15_16_THR 0b00000101 // 2 0 15/16 sync word bits, carrier sense above threshold 248 #define RADIOLIB_CC1101_SYNC_MODE_16_16_THR 0b00000110 // 2 0 16/16 sync word bits, carrier sense above threshold 249 #define RADIOLIB_CC1101_SYNC_MODE_30_32_THR 0b00000111 // 2 0 30/32 sync word bits, carrier sense above threshold 250 251 // CC1101_REG_MDMCFG1 252 #define RADIOLIB_CC1101_FEC_OFF 0b00000000 // 7 7 forward error correction: disabled (default) 253 #define RADIOLIB_CC1101_FEC_ON 0b10000000 // 7 7 enabled - only for fixed packet length 254 #define RADIOLIB_CC1101_NUM_PREAMBLE_2 0b00000000 // 6 4 number of preamble bytes: 2 255 #define RADIOLIB_CC1101_NUM_PREAMBLE_3 0b00010000 // 6 4 3 256 #define RADIOLIB_CC1101_NUM_PREAMBLE_4 0b00100000 // 6 4 4 (default) 257 #define RADIOLIB_CC1101_NUM_PREAMBLE_6 0b00110000 // 6 4 6 258 #define RADIOLIB_CC1101_NUM_PREAMBLE_8 0b01000000 // 6 4 8 259 #define RADIOLIB_CC1101_NUM_PREAMBLE_12 0b01010000 // 6 4 12 260 #define RADIOLIB_CC1101_NUM_PREAMBLE_16 0b01100000 // 6 4 16 261 #define RADIOLIB_CC1101_NUM_PREAMBLE_24 0b01110000 // 6 4 24 262 #define RADIOLIB_CC1101_CHANSPC_E 0x02 // 1 0 channel spacing: df_channel = (f(XOSC) / 2^18) * (256 + CHANSPC_M) * 2^CHANSPC_E [Hz] 263 264 // CC1101_REG_MDMCFG0 265 #define RADIOLIB_CC1101_CHANSPC_M 0xF8 // 7 0 default value for 26 MHz crystal: 199 951 kHz 266 267 // CC1101_REG_DEVIATN 268 #define RADIOLIB_CC1101_DEVIATION_E 0b01000000 // 6 4 frequency deviation: f_dev = (f(XOSC) / 2^17) * (8 + DEVIATION_M) * 2^DEVIATION_E [Hz] 269 #define RADIOLIB_CC1101_DEVIATION_M 0b00000111 // 2 0 default value for 26 MHz crystal: +- 47 607 Hz 270 #define RADIOLIB_CC1101_MSK_PHASE_CHANGE_PERIOD 0x07 // 2 0 phase change symbol period fraction: 1 / (MSK_PHASE_CHANGE_PERIOD + 1) 271 272 // CC1101_REG_MCSM2 273 #define RADIOLIB_CC1101_RX_TIMEOUT_RSSI_OFF 0b00000000 // 4 4 Rx timeout based on RSSI value: disabled (default) 274 #define RADIOLIB_CC1101_RX_TIMEOUT_RSSI_ON 0b00010000 // 4 4 enabled 275 #define RADIOLIB_CC1101_RX_TIMEOUT_QUAL_OFF 0b00000000 // 3 3 check for sync word on Rx timeout 276 #define RADIOLIB_CC1101_RX_TIMEOUT_QUAL_ON 0b00001000 // 3 3 check for PQI set on Rx timeout 277 #define RADIOLIB_CC1101_RX_TIMEOUT_OFF 0b00000111 // 2 0 Rx timeout: disabled (default) 278 #define RADIOLIB_CC1101_RX_TIMEOUT_MAX 0b00000000 // 2 0 max value (actual value depends on WOR_RES, EVENT0 and f(XOSC)) 279 280 // CC1101_REG_MCSM1 281 #define RADIOLIB_CC1101_CCA_MODE_ALWAYS 0b00000000 // 5 4 clear channel indication: always 282 #define RADIOLIB_CC1101_CCA_MODE_RSSI_THR 0b00010000 // 5 4 RSSI below threshold 283 #define RADIOLIB_CC1101_CCA_MODE_RX_PKT 0b00100000 // 5 4 unless receiving packet 284 #define RADIOLIB_CC1101_CCA_MODE_RSSI_THR_RX_PKT 0b00110000 // 5 4 RSSI below threshold unless receiving packet (default) 285 #define RADIOLIB_CC1101_RXOFF_IDLE 0b00000000 // 3 2 next mode after packet reception: idle (default) 286 #define RADIOLIB_CC1101_RXOFF_FSTXON 0b00000100 // 3 2 FSTxOn 287 #define RADIOLIB_CC1101_RXOFF_TX 0b00001000 // 3 2 Tx 288 #define RADIOLIB_CC1101_RXOFF_RX 0b00001100 // 3 2 Rx 289 #define RADIOLIB_CC1101_TXOFF_IDLE 0b00000000 // 1 0 next mode after packet transmission: idle (default) 290 #define RADIOLIB_CC1101_TXOFF_FSTXON 0b00000001 // 1 0 FSTxOn 291 #define RADIOLIB_CC1101_TXOFF_TX 0b00000010 // 1 0 Tx 292 #define RADIOLIB_CC1101_TXOFF_RX 0b00000011 // 1 0 Rx 293 294 // CC1101_REG_MCSM0 295 #define RADIOLIB_CC1101_FS_AUTOCAL_NEVER 0b00000000 // 5 4 automatic calibration: never (default) 296 #define RADIOLIB_CC1101_FS_AUTOCAL_IDLE_TO_RXTX 0b00010000 // 5 4 every transition from idle to Rx/Tx 297 #define RADIOLIB_CC1101_FS_AUTOCAL_RXTX_TO_IDLE 0b00100000 // 5 4 every transition from Rx/Tx to idle 298 #define RADIOLIB_CC1101_FS_AUTOCAL_RXTX_TO_IDLE_4TH 0b00110000 // 5 4 every 4th transition from Rx/Tx to idle 299 #define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_1 0b00000000 // 3 2 number of counter expirations before CHP_RDYN goes low: 1 (default) 300 #define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_16 0b00000100 // 3 2 16 301 #define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_64 0b00001000 // 3 2 64 302 #define RADIOLIB_CC1101_PO_TIMEOUT_COUNT_256 0b00001100 // 3 2 256 303 #define RADIOLIB_CC1101_PIN_CTRL_OFF 0b00000000 // 1 1 pin radio control: disabled (default) 304 #define RADIOLIB_CC1101_PIN_CTRL_ON 0b00000010 // 1 1 enabled 305 #define RADIOLIB_CC1101_XOSC_FORCE_OFF 0b00000000 // 0 0 do not force XOSC to remain on in sleep (default) 306 #define RADIOLIB_CC1101_XOSC_FORCE_ON 0b00000001 // 0 0 force XOSC to remain on in sleep 307 308 // CC1101_REG_FOCCFG 309 #define RADIOLIB_CC1101_FOC_BS_CS_GATE_OFF 0b00000000 // 5 5 do not freeze frequency compensation until CS goes high 310 #define RADIOLIB_CC1101_FOC_BS_CS_GATE_ON 0b00100000 // 5 5 freeze frequency compensation until CS goes high (default) 311 #define RADIOLIB_CC1101_FOC_PRE_K 0b00000000 // 4 3 frequency compensation loop gain before sync word: K 312 #define RADIOLIB_CC1101_FOC_PRE_2K 0b00001000 // 4 3 2K 313 #define RADIOLIB_CC1101_FOC_PRE_3K 0b00010000 // 4 3 3K (default) 314 #define RADIOLIB_CC1101_FOC_PRE_4K 0b00011000 // 4 3 4K 315 #define RADIOLIB_CC1101_FOC_POST_K 0b00000000 // 2 2 frequency compensation loop gain after sync word: same as FOC_PRE 316 #define RADIOLIB_CC1101_FOC_POST_K_2 0b00000100 // 2 2 K/2 (default) 317 #define RADIOLIB_CC1101_FOC_LIMIT_NO_COMPENSATION 0b00000000 // 1 0 frequency compensation saturation point: no compensation - required for ASK/OOK 318 #define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_8 0b00000001 // 1 0 +- BW_chan/8 319 #define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_4 0b00000010 // 1 0 +- BW_chan/4 (default) 320 #define RADIOLIB_CC1101_FOC_LIMIT_BW_CHAN_2 0b00000011 // 1 0 +- BW_chan/2 321 322 // CC1101_REG_BSCFG 323 #define RADIOLIB_CC1101_BS_PRE_KI 0b00000000 // 7 6 clock recovery integral gain before sync word: Ki 324 #define RADIOLIB_CC1101_BS_PRE_2KI 0b01000000 // 7 6 2Ki (default) 325 #define RADIOLIB_CC1101_BS_PRE_3KI 0b10000000 // 7 6 3Ki 326 #define RADIOLIB_CC1101_BS_PRE_4KI 0b11000000 // 7 6 4Ki 327 #define RADIOLIB_CC1101_BS_PRE_KP 0b00000000 // 5 4 clock recovery proportional gain before sync word: Kp 328 #define RADIOLIB_CC1101_BS_PRE_2KP 0b00010000 // 5 4 2Kp 329 #define RADIOLIB_CC1101_BS_PRE_3KP 0b00100000 // 5 4 3Kp (default) 330 #define RADIOLIB_CC1101_BS_PRE_4KP 0b00110000 // 5 4 4Kp 331 #define RADIOLIB_CC1101_BS_POST_KI 0b00000000 // 3 3 clock recovery integral gain after sync word: same as BS_PRE 332 #define RADIOLIB_CC1101_BS_POST_KI_2 0b00001000 // 3 3 Ki/2 (default) 333 #define RADIOLIB_CC1101_BS_POST_KP 0b00000000 // 2 2 clock recovery proportional gain after sync word: same as BS_PRE 334 #define RADIOLIB_CC1101_BS_POST_KP_1 0b00000100 // 2 2 Kp (default) 335 #define RADIOLIB_CC1101_BS_LIMIT_NO_COMPENSATION 0b00000000 // 1 0 data rate compensation saturation point: no compensation 336 #define RADIOLIB_CC1101_BS_LIMIT_3_125 0b00000001 // 1 0 +- 3.125 % 337 #define RADIOLIB_CC1101_BS_LIMIT_6_25 0b00000010 // 1 0 +- 6.25 % 338 #define RADIOLIB_CC1101_BS_LIMIT_12_5 0b00000011 // 1 0 +- 12.5 % 339 340 // CC1101_REG_AGCCTRL2 341 #define RADIOLIB_CC1101_MAX_DVGA_GAIN_0 0b00000000 // 7 6 reduce maximum available DVGA gain: no reduction (default) 342 #define RADIOLIB_CC1101_MAX_DVGA_GAIN_1 0b01000000 // 7 6 disable top gain setting 343 #define RADIOLIB_CC1101_MAX_DVGA_GAIN_2 0b10000000 // 7 6 disable top two gain setting 344 #define RADIOLIB_CC1101_MAX_DVGA_GAIN_3 0b11000000 // 7 6 disable top three gain setting 345 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_0_DB 0b00000000 // 5 3 reduce maximum LNA gain by: 0 dB (default) 346 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_2_6_DB 0b00001000 // 5 3 2.6 dB 347 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_6_1_DB 0b00010000 // 5 3 6.1 dB 348 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_7_4_DB 0b00011000 // 5 3 7.4 dB 349 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_9_2_DB 0b00100000 // 5 3 9.2 dB 350 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_11_5_DB 0b00101000 // 5 3 11.5 dB 351 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_14_6_DB 0b00110000 // 5 3 14.6 dB 352 #define RADIOLIB_CC1101_LNA_GAIN_REDUCE_17_1_DB 0b00111000 // 5 3 17.1 dB 353 #define RADIOLIB_CC1101_MAGN_TARGET_24_DB 0b00000000 // 2 0 average amplitude target for filter: 24 dB 354 #define RADIOLIB_CC1101_MAGN_TARGET_27_DB 0b00000001 // 2 0 27 dB 355 #define RADIOLIB_CC1101_MAGN_TARGET_30_DB 0b00000010 // 2 0 30 dB 356 #define RADIOLIB_CC1101_MAGN_TARGET_33_DB 0b00000011 // 2 0 33 dB (default) 357 #define RADIOLIB_CC1101_MAGN_TARGET_36_DB 0b00000100 // 2 0 36 dB 358 #define RADIOLIB_CC1101_MAGN_TARGET_38_DB 0b00000101 // 2 0 38 dB 359 #define RADIOLIB_CC1101_MAGN_TARGET_40_DB 0b00000110 // 2 0 40 dB 360 #define RADIOLIB_CC1101_MAGN_TARGET_42_DB 0b00000111 // 2 0 42 dB 361 362 // CC1101_REG_AGCCTRL1 363 #define RADIOLIB_CC1101_AGC_LNA_PRIORITY_LNA2 0b00000000 // 6 6 LNA priority setting: LNA2 first 364 #define RADIOLIB_CC1101_AGC_LNA_PRIORITY_LNA 0b01000000 // 6 6 LNA first (default) 365 #define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_OFF 0b00000000 // 5 4 RSSI relative change to assert carrier sense: disabled (default) 366 #define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_6_DB 0b00010000 // 5 4 6 dB 367 #define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_10_DB 0b00100000 // 5 4 10 dB 368 #define RADIOLIB_CC1101_CARRIER_SENSE_REL_THR_14_DB 0b00110000 // 5 4 14 dB 369 #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] 370 371 // CC1101_REG_AGCCTRL0 372 #define RADIOLIB_CC1101_HYST_LEVEL_NONE 0b00000000 // 7 6 AGC hysteresis level: none 373 #define RADIOLIB_CC1101_HYST_LEVEL_LOW 0b01000000 // 7 6 low 374 #define RADIOLIB_CC1101_HYST_LEVEL_MEDIUM 0b10000000 // 7 6 medium (default) 375 #define RADIOLIB_CC1101_HYST_LEVEL_HIGH 0b11000000 // 7 6 high 376 #define RADIOLIB_CC1101_WAIT_TIME_8_SAMPLES 0b00000000 // 5 4 AGC wait time: 8 samples 377 #define RADIOLIB_CC1101_WAIT_TIME_16_SAMPLES 0b00010000 // 5 4 16 samples (default) 378 #define RADIOLIB_CC1101_WAIT_TIME_24_SAMPLES 0b00100000 // 5 4 24 samples 379 #define RADIOLIB_CC1101_WAIT_TIME_32_SAMPLES 0b00110000 // 5 4 32 samples 380 #define RADIOLIB_CC1101_AGC_FREEZE_NEVER 0b00000000 // 3 2 freeze AGC gain: never (default) 381 #define RADIOLIB_CC1101_AGC_FREEZE_SYNC_WORD 0b00000100 // 3 2 when sync word is found 382 #define RADIOLIB_CC1101_AGC_FREEZE_MANUAL_A 0b00001000 // 3 2 manually freeze analog control 383 #define RADIOLIB_CC1101_AGC_FREEZE_MANUAL_AD 0b00001100 // 3 2 manually freeze analog and digital control 384 #define RADIOLIB_CC1101_FILTER_LENGTH_8 0b00000000 // 1 0 averaging length for channel filter: 8 samples 385 #define RADIOLIB_CC1101_FILTER_LENGTH_16 0b00000001 // 1 0 16 samples (default) 386 #define RADIOLIB_CC1101_FILTER_LENGTH_32 0b00000010 // 1 0 32 samples 387 #define RADIOLIB_CC1101_FILTER_LENGTH_64 0b00000011 // 1 0 64 samples 388 #define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_4_DB 0b00000000 // 1 0 ASK/OOK decision boundary: 4 dB 389 #define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_8_DB 0b00000001 // 1 0 8 dB (default) 390 #define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_12_DB 0b00000010 // 1 0 12 dB 391 #define RADIOLIB_CC1101_ASK_OOK_BOUNDARY_16_DB 0b00000011 // 1 0 16 dB 392 393 // CC1101_REG_WOREVT1 + REG_WOREVT0 394 #define RADIOLIB_CC1101_EVENT0_TIMEOUT_MSB 0x87 // 7 0 EVENT0 timeout: t_event0 = (750 / f(XOSC)) * EVENT0_TIMEOUT * 2^(5 * WOR_RES) [s] 395 #define RADIOLIB_CC1101_EVENT0_TIMEOUT_LSB 0x6B // 7 0 default value for 26 MHz crystal: 1.0 s 396 397 // CC1101_REG_WORCTRL 398 #define RADIOLIB_CC1101_RC_POWER_UP 0b00000000 // 7 7 power up RC oscillator 399 #define RADIOLIB_CC1101_RC_POWER_DOWN 0b10000000 // 7 7 power down RC oscillator 400 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_4 0b00000000 // 6 4 EVENT1 timeout: 4 RC periods 401 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_6 0b00010000 // 6 4 6 RC periods 402 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_8 0b00100000 // 6 4 8 RC periods 403 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_12 0b00110000 // 6 4 12 RC periods 404 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_16 0b01000000 // 6 4 16 RC periods 405 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_24 0b01010000 // 6 4 24 RC periods 406 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_32 0b01100000 // 6 4 32 RC periods 407 #define RADIOLIB_CC1101_EVENT1_TIMEOUT_48 0b01110000 // 6 4 48 RC periods (default) 408 #define RADIOLIB_CC1101_RC_CAL_OFF 0b00000000 // 3 3 disable RC oscillator calibration 409 #define RADIOLIB_CC1101_RC_CAL_ON 0b00001000 // 3 3 enable RC oscillator calibration (default) 410 #define RADIOLIB_CC1101_WOR_RES_1 0b00000000 // 1 0 EVENT0 resolution: 1 period (default) 411 #define RADIOLIB_CC1101_WOR_RES_2_5 0b00000001 // 1 0 2^5 periods 412 #define RADIOLIB_CC1101_WOR_RES_2_10 0b00000010 // 1 0 2^10 periods 413 #define RADIOLIB_CC1101_WOR_RES_2_15 0b00000011 // 1 0 2^15 periods 414 415 // CC1101_REG_FREND1 416 #define RADIOLIB_CC1101_LNA_CURRENT 0x01 // 7 6 front-end LNA PTAT current output adjustment 417 #define RADIOLIB_CC1101_LNA2MIX_CURRENT 0x01 // 5 4 front-end PTAT output adjustment 418 #define RADIOLIB_CC1101_LODIV_BUF_CURRENT_RX 0x01 // 3 2 Rx LO buffer current adjustment 419 #define RADIOLIB_CC1101_MIX_CURRENT 0x02 // 1 0 mixer current adjustment 420 421 // CC1101_REG_FREND0 422 #define RADIOLIB_CC1101_LODIV_BUF_CURRENT_TX 0x01 // 5 4 Tx LO buffer current adjustment 423 #define RADIOLIB_CC1101_PA_POWER 0x00 // 2 0 set power amplifier power according to PATABLE 424 425 // CC1101_REG_FSCAL3 426 #define RADIOLIB_CC1101_CHP_CURR_CAL_OFF 0b00000000 // 5 4 disable charge pump calibration 427 #define RADIOLIB_CC1101_CHP_CURR_CAL_ON 0b00100000 // 5 4 enable charge pump calibration (default) 428 #define RADIOLIB_CC1101_FSCAL3 0x09 // 3 0 charge pump output current: I_out = I_0 * 2^(FSCAL3/4) [A] 429 430 // CC1101_REG_FSCAL2 431 #define RADIOLIB_CC1101_VCO_CORE_LOW 0b00000000 // 5 5 VCO: low (default) 432 #define RADIOLIB_CC1101_VCO_CORE_HIGH 0b00100000 // 5 5 high 433 #define RADIOLIB_CC1101_FSCAL2 0x0A // 4 0 VCO current result/override 434 435 // CC1101_REG_FSCAL1 436 #define RADIOLIB_CC1101_FSCAL1 0x20 // 5 0 capacitor array setting for coarse VCO tuning 437 438 // CC1101_REG_FSCAL0 439 #define RADIOLIB_CC1101_FSCAL0 0x0D // 6 0 frequency synthesizer calibration setting 440 441 // CC1101_REG_RCCTRL1 442 #define RADIOLIB_CC1101_RCCTRL1 0x41 // 6 0 RC oscillator configuration 443 444 // CC1101_REG_RCCTRL0 445 #define RADIOLIB_CC1101_RCCTRL0 0x00 // 6 0 RC oscillator configuration 446 447 // CC1101_REG_PTEST 448 #define RADIOLIB_CC1101_TEMP_SENS_IDLE_OFF 0x7F // 7 0 temperature sensor will not be available in idle mode (default) 449 #define RADIOLIB_CC1101_TEMP_SENS_IDLE_ON 0xBF // 7 0 temperature sensor will be available in idle mode 450 451 // CC1101_REG_TEST0 452 #define RADIOLIB_CC1101_VCO_SEL_CAL_OFF 0b00000000 // 1 1 disable VCO selection calibration stage 453 #define RADIOLIB_CC1101_VCO_SEL_CAL_ON 0b00000010 // 1 1 enable VCO selection calibration stage 454 455 // CC1101_REG_PARTNUM 456 #define RADIOLIB_CC1101_PARTNUM 0x00 457 458 // CC1101_REG_VERSION 459 #define RADIOLIB_CC1101_VERSION_CURRENT 0x14 460 #define RADIOLIB_CC1101_VERSION_LEGACY 0x04 461 #define RADIOLIB_CC1101_VERSION_CLONE 0x17 462 463 // CC1101_REG_MARCSTATE 464 #define RADIOLIB_CC1101_MARC_STATE_SLEEP 0x00 // 4 0 main radio control state: sleep 465 #define RADIOLIB_CC1101_MARC_STATE_IDLE 0x01 // 4 0 idle 466 #define RADIOLIB_CC1101_MARC_STATE_XOFF 0x02 // 4 0 XOFF 467 #define RADIOLIB_CC1101_MARC_STATE_VCOON_MC 0x03 // 4 0 VCOON_MC 468 #define RADIOLIB_CC1101_MARC_STATE_REGON_MC 0x04 // 4 0 REGON_MC 469 #define RADIOLIB_CC1101_MARC_STATE_MANCAL 0x05 // 4 0 MANCAL 470 #define RADIOLIB_CC1101_MARC_STATE_VCOON 0x06 // 4 0 VCOON 471 #define RADIOLIB_CC1101_MARC_STATE_REGON 0x07 // 4 0 REGON 472 #define RADIOLIB_CC1101_MARC_STATE_STARTCAL 0x08 // 4 0 STARTCAL 473 #define RADIOLIB_CC1101_MARC_STATE_BWBOOST 0x09 // 4 0 BWBOOST 474 #define RADIOLIB_CC1101_MARC_STATE_FS_LOCK 0x0A // 4 0 FS_LOCK 475 #define RADIOLIB_CC1101_MARC_STATE_IFADCON 0x0B // 4 0 IFADCON 476 #define RADIOLIB_CC1101_MARC_STATE_ENDCAL 0x0C // 4 0 ENDCAL 477 #define RADIOLIB_CC1101_MARC_STATE_RX 0x0D // 4 0 RX 478 #define RADIOLIB_CC1101_MARC_STATE_RX_END 0x0E // 4 0 RX_END 479 #define RADIOLIB_CC1101_MARC_STATE_RX_RST 0x0F // 4 0 RX_RST 480 #define RADIOLIB_CC1101_MARC_STATE_TXRX_SWITCH 0x10 // 4 0 TXRX_SWITCH 481 #define RADIOLIB_CC1101_MARC_STATE_RXFIFO_OVERFLOW 0x11 // 4 0 RXFIFO_OVERFLOW 482 #define RADIOLIB_CC1101_MARC_STATE_FSTXON 0x12 // 4 0 FSTXON 483 #define RADIOLIB_CC1101_MARC_STATE_TX 0x13 // 4 0 TX 484 #define RADIOLIB_CC1101_MARC_STATE_TX_END 0x14 // 4 0 TX_END 485 #define RADIOLIB_CC1101_MARC_STATE_RXTX_SWITCH 0x15 // 4 0 RXTX_SWITCH 486 #define RADIOLIB_CC1101_MARC_STATE_TXFIFO_UNDERFLOW 0x16 // 4 0 TXFIFO_UNDERFLOW 487 488 // CC1101_REG_WORTIME1 + REG_WORTIME0 489 #define RADIOLIB_CC1101_WORTIME_MSB 0x00 // 7 0 WOR timer value 490 #define RADIOLIB_CC1101_WORTIME_LSB 0x00 // 7 0 491 492 // CC1101_REG_PKTSTATUS 493 #define RADIOLIB_CC1101_CRC_OK 0b10000000 // 7 7 CRC check passed 494 #define RADIOLIB_CC1101_CRC_ERROR 0b00000000 // 7 7 CRC check failed 495 #define RADIOLIB_CC1101_CS 0b01000000 // 6 6 carrier sense 496 #define RADIOLIB_CC1101_PQT_REACHED 0b00100000 // 5 5 preamble quality reached 497 #define RADIOLIB_CC1101_CCA 0b00010000 // 4 4 channel clear 498 #define RADIOLIB_CC1101_SFD 0b00001000 // 3 3 start of frame delimiter - sync word received 499 #define RADIOLIB_CC1101_GDO2_ACTIVE 0b00000100 // 2 2 GDO2 is active/asserted 500 #define RADIOLIB_CC1101_GDO0_ACTIVE 0b00000001 // 0 0 GDO0 is active/asserted 501 502 /*! 503 \class CC1101 504 505 \brief Control class for %CC1101 module. 506 */ 507 class CC1101: public PhysicalLayer { 508 public: 509 // introduce PhysicalLayer overloads 510 using PhysicalLayer::transmit; 511 using PhysicalLayer::receive; 512 using PhysicalLayer::startTransmit; 513 using PhysicalLayer::readData; 514 515 /*! 516 \brief Default constructor. 517 518 \param mod Instance of Module that will be used to communicate with the radio. 519 */ 520 CC1101(Module* module); 521 522 Module* getMod(); 523 524 // basic methods 525 526 /*! 527 \brief Initialization method. 528 529 \param freq Carrier frequency in MHz. Defaults to 434.0 MHz. 530 531 \param br Bit rate to be used in kbps. Defaults to 4.8 kbps. 532 533 \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 5.0 kHz. 534 535 \param rxBw Receiver bandwidth in kHz. Defaults to 135.0 kHz. 536 537 \param power Output power in dBm. Defaults to 10 dBm. 538 539 \param preambleLength Preamble Length in bits. Defaults to 16 bits. 540 541 \returns \ref status_codes 542 */ 543 int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 135.0, int8_t power = 10, uint8_t preambleLength = 16); 544 545 /*! 546 \brief Blocking binary transmit method. 547 Overloads for string-based transmissions are implemented in PhysicalLayer. 548 549 \param data Binary data to be sent. 550 551 \param len Number of bytes to send. 552 553 \param addr Address to send the data to. Will only be added if address filtering was enabled. 554 555 \returns \ref status_codes 556 */ 557 int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0) override; 558 559 /*! 560 \brief Blocking binary receive method. 561 Overloads for string-based transmissions are implemented in PhysicalLayer. 562 563 \param data Binary data to be sent. 564 565 \param len Number of bytes to send. 566 567 \returns \ref status_codes 568 */ 569 int16_t receive(uint8_t* data, size_t len) override; 570 571 /*! 572 \brief Sets the module to standby mode. 573 574 \returns \ref status_codes 575 */ 576 int16_t standby() override; 577 578 /*! 579 \brief Starts direct mode transmission. 580 581 \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. 582 583 \returns \ref status_codes 584 */ 585 int16_t transmitDirect(uint32_t frf = 0) override; 586 587 /*! 588 \brief Starts direct mode reception. 589 590 \returns \ref status_codes 591 */ 592 int16_t receiveDirect() override; 593 594 /*! 595 \brief Starts asynchronous direct mode transmission. 596 597 \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. 598 599 \returns \ref status_codes 600 */ 601 int16_t transmitDirectAsync(uint32_t frf = 0); 602 603 /*! 604 \brief Starts asynchronous direct mode reception. 605 606 \returns \ref status_codes 607 */ 608 int16_t receiveDirectAsync(); 609 610 /*! 611 \brief Stops direct mode. It is required to call this method to switch from direct transmissions to packet-based transmissions. 612 */ 613 int16_t packetMode(); 614 615 // interrupt methods 616 617 /*! 618 \brief Sets interrupt service routine to call when GDO0 activates. 619 620 \param func ISR to call. 621 622 \param dir Signal change direction. Defaults to RISING. 623 */ 624 void setGdo0Action(void (*func)(void), RADIOLIB_INTERRUPT_STATUS dir = RISING); 625 626 /*! 627 \brief Clears interrupt service routine to call when GDO0 activates. 628 */ 629 void clearGdo0Action(); 630 631 /*! 632 \brief Sets interrupt service routine to call when GDO2 activates. 633 634 \param func ISR to call. 635 636 \param dir Signal change direction. Defaults to FALLING. 637 */ 638 void setGdo2Action(void (*func)(void), RADIOLIB_INTERRUPT_STATUS dir = FALLING); 639 640 /*! 641 \brief Clears interrupt service routine to call when GDO0 activates. 642 */ 643 void clearGdo2Action(); 644 645 /*! 646 \brief Interrupt-driven binary transmit method. 647 Overloads for string-based transmissions are implemented in PhysicalLayer. 648 649 \param data Binary data to be sent. 650 651 \param len Number of bytes to send. 652 653 \param addr Address to send the data to. Will only be added if address filtering was enabled. 654 655 \returns \ref status_codes 656 */ 657 int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; 658 659 /*! 660 \brief Interrupt-driven receive method. GDO0 will be activated when full packet is received. 661 662 \returns \ref status_codes 663 */ 664 int16_t startReceive(); 665 666 /*! 667 \brief Reads data received after calling startReceive method. 668 669 \param data Pointer to array to save the received binary data. 670 671 \param len Number of bytes that will be read. When set to 0, the packet length will be retreived automatically. 672 When more bytes than received are requested, only the number of bytes requested will be returned. 673 674 \returns \ref status_codes 675 */ 676 int16_t readData(uint8_t* data, size_t len) override; 677 678 // configuration methods 679 680 /*! 681 \brief Sets carrier frequency. Allowed values are in bands 300.0 to 348.0 MHz, 387.0 to 464.0 MHz and 779.0 to 928.0 MHz. 682 683 \param freq Carrier frequency to be set in MHz. 684 685 \returns \ref status_codes 686 */ 687 int16_t setFrequency(float freq); 688 689 /*! 690 \brief Sets bit rate. Allowed values range from 0.025 to 600.0 kbps. 691 692 \param br Bit rate to be set in kbps. 693 694 \returns \ref status_codes 695 */ 696 int16_t setBitRate(float br); 697 698 /*! 699 \brief Sets receiver bandwidth. Allowed values range from 58.0 to 812.0 kHz. 700 701 \param rxBw Receiver bandwidth to be set in kHz. 702 703 \returns \ref status_codes 704 */ 705 int16_t setRxBandwidth(float rxBw); 706 707 /*! 708 \brief Sets frequency deviation. Allowed values range from 1.587 to 380.8 kHz. 709 710 \param freqDev Frequency deviation to be set in kHz. 711 712 \returns \ref status_codes 713 */ 714 int16_t setFrequencyDeviation(float freqDev) override; 715 716 /*! 717 \brief Sets output power. Allowed values are -30, -20, -15, -10, 0, 5, 7 or 10 dBm. 718 719 \param power Output power to be set in dBm. 720 721 \returns \ref status_codes 722 */ 723 int16_t setOutputPower(int8_t power); 724 725 /*! 726 \brief Sets 16-bit sync word as a two byte value. 727 728 \param syncH MSB of the sync word. 729 730 \param syncL LSB of the sync word. 731 732 \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. 733 734 \param requireCarrierSense Require carrier sense above threshold in addition to sync word. 735 736 \returns \ref status_codes 737 */ 738 int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0, bool requireCarrierSense = false); 739 740 /*! 741 \brief Sets 1 or 2 bytes of sync word. 742 743 \param syncWord Pointer to the array of sync word bytes. 744 745 \param len Sync word length in bytes. 746 747 \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. 748 749 \param requireCarrierSense Require carrier sense above threshold in addition to sync word. 750 751 \returns \ref status_codes 752 */ 753 int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0, bool requireCarrierSense = false); 754 755 /*! 756 \brief Sets preamble length. 757 758 \param preambleLength Preamble length to be set (in bits), allowed values: 16, 24, 32, 48, 64, 96, 128 and 192. 759 760 \returns \ref status_codes 761 */ 762 int16_t setPreambleLength(uint8_t preambleLength); 763 764 /*! 765 \brief Sets node and broadcast addresses. Calling this method will also enable address filtering. 766 767 \param nodeAddr Node address to be set. 768 769 \param numBroadcastAddrs Number of broadcast addresses to be used. Can be set to 0 (no broadcast), 1 (broadcast at 0x00) or 2 (broadcast at 0x00 and 0xFF). 770 771 \returns \ref status_codes 772 */ 773 int16_t setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs = 0); 774 775 /*! 776 \brief Disables address filtering. Calling this method will also erase previously set addresses. 777 778 \returns \ref status_codes 779 */ 780 int16_t disableAddressFiltering(); 781 782 /*! 783 \brief Enables/disables OOK modulation instead of FSK. 784 785 \param enableOOK Enable (true) or disable (false) OOK. 786 787 \returns \ref status_codes 788 */ 789 int16_t setOOK(bool enableOOK); 790 791 /*! 792 \brief Gets RSSI (Recorded Signal Strength Indicator) of the last received packet. 793 794 or in asynchronous direct mode the current RSSI level 795 796 \returns RSSI in dBm. 797 */ 798 float getRSSI(); 799 800 /*! 801 \brief Gets LQI (Link Quality Indicator) of the last received packet. 802 803 \returns Last packet LQI (lower is better). 804 */ 805 uint8_t getLQI() const; 806 807 /*! 808 \brief Query modem for the packet length of received payload. 809 810 \param update Update received packet length. Will return cached value when set to false. 811 812 \returns Length of last received packet in bytes. 813 */ 814 size_t getPacketLength(bool update = true) override; 815 816 /*! 817 \brief Set modem in fixed packet length mode. 818 819 \param len Packet length. 820 821 \returns \ref status_codes 822 */ 823 int16_t fixedPacketLengthMode(uint8_t len = RADIOLIB_CC1101_MAX_PACKET_LENGTH); 824 825 /*! 826 \brief Set modem in variable packet length mode. 827 828 \param len Maximum packet length. 829 830 \returns \ref status_codes 831 */ 832 int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_CC1101_MAX_PACKET_LENGTH); 833 834 /*! 835 \brief Enable sync word filtering and generation. 836 837 \param numBits Sync word length in bits. 838 839 \param requireCarrierSense Require carrier sense above threshold in addition to sync word. 840 841 \returns \ref status_codes 842 */ 843 int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0, bool requireCarrierSense = false); 844 845 /*! 846 \brief Disable preamble and sync word filtering and generation. 847 848 \param requireCarrierSense Require carrier sense above threshold. 849 850 \returns \ref status_codes 851 */ 852 int16_t disableSyncWordFiltering(bool requireCarrierSense = false); 853 854 /*! 855 \brief Enable CRC filtering and generation. 856 857 \param crcOn Set or unset CRC generation and filtering. 858 859 \returns \ref status_codes 860 */ 861 int16_t setCrcFiltering(bool crcOn = true); 862 863 /*! 864 \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). 865 866 \param promiscuous Set or unset promiscuous mode. 867 868 \returns \ref status_codes 869 */ 870 int16_t setPromiscuousMode(bool promiscuous = true); 871 872 /*! 873 \brief Get whether the modem is in promiscuous mode: no packet filtering (e.g., no preamble, sync word, address, CRC). 874 875 \returns Whether the modem is in promiscuous mode 876 */ 877 bool getPromiscuousMode(); 878 879 /*! 880 \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. 881 Allowed value is RADIOLIB_SHAPING_0_5. Set to RADIOLIB_SHAPING_NONE to disable data shaping. 882 883 \param sh Gaussian shaping bandwidth-time product that will be used for data shaping. 884 885 \returns \ref status_codes 886 */ 887 int16_t setDataShaping(uint8_t sh) override; 888 889 /*! 890 \brief Sets transmission encoding. Allowed values are RADIOLIB_ENCODING_NRZ, RADIOLIB_ENCODING_MANCHESTER, and RADIOLIB_ENCODING_WHITENING. 891 Note that encoding on CC1101 is applied to the entire stream including preamble, sync word, and CRC. 892 893 \param encoding Encoding to be used. 894 895 \returns \ref status_codes 896 */ 897 int16_t setEncoding(uint8_t encoding) override; 898 899 /*! 900 \brief Some modules contain external RF switch controlled by two pins. This function gives RadioLib control over those two pins to automatically switch Rx and Tx state. 901 When using automatic RF switch control, DO NOT change the pin mode of rxEn or txEn from Arduino sketch! 902 903 \param rxEn RX enable pin. 904 905 \param txEn TX enable pin. 906 */ 907 void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn); 908 909 /*! 910 \brief Get one truly random byte from RSSI noise. 911 912 \returns TRNG byte. 913 */ 914 uint8_t randomByte(); 915 916 /*! 917 \brief Read version SPI register. Should return CC1101_VERSION_LEGACY (0x04) or CC1101_VERSION_CURRENT (0x14) if CC1101 is connected and working. 918 919 \returns Version register contents or \ref status_codes 920 */ 921 int16_t getChipVersion(); 922 923 #if !defined(RADIOLIB_EXCLUDE_DIRECT_RECEIVE) 924 /*! 925 \brief Set interrupt service routine function to call when data bit is receveid in direct mode. 926 927 \param func Pointer to interrupt service routine. 928 */ 929 void setDirectAction(void (*func)(void)); 930 931 /*! 932 \brief Function to read and process data bit in direct reception mode. 933 934 \param pin Pin on which to read. 935 */ 936 void readBit(RADIOLIB_PIN_TYPE pin); 937 #endif 938 939 /*! 940 \brief Configure DIO pin mapping to get a given signal on a DIO pin (if available). 941 942 \param pin Pin number onto which a signal is to be placed. 943 944 \param value The value that indicates which function to place on that pin. See chip datasheet for details. 945 946 \returns \ref status_codes 947 */ 948 int16_t setDIOMapping(RADIOLIB_PIN_TYPE pin, uint8_t value); 949 950 #if !defined(RADIOLIB_GODMODE) && !defined(RADIOLIB_LOW_LEVEL) 951 protected: 952 #endif 953 Module* _mod; 954 955 // SPI read overrides to set bit for burst write and status registers access 956 int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0); 957 int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2); 958 void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes); 959 uint8_t SPIreadRegister(uint8_t reg); 960 void SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, size_t len); 961 void SPIwriteRegister(uint8_t reg, uint8_t data); 962 963 void SPIsendCommand(uint8_t cmd); 964 965 #if !defined(RADIOLIB_GODMODE) 966 protected: 967 #endif 968 969 float _freq = 0; 970 float _br = 0; 971 uint8_t _rawRSSI = 0; 972 uint8_t _rawLQI = 0; 973 uint8_t _modulation = RADIOLIB_CC1101_MOD_FORMAT_2_FSK; 974 975 size_t _packetLength = 0; 976 bool _packetLengthQueried = false; 977 uint8_t _packetLengthConfig = RADIOLIB_CC1101_LENGTH_CONFIG_VARIABLE; 978 979 bool _promiscuous = false; 980 bool _crcOn = true; 981 bool _directMode = true; 982 983 uint8_t _syncWordLength = 2; 984 int8_t _power = 0; 985 986 int16_t config(); 987 int16_t transmitDirect(bool sync, uint32_t frf); 988 int16_t receiveDirect(bool sync); 989 int16_t directMode(bool sync); 990 static void getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant); 991 int16_t setPacketMode(uint8_t mode, uint16_t len); 992 }; 993 994 #endif