RadioLib
Universal wireless communication library for Arduino
Loading...
Searching...
No Matches
SX1278.h
1#if !defined(_RADIOLIB_SX1278_H)
2#define _RADIOLIB_SX1278_H
3
4#include "../../TypeDef.h"
5
6#if !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_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_4 0b00000000 // 3 1 error coding rate: 4/4 (undocumented)
53#define RADIOLIB_SX1278_CR_4_5 0b00000010 // 3 1 4/5
54#define RADIOLIB_SX1278_CR_4_6 0b00000100 // 3 1 4/6
55#define RADIOLIB_SX1278_CR_4_7 0b00000110 // 3 1 4/7
56#define RADIOLIB_SX1278_CR_4_8 0b00001000 // 3 1 4/8
57#define RADIOLIB_SX1278_HEADER_EXPL_MODE 0b00000000 // 0 0 explicit header mode
58#define RADIOLIB_SX1278_HEADER_IMPL_MODE 0b00000001 // 0 0 implicit header mode
59
60// SX127X_REG_MODEM_CONFIG_2
61#define RADIOLIB_SX1278_RX_CRC_MODE_OFF 0b00000000 // 2 2 CRC disabled
62#define RADIOLIB_SX1278_RX_CRC_MODE_ON 0b00000100 // 2 2 CRC enabled
63
64// RADIOLIB_SX1278_REG_MODEM_CONFIG_3
65#define RADIOLIB_SX1278_LOW_DATA_RATE_OPT_OFF 0b00000000 // 3 3 low data rate optimization disabled
66#define RADIOLIB_SX1278_LOW_DATA_RATE_OPT_ON 0b00001000 // 3 3 low data rate optimization enabled
67#define RADIOLIB_SX1278_AGC_AUTO_OFF 0b00000000 // 2 2 LNA gain set by REG_LNA
68#define RADIOLIB_SX1278_AGC_AUTO_ON 0b00000100 // 2 2 LNA gain set by internal AGC loop
69
70// SX127X_REG_VERSION
71#define RADIOLIB_SX1278_CHIP_VERSION 0x12 // this is the "official" version listed in datasheet
72#define RADIOLIB_SX1278_CHIP_VERSION_ALT 0x13 // appears sometimes
73#define RADIOLIB_SX1278_CHIP_VERSION_RFM9X 0x11 // this value is used for the RFM9x
74
75// SX1278 FSK modem settings
76// SX127X_REG_PA_RAMP
77#define RADIOLIB_SX1278_NO_SHAPING 0b00000000 // 6 5 data shaping: no shaping (default)
78#define RADIOLIB_SX1278_FSK_GAUSSIAN_1_0 0b00100000 // 6 5 FSK modulation Gaussian filter, BT = 1.0
79#define RADIOLIB_SX1278_FSK_GAUSSIAN_0_5 0b01000000 // 6 5 FSK modulation Gaussian filter, BT = 0.5
80#define RADIOLIB_SX1278_FSK_GAUSSIAN_0_3 0b01100000 // 6 5 FSK modulation Gaussian filter, BT = 0.3
81#define RADIOLIB_SX1278_OOK_FILTER_BR 0b00100000 // 6 5 OOK modulation filter, f_cutoff = BR
82#define RADIOLIB_SX1278_OOK_FILTER_2BR 0b01000000 // 6 5 OOK modulation filter, f_cutoff = 2*BR
83
84// RADIOLIB_SX1278_REG_AGC_REF
85#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
86#define RADIOLIB_SX1278_AGC_REFERENCE_LEVEL_HF 0x1C // 5 0 above 779 MHz
87
88// RADIOLIB_SX1278_REG_AGC_THRESH_1
89#define RADIOLIB_SX1278_AGC_STEP_1_LF 0x0C // 4 0 1st AGC threshold: below 525 MHz
90#define RADIOLIB_SX1278_AGC_STEP_1_HF 0x0E // 4 0 above 779 MHz
91
92// RADIOLIB_SX1278_REG_AGC_THRESH_2
93#define RADIOLIB_SX1278_AGC_STEP_2_LF 0x40 // 7 4 2nd AGC threshold: below 525 MHz
94#define RADIOLIB_SX1278_AGC_STEP_2_HF 0x50 // 7 4 above 779 MHz
95#define RADIOLIB_SX1278_AGC_STEP_3 0x0B // 3 0 3rd AGC threshold
96
97// RADIOLIB_SX1278_REG_AGC_THRESH_3
98#define RADIOLIB_SX1278_AGC_STEP_4 0xC0 // 7 4 4th AGC threshold
99#define RADIOLIB_SX1278_AGC_STEP_5 0x0C // 4 0 5th AGC threshold
100
106class SX1278: public SX127x {
107 public:
108
109 // constructor
110
115 SX1278(Module* mod); // cppcheck-suppress noExplicitConstructor
116
117 // basic methods
118
126 virtual int16_t begin(const ConfigLoRa_t& config);
127
144 virtual 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);
145
153 virtual int16_t beginFSK(const ConfigFSK_t& config);
154
168 virtual 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);
169
173 void reset() override;
174
175 // configuration methods
176
182 int16_t setFrequency(float freq) override;
183
189 int16_t setBandwidth(float bw);
190
196 virtual int16_t setSpreadingFactor(uint8_t sf);
197
204 int16_t setCodingRate(uint8_t cr);
205
211 int16_t setBitRate(float br) override;
212
220 int16_t setDataRate(DataRate_t dr, ModemType_t modem = RADIOLIB_MODEM_NONE) override;
221
229 int16_t checkDataRate(DataRate_t dr, ModemType_t modem = RADIOLIB_MODEM_NONE) override;
230
237 int16_t setOutputPower(int8_t power) override;
238
247 int16_t setOutputPower(int8_t power, bool forceRfo);
248
256 int16_t checkOutputPower(int8_t power, int8_t* clipped) override;
257
265 int16_t checkOutputPower(int8_t power, int8_t* clipped, bool useRfo);
266
273 int16_t setGain(uint8_t gain);
274
281 int16_t setDataShaping(uint8_t sh) override;
282
290 int16_t setDataShapingOOK(uint8_t sh);
291
297 float getRSSI() override;
298
305 float getRSSI(bool packet, bool skipReceive = false);
306
314 int16_t setCRC(bool enable, bool mode = false);
315
323 int16_t forceLDRO(bool enable);
324
330 int16_t autoLDRO();
331
337 int16_t implicitHeader(size_t len);
338
343 int16_t explicitHeader();
344
351 int16_t setModem(ModemType_t modem) override;
352
353#if !RADIOLIB_GODMODE
354 protected:
355#endif
356 int16_t setBandwidthRaw(uint8_t newBandwidth);
357 int16_t setSpreadingFactorRaw(uint8_t newSpreadingFactor);
358 int16_t setCodingRateRaw(uint8_t newCodingRate);
359
360 int16_t configFSK() override;
361 void errataFix(bool rx) override;
362
363};
364
369RADIOLIB_TYPE_ALIAS(SX1278, RFM98)
370
371#endif
372
373#endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition Module.h:69
Only exists as alias for SX1278, since there seems to be no difference between RFM98 and SX1278 modul...
Derived class for SX1278 modules. Also used as base class for SX1276, SX1277, SX1279,...
Definition SX1278.h:106
float getRSSI() override
Gets received signal strength indicator. Overload with packet mode enabled for PhysicalLayer compatib...
Definition SX1278.cpp:526
int16_t setDataShapingOOK(uint8_t sh)
Sets filter cutoff frequency that will be used for data shaping. Allowed values are 1 for frequency e...
Definition SX1278.cpp:493
int16_t setBandwidth(float bw)
Sets LoRa link bandwidth. Allowed values are 7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62....
Definition SX1278.cpp:124
int16_t implicitHeader(size_t len)
Set implicit header mode for future reception/transmission. Required for spreading factor 6.
Definition SX1278.cpp:591
int16_t setModem(ModemType_t modem) override
Set modem for the radio to use. Will perform full reset and reconfigure the radio using its default p...
Definition SX1278.cpp:745
int16_t setOutputPower(int8_t power) override
Sets transmission output power. Allowed values range from -4 to 15 dBm (RFO pin) or +2 to +17 dBm (PA...
Definition SX1278.cpp:344
void reset() override
Reset method. Will reset the chip to the default state using RST pin.
Definition SX1278.cpp:97
int16_t forceLDRO(bool enable)
Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method,...
Definition SX1278.cpp:567
int16_t checkDataRate(DataRate_t dr, ModemType_t modem=RADIOLIB_MODEM_NONE) override
Check the data rate can be configured by this module.
Definition SX1278.cpp:316
int16_t explicitHeader()
Set explicit header mode for future reception/transmission.
Definition SX1278.cpp:596
int16_t setCodingRate(uint8_t cr)
Sets LoRa link coding rate denominator. Allowed values range from 4 to 8. Only available in LoRa mode...
Definition SX1278.cpp:232
virtual int16_t begin(const ConfigLoRa_t &config)
Initialization method for LoRa modem.
Definition SX1278.cpp:9
virtual int16_t beginFSK(const ConfigFSK_t &config)
Initialization method for FSK modem.
Definition SX1278.cpp:52
int16_t setGain(uint8_t gain)
Sets gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is...
Definition SX1278.cpp:419
int16_t checkOutputPower(int8_t power, int8_t *clipped) override
Check if output power is configurable. This method is needed for compatibility with PhysicalLayer::ch...
Definition SX1278.cpp:391
int16_t setCRC(bool enable, bool mode=false)
Enables/disables CRC check of received packets.
Definition SX1278.cpp:538
int16_t setDataRate(DataRate_t dr, ModemType_t modem=RADIOLIB_MODEM_NONE) override
Set data rate.
Definition SX1278.cpp:273
int16_t setFrequency(float freq) override
Sets carrier frequency. Allowed values range from 137.0 MHz to 175.0 MHz and 395.0 to 525....
Definition SX1278.cpp:106
int16_t autoLDRO()
Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method,...
Definition SX1278.cpp:582
virtual int16_t setSpreadingFactor(uint8_t sf)
Sets LoRa link spreading factor. Allowed values range from 6 to 12. Only available in LoRa mode.
Definition SX1278.cpp:178
int16_t setDataShaping(uint8_t sh) override
Sets Gaussian filter bandwidth-time product that will be used for data shaping. Only available in FSK...
Definition SX1278.cpp:457
int16_t setBitRate(float br) override
Sets FSK bit rate. Allowed values range from 0.5 to 300 kbps. Only available in FSK mode.
Definition SX1278.cpp:269
Base class for SX127x series. All derived classes for SX127x (e.g. SX1278 or SX1272) inherit from thi...
Definition SX127x.h:583
bool enableOOK
Use OOK modulation instead of FSK.
Definition SX127x.h:611
uint8_t gain
Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the ...
Definition SX127x.h:605
Definition PhysicalLayer.h:298
Definition PhysicalLayer.h:280
Common data rate structure.
Definition PhysicalLayer.h:74