[STM32WLx] Apply PA clamp workaround for HP only

This modifies SX1262::begin and beginFSK to call setOutputPower after
applying the workaround, so that can undo the workaround if needed.
This commit is contained in:
Matthijs Kooijman 2022-12-07 09:50:31 +01:00
parent 9252cf53d3
commit cd138dd6c7
4 changed files with 16 additions and 8 deletions

View file

@ -64,6 +64,10 @@ int16_t STM32WLx::setOutputPower(int8_t power) {
} }
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
// Apply workaround for HP only
state = SX126x::fixPaClamping(use_hp);
RADIOLIB_ASSERT(state);
// set output power // set output power
/// \todo power ramp time configuration /// \todo power ramp time configuration
state = SX126x::setTxParams(power); state = SX126x::setTxParams(power);

View file

@ -20,10 +20,10 @@ int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync
state = setFrequency(freq); state = setFrequency(freq);
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
state = setOutputPower(power); state = SX126x::fixPaClamping();
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
state = SX126x::fixPaClamping(); state = setOutputPower(power);
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
return(state); return(state);
@ -38,10 +38,10 @@ int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t
state = setFrequency(freq); state = setFrequency(freq);
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
state = setOutputPower(power); state = SX126x::fixPaClamping();
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
state = SX126x::fixPaClamping(); state = setOutputPower(power);
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
return(state); return(state);

View file

@ -1575,7 +1575,7 @@ int16_t SX126x::fixSensitivity() {
return(writeRegister(RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1)); return(writeRegister(RADIOLIB_SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1));
} }
int16_t SX126x::fixPaClamping() { int16_t SX126x::fixPaClamping(bool enable) {
// fixes overly eager PA clamping // fixes overly eager PA clamping
// see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.2 for details // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.2 for details
@ -1584,8 +1584,12 @@ int16_t SX126x::fixPaClamping() {
int16_t state = readRegister(RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); int16_t state = readRegister(RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1);
RADIOLIB_ASSERT(state); RADIOLIB_ASSERT(state);
// update with the new value // apply or undo workaround
if (enable)
clampConfig |= 0x1E; clampConfig |= 0x1E;
else
clampConfig = (clampConfig & ~0x1E) | 0x08;
return(writeRegister(RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1)); return(writeRegister(RADIOLIB_SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1));
} }

View file

@ -1005,7 +1005,7 @@ class SX126x: public PhysicalLayer {
// fixes to errata // fixes to errata
int16_t fixSensitivity(); int16_t fixSensitivity();
int16_t fixPaClamping(); int16_t fixPaClamping(bool enable = true);
int16_t fixImplicitTimeout(); int16_t fixImplicitTimeout();
int16_t fixInvertedIQ(uint8_t iqConfig); int16_t fixInvertedIQ(uint8_t iqConfig);