diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index 73731972..345c7db6 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -22,6 +22,11 @@ int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syn return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } @@ -43,6 +48,11 @@ int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index b9a26a5f..a45aa092 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -92,8 +92,6 @@ class SX1262: public SX126x { int16_t setOutputPower(int8_t power); private: - - }; #endif diff --git a/src/modules/SX1268.cpp b/src/modules/SX1268.cpp index 3ffb9a2a..44a671a7 100644 --- a/src/modules/SX1268.cpp +++ b/src/modules/SX1268.cpp @@ -22,6 +22,11 @@ int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syn return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping) { @@ -42,6 +47,11 @@ int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 4896fe59..639c5106 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1199,6 +1199,16 @@ int16_t SX126x::setFrequencyRaw(float freq) { return(ERR_NONE); } +int16_t SX126x::fixPaClamping() { + uint8_t clampConfig; + uint16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); + if (state != ERR_NONE) { + return state; + } + clampConfig |= 0x1E; + return writeRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); +} + int16_t SX126x::config(uint8_t modem) { // set regulator mode uint8_t data[7]; diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 8ba13459..d82721c5 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -92,6 +92,7 @@ #define SX126X_REG_OCP_CONFIGURATION 0x08E7 #define SX126X_REG_XTA_TRIM 0x0911 #define SX126X_REG_XTB_TRIM 0x0912 +#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 //Datasheet 15.2 // SX126X SPI command variables @@ -753,6 +754,10 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); + /*! + \brief Fixes overly eager PA clamping on SX1262 / SX1268, as described in section 15.2 of the datasheet + */ + int16_t fixPaClamping(); private: Module* _mod; @@ -769,6 +774,8 @@ class SX126x: public PhysicalLayer { int16_t config(uint8_t modem); + + // common low-level SPI interface int16_t SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); int16_t SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy = true);