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

SX1278.h (15724B)

      1 #if !defined(_RADIOLIB_SX1278_H)
      2 #define _RADIOLIB_SX1278_H
      3 
      4 #include "../../TypeDef.h"
      5 
      6 #if !defined(RADIOLIB_EXCLUDE_SX127X)
      7 
      8 #include "../../Module.h"
      9 #include "SX127x.h"
     10 
     11 // SX1278 specific register map
     12 #define RADIOLIB_SX1278_REG_MODEM_CONFIG_3                     0x26
     13 #define RADIOLIB_SX1278_REG_PLL_HOP                            0x44
     14 #define RADIOLIB_SX1278_REG_TCXO                               0x4B
     15 #define RADIOLIB_SX1278_REG_PA_DAC                             0x4D
     16 #define RADIOLIB_SX1278_REG_FORMER_TEMP                        0x5B
     17 #define RADIOLIB_SX1278_REG_REG_BIT_RATE_FRAC                  0x5D
     18 #define RADIOLIB_SX1278_REG_AGC_REF                            0x61
     19 #define RADIOLIB_SX1278_REG_AGC_THRESH_1                       0x62
     20 #define RADIOLIB_SX1278_REG_AGC_THRESH_2                       0x63
     21 #define RADIOLIB_SX1278_REG_AGC_THRESH_3                       0x64
     22 #define RADIOLIB_SX1278_REG_PLL                                0x70
     23 
     24 // SX1278 LoRa modem settings
     25 // RADIOLIB_SX1278_REG_OP_MODE                                                  MSB   LSB   DESCRIPTION
     26 #define RADIOLIB_SX1278_HIGH_FREQ                              0b00000000  //  3     3     access HF test registers
     27 #define RADIOLIB_SX1278_LOW_FREQ                               0b00001000  //  3     3     access LF test registers
     28 
     29 // RADIOLIB_SX1278_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB
     30 #define RADIOLIB_SX1278_FRF_MSB                                0x6C        //  7     0     carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19
     31 #define RADIOLIB_SX1278_FRF_MID                                0x80        //  7     0         where F(XOSC) = 32 MHz
     32 #define RADIOLIB_SX1278_FRF_LSB                                0x00        //  7     0               FRF = 3 byte value of FRF registers
     33 
     34 // RADIOLIB_SX1278_REG_PA_CONFIG
     35 #define RADIOLIB_SX1278_MAX_POWER                              0b01110000  //  6     4     max power: P_max = 10.8 + 0.6*MAX_POWER [dBm]; P_max(MAX_POWER = 0b111) = 15 dBm
     36 #define RADIOLIB_SX1278_LOW_POWER                              0b00100000  //  6     4
     37 
     38 // RADIOLIB_SX1278_REG_LNA
     39 #define RADIOLIB_SX1278_LNA_BOOST_LF_OFF                       0b00000000  //  4     3     default LNA current
     40 
     41 // SX127X_REG_MODEM_CONFIG_1
     42 #define RADIOLIB_SX1278_BW_7_80_KHZ                            0b00000000  //  7     4     bandwidth:  7.80 kHz
     43 #define RADIOLIB_SX1278_BW_10_40_KHZ                           0b00010000  //  7     4                 10.40 kHz
     44 #define RADIOLIB_SX1278_BW_15_60_KHZ                           0b00100000  //  7     4                 15.60 kHz
     45 #define RADIOLIB_SX1278_BW_20_80_KHZ                           0b00110000  //  7     4                 20.80 kHz
     46 #define RADIOLIB_SX1278_BW_31_25_KHZ                           0b01000000  //  7     4                 31.25 kHz
     47 #define RADIOLIB_SX1278_BW_41_70_KHZ                           0b01010000  //  7     4                 41.70 kHz
     48 #define RADIOLIB_SX1278_BW_62_50_KHZ                           0b01100000  //  7     4                 62.50 kHz
     49 #define RADIOLIB_SX1278_BW_125_00_KHZ                          0b01110000  //  7     4                 125.00 kHz
     50 #define RADIOLIB_SX1278_BW_250_00_KHZ                          0b10000000  //  7     4                 250.00 kHz
     51 #define RADIOLIB_SX1278_BW_500_00_KHZ                          0b10010000  //  7     4                 500.00 kHz
     52 #define RADIOLIB_SX1278_CR_4_5                                 0b00000010  //  3     1     error coding rate:  4/5
     53 #define RADIOLIB_SX1278_CR_4_6                                 0b00000100  //  3     1                         4/6
     54 #define RADIOLIB_SX1278_CR_4_7                                 0b00000110  //  3     1                         4/7
     55 #define RADIOLIB_SX1278_CR_4_8                                 0b00001000  //  3     1                         4/8
     56 #define RADIOLIB_SX1278_HEADER_EXPL_MODE                       0b00000000  //  0     0     explicit header mode
     57 #define RADIOLIB_SX1278_HEADER_IMPL_MODE                       0b00000001  //  0     0     implicit header mode
     58 
     59 // SX127X_REG_MODEM_CONFIG_2
     60 #define RADIOLIB_SX1278_RX_CRC_MODE_OFF                        0b00000000  //  2     2     CRC disabled
     61 #define RADIOLIB_SX1278_RX_CRC_MODE_ON                         0b00000100  //  2     2     CRC enabled
     62 
     63 // RADIOLIB_SX1278_REG_MODEM_CONFIG_3
     64 #define RADIOLIB_SX1278_LOW_DATA_RATE_OPT_OFF                  0b00000000  //  3     3     low data rate optimization disabled
     65 #define RADIOLIB_SX1278_LOW_DATA_RATE_OPT_ON                   0b00001000  //  3     3     low data rate optimization enabled
     66 #define RADIOLIB_SX1278_AGC_AUTO_OFF                           0b00000000  //  2     2     LNA gain set by REG_LNA
     67 #define RADIOLIB_SX1278_AGC_AUTO_ON                            0b00000100  //  2     2     LNA gain set by internal AGC loop
     68 
     69 // SX127X_REG_VERSION
     70 #define RADIOLIB_SX1278_CHIP_VERSION                           0x12
     71 
     72 // SX1278 FSK modem settings
     73 // SX127X_REG_PA_RAMP
     74 #define RADIOLIB_SX1278_NO_SHAPING                             0b00000000  //  6     5     data shaping: no shaping (default)
     75 #define RADIOLIB_SX1278_FSK_GAUSSIAN_1_0                       0b00100000  //  6     5                   FSK modulation Gaussian filter, BT = 1.0
     76 #define RADIOLIB_SX1278_FSK_GAUSSIAN_0_5                       0b01000000  //  6     5                   FSK modulation Gaussian filter, BT = 0.5
     77 #define RADIOLIB_SX1278_FSK_GAUSSIAN_0_3                       0b01100000  //  6     5                   FSK modulation Gaussian filter, BT = 0.3
     78 #define RADIOLIB_SX1278_OOK_FILTER_BR                          0b00100000  //  6     5                   OOK modulation filter, f_cutoff = BR
     79 #define RADIOLIB_SX1278_OOK_FILTER_2BR                         0b01000000  //  6     5                   OOK modulation filter, f_cutoff = 2*BR
     80 
     81 // RADIOLIB_SX1278_REG_AGC_REF
     82 #define RADIOLIB_SX1278_AGC_REFERENCE_LEVEL_LF                 0x19        //  5     0     floor reference for AGC thresholds: AgcRef = -174 + 10*log(2*RxBw) + 8 + AGC_REFERENCE_LEVEL [dBm]: below 525 MHz
     83 #define RADIOLIB_SX1278_AGC_REFERENCE_LEVEL_HF                 0x1C        //  5     0                                                                                                         above 779 MHz
     84 
     85 // RADIOLIB_SX1278_REG_AGC_THRESH_1
     86 #define RADIOLIB_SX1278_AGC_STEP_1_LF                          0x0C        //  4     0     1st AGC threshold: below 525 MHz
     87 #define RADIOLIB_SX1278_AGC_STEP_1_HF                          0x0E        //  4     0                        above 779 MHz
     88 
     89 // RADIOLIB_SX1278_REG_AGC_THRESH_2
     90 #define RADIOLIB_SX1278_AGC_STEP_2_LF                          0x40        //  7     4     2nd AGC threshold: below 525 MHz
     91 #define RADIOLIB_SX1278_AGC_STEP_2_HF                          0x50        //  7     4                        above 779 MHz
     92 #define RADIOLIB_SX1278_AGC_STEP_3                             0x0B        //  3     0     3rd AGC threshold
     93 
     94 // RADIOLIB_SX1278_REG_AGC_THRESH_3
     95 #define RADIOLIB_SX1278_AGC_STEP_4                             0xC0        //  7     4     4th AGC threshold
     96 #define RADIOLIB_SX1278_AGC_STEP_5                             0x0C        //  4     0     5th AGC threshold
     97 
     98 /*!
     99   \class SX1278
    100 
    101   \brief Derived class for %SX1278 modules. Also used as base class for SX1276, SX1277, SX1279, RFM95 and RFM96.
    102   All of these modules use the same basic hardware and only differ in parameter ranges (and names).
    103 */
    104 class SX1278: public SX127x {
    105   public:
    106 
    107     // constructor
    108 
    109     /*!
    110       \brief Default constructor. Called from Arduino sketch when creating new LoRa instance.
    111 
    112       \param mod Instance of Module that will be used to communicate with the %LoRa chip.
    113     */
    114     SX1278(Module* mod);
    115 
    116     // basic methods
    117 
    118     /*!
    119       \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module.
    120 
    121       \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 525.0 MHz.
    122 
    123       \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz.
    124 
    125       \param sf %LoRa link spreading factor. Allowed values range from 6 to 12.
    126 
    127       \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8.
    128 
    129       \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks.
    130 
    131       \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm.
    132 
    133       \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number.
    134       Allowed values range from 6 to 65535.
    135 
    136       \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain.
    137       Set to 0 to enable automatic gain control (recommended).
    138 
    139       \returns \ref status_codes
    140     */
    141     int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = RADIOLIB_SX127X_SYNC_WORD, int8_t power = 10, uint16_t preambleLength = 8, uint8_t gain = 0);
    142 
    143     /*!
    144       \brief FSK modem initialization method. Must be called at least once from Arduino sketch to initialize the module.
    145 
    146       \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 525.0 MHz.
    147 
    148       \param br Bit rate of the FSK transmission in kbps (kilobits per second). Allowed values range from 1.2 to 300.0 kbps.
    149 
    150       \param freqDev Frequency deviation of the FSK transmission in kHz. Allowed values range from 0.6 to 200.0 kHz.
    151       Note that the allowed range changes based on bit rate setting, so that the condition FreqDev + BitRate/2 <= 250 kHz is always met.
    152 
    153       \param rxBw Receiver bandwidth in kHz. Allowed values are 2.6, 3.1, 3.9, 5.2, 6.3, 7.8, 10.4, 12.5, 15.6, 20.8, 25, 31.3, 41.7, 50, 62.5, 83.3, 100, 125, 166.7, 200 and 250 kHz.
    154 
    155       \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm.
    156 
    157       \param preambleLength Length of FSK preamble in bits.
    158 
    159       \param enableOOK Use OOK modulation instead of FSK.
    160 
    161       \returns \ref status_codes
    162     */
    163     int16_t beginFSK(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint16_t preambleLength = 16, bool enableOOK = false);
    164 
    165     /*!
    166       \brief Reset method. Will reset the chip to the default state using RST pin.
    167     */
    168     void reset() override;
    169 
    170     // configuration methods
    171 
    172     /*!
    173       \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 525.0 MHz.
    174 
    175       \param freq Carrier frequency to be set in MHz.
    176 
    177       \returns \ref status_codes
    178     */
    179     int16_t setFrequency(float freq);
    180 
    181     /*!
    182       \brief Sets %LoRa link bandwidth. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. Only available in %LoRa mode.
    183 
    184       \param bw %LoRa link bandwidth to be set in kHz.
    185 
    186       \returns \ref status_codes
    187     */
    188     int16_t setBandwidth(float bw);
    189 
    190     /*!
    191       \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 12. Only available in %LoRa mode.
    192 
    193       \param sf %LoRa link spreading factor to be set.
    194 
    195       \returns \ref status_codes
    196     */
    197     int16_t setSpreadingFactor(uint8_t sf);
    198 
    199     /*!
    200       \brief Sets %LoRa link coding rate denominator. Allowed values range from 5 to 8. Only available in %LoRa mode.
    201 
    202       \param cr %LoRa link coding rate denominator to be set.
    203 
    204       \returns \ref status_codes
    205     */
    206     int16_t setCodingRate(uint8_t cr);
    207 
    208     /*!
    209       \brief Sets transmission output power. Allowed values range from -3 to 15 dBm (RFO pin) or +2 to +17 dBm (PA_BOOST pin).
    210       High power +20 dBm operation is also supported, on the PA_BOOST pin.
    211 
    212       \param power Transmission output power in dBm.
    213 
    214       \param useRfo Whether to use the RFO (true) or the PA_BOOST (false) pin for the RF output. Defaults to PA_BOOST.
    215 
    216       \returns \ref status_codes
    217     */
    218     int16_t setOutputPower(int8_t power, bool useRfo = false);
    219 
    220     /*!
    221       \brief Sets gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain.
    222       Set to 0 to enable automatic gain control (recommended). Only available in %LoRa mode.
    223 
    224       \param gain Gain of receiver LNA (low-noise amplifier) to be set.
    225 
    226       \returns \ref status_codes
    227     */
    228     int16_t setGain(uint8_t gain);
    229 
    230     /*!
    231       \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. Only available in FSK mode with FSK modulation.
    232       Allowed values are RADIOLIB_SHAPING_0_3, RADIOLIB_SHAPING_0_5 or RADIOLIB_SHAPING_1_0. Set to RADIOLIB_SHAPING_NONE to disable data shaping.
    233 
    234       \param sh Gaussian shaping bandwidth-time product that will be used for data shaping
    235 
    236       \returns \ref status_codes
    237     */
    238     int16_t setDataShaping(uint8_t sh) override;
    239 
    240     /*!
    241       \brief Sets filter cutoff frequency that will be used for data shaping.
    242       Allowed values are 1 for frequency equal to bit rate and 2 for frequency equal to 2x bit rate. Set to 0 to disable data shaping.
    243       Only available in FSK mode with OOK modulation.
    244 
    245       \param sh Cutoff frequency that will be used for data shaping
    246 
    247       \returns \ref status_codes
    248     */
    249     int16_t setDataShapingOOK(uint8_t sh);
    250 
    251     /*!
    252       \brief Gets recorded signal strength indicator of the latest received packet for LoRa modem, or current RSSI level for FSK modem.
    253 
    254       \param skipReceive Set to true to skip putting radio in receive mode for the RSSI measurement in FKS/OOK mode.
    255 
    256       \returns Last packet RSSI for LoRa modem, or current RSSI level for FSK modem.
    257     */
    258     float getRSSI(bool skipReceive = false);
    259 
    260     /*!
    261       \brief Enables/disables CRC check of received packets.
    262 
    263       \param enable Enable (true) or disable (false) CRC.
    264 
    265       \param mode Set CRC mode to SX127X_CRC_WHITENING_TYPE_CCITT for CCITT, polynomial X16 + X12 + X5 + 1 (false) or SX127X_CRC_WHITENING_TYPE_IBM for IBM, polynomial X16 + X15 + X2 + 1 (true). Only valid in FSK mode.
    266 
    267       \returns \ref status_codes
    268     */
    269     int16_t setCRC(bool enable, bool mode = false);
    270 
    271     /*!
    272       \brief Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method, LDRO will always be set to
    273       the provided value, regardless of symbol length. To re-enable automatic LDRO configuration, call SX1278::autoLDRO()
    274 
    275       \param enable Force LDRO to be always enabled (true) or disabled (false).
    276 
    277       \returns \ref status_codes
    278     */
    279     int16_t forceLDRO(bool enable);
    280 
    281     /*!
    282       \brief Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method, LDRO will be enabled automatically
    283       when symbol length exceeds 16 ms.
    284 
    285       \returns \ref status_codes
    286     */
    287     int16_t autoLDRO();
    288 
    289     /*!
    290      \brief Set implicit header mode for future reception/transmission. Required for spreading factor 6.
    291 
    292       \param len Payload length in bytes.
    293 
    294       \returns \ref status_codes
    295     */
    296     int16_t implicitHeader(size_t len);
    297 
    298     /*!
    299       \brief Set explicit header mode for future reception/transmission.
    300 
    301       \returns \ref status_codes
    302     */
    303     int16_t explicitHeader();
    304 
    305 #if !defined(RADIOLIB_GODMODE)
    306   protected:
    307 #endif
    308     int16_t setBandwidthRaw(uint8_t newBandwidth);
    309     int16_t setSpreadingFactorRaw(uint8_t newSpreadingFactor);
    310     int16_t setCodingRateRaw(uint8_t newCodingRate);
    311     int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF);
    312 
    313     int16_t configFSK();
    314     void errataFix(bool rx);
    315 
    316 #if !defined(RADIOLIB_GODMODE)
    317   private:
    318 #endif
    319     bool _ldroAuto = true;
    320     bool _ldroEnabled = false;
    321 
    322 };
    323 
    324 #endif
    325 
    326 #endif