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