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