From 27998f3e3cb9bee390923928bb374c14400101bf Mon Sep 17 00:00:00 2001 From: Marcin Czeczko <marcin.czeczko@gmail.com> Date: Wed, 3 Mar 2021 14:52:46 +0100 Subject: [PATCH] Move invertIQ to the 127x. Aligned with latest datasheet --- src/modules/SX127x/SX1278.cpp | 16 ---------------- src/modules/SX127x/SX1278.h | 13 ------------- src/modules/SX127x/SX127x.cpp | 20 ++++++++++++++++++++ src/modules/SX127x/SX127x.h | 20 ++++++++++++++++++++ 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/modules/SX127x/SX1278.cpp b/src/modules/SX127x/SX1278.cpp index 8f43d52e..f33af33a 100644 --- a/src/modules/SX127x/SX1278.cpp +++ b/src/modules/SX127x/SX1278.cpp @@ -538,22 +538,6 @@ int16_t SX1278::setHeaderType(uint8_t headerType, size_t len) { return(state); } -int16_t SX1278::invertIQ(bool invertIQ) { - // check active modem - if(getActiveModem() != SX127X_LORA) { - return(ERR_WRONG_MODEM); - } - - int16_t state; - if(invertIQ) { - state = _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ, SX127X_REG_INVERT_IQ_ON, 6, 6); - } else { - state = _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ, SX127X_REG_INVERT_IQ_OFF, 6, 6); - } - - return(state); -} - int16_t SX1278::configFSK() { // configure common registers int16_t state = SX127x::configFSK(); diff --git a/src/modules/SX127x/SX1278.h b/src/modules/SX127x/SX1278.h index b79eb244..438a9c18 100644 --- a/src/modules/SX127x/SX1278.h +++ b/src/modules/SX127x/SX1278.h @@ -66,10 +66,6 @@ #define SX1278_AGC_AUTO_OFF 0b00000000 // 2 2 LNA gain set by REG_LNA #define SX1278_AGC_AUTO_ON 0b00000100 // 2 2 LNA gain set by internal AGC loop -// SX127X_REG_INVERT_IQ -#define SX127X_REG_INVERT_IQ_ON 0b01000000 // 6 6 I and Q signals are inverted -#define SX127X_REG_INVERT_IQ_OFF 0b00000000 // 6 6 normal mode - // SX127X_REG_VERSION #define SX1278_CHIP_VERSION 0x12 @@ -299,15 +295,6 @@ class SX1278: public SX127x { */ int16_t explicitHeader(); - /*! - \brief Enables/disables Invert the LoRa I and Q signals. - - \param invertIQ Enable (true) or disable (false) LoRa I and Q signals. - - \returns \ref status_codes - */ - int16_t invertIQ(bool invertIQ); - #ifndef RADIOLIB_GODMODE protected: #endif diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index c57f4b56..2fac82e7 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1190,4 +1190,24 @@ void SX127x::clearFIFO(size_t count) { } } +int16_t SX127x::invertIQ(bool invertIQ) { + // check active modem + if(getActiveModem() != SX127X_LORA) { + return(ERR_WRONG_MODEM); + } + + int16_t state; + if(invertIQ) { + state = _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ, SX127X_INVERT_IQ_RXPATH_ON, 6, 6); + state |= _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ, SX127X_INVERT_IQ_TXPATH_ON, 0, 0); + state |= _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ2, SX127X_IQ2_ENABLE); + } else { + state = _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ, SX127X_INVERT_IQ_RXPATH_OFF, 6, 6); + state |= _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ, SX127X_INVERT_IQ_TXPATH_OFF, 0, 0); + state |= _mod->SPIsetRegValue(SX127X_REG_INVERT_IQ2, SX127X_IQ2_DISABLE); + } + + return(state); +} + #endif diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 831e49a4..96692fa4 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -59,6 +59,7 @@ #define SX127X_REG_INVERT_IQ 0x33 #define SX127X_REG_DETECTION_THRESHOLD 0x37 #define SX127X_REG_SYNC_WORD 0x39 +#define SX127X_REG_INVERT_IQ2 0x3B #define SX127X_REG_DIO_MAPPING_1 0x40 #define SX127X_REG_DIO_MAPPING_2 0x41 #define SX127X_REG_VERSION 0x42 @@ -122,6 +123,12 @@ #define SX127X_DETECT_OPTIMIZE_SF_6 0b00000101 // 2 0 SF6 detection optimization #define SX127X_DETECT_OPTIMIZE_SF_7_12 0b00000011 // 2 0 SF7 to SF12 detection optimization +// SX127X_REG_INVERT_IQ +#define SX127X_INVERT_IQ_RXPATH_ON 0b01000000 // 6 6 I and Q signals are inverted +#define SX127X_INVERT_IQ_RXPATH_OFF 0b00000000 // 6 6 normal mode +#define SX127X_INVERT_IQ_TXPATH_ON 0b00000001 // 0 0 I and Q signals are inverted +#define SX127X_INVERT_IQ_TXPATH_OFF 0b00000000 // 0 0 normal mode + // SX127X_REG_DETECTION_THRESHOLD #define SX127X_DETECTION_THRESHOLD_SF_6 0b00001100 // 7 0 SF6 detection threshold #define SX127X_DETECTION_THRESHOLD_SF_7_12 0b00001010 // 7 0 SF7 to SF12 detection threshold @@ -172,6 +179,10 @@ #define SX127X_SYNC_WORD 0x12 // 7 0 default LoRa sync word #define SX127X_SYNC_WORD_LORAWAN 0x34 // 7 0 sync word reserved for LoRaWAN networks +// SX127X_REG_INVERT_IQ2 +#define SX127X_IQ2_ENABLE 0x19 // 7 0 enable optimize for inverted IQ +#define SX127X_IQ2_DISABLE 0x1D // 7 0 reset optimize for inverted IQ + // SX127x series common FSK registers // NOTE: FSK register names that are conflicting with LoRa registers are marked with "_FSK" suffix #define SX127X_REG_BITRATE_MSB 0x02 @@ -945,6 +956,15 @@ class SX127x: public PhysicalLayer { */ int16_t getChipVersion(); + /*! + \brief Enables/disables Invert the LoRa I and Q signals. + + \param invertIQ Enable (true) or disable (false) LoRa I and Q signals. + + \returns \ref status_codes + */ + int16_t invertIQ(bool invertIQ); + #ifndef RADIOLIB_GODMODE protected: #endif