From ac4ea556ae18ee45516c0d9439d1550f3d0853f3 Mon Sep 17 00:00:00 2001 From: Libor Tomsik Date: Thu, 15 Apr 2021 08:37:47 +0200 Subject: [PATCH] Implemented AFC&AGC trigger control --- src/modules/SX127x/SX127x.cpp | 45 ++++++++++++++++++++++++++--------- src/modules/SX127x/SX127x.h | 18 ++++++++++++++ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index ae9f3995..2cd50cd1 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -92,7 +92,11 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB state = SX127x::setAFCBandwidth(rxBw); RADIOLIB_ASSERT(state); - state = _mod->SPIsetRegValue(SX127X_REG_RX_CONFIG, 0x1E);//TODO + //sets AFC&AGC trigger to RSSI and preamble detect + state = SX127x::setAFCAGCTrigger(SX127X_RX_TRIGGER_BOTH); + RADIOLIB_ASSERT(state); + + state = SX127x::setAFC(true); RADIOLIB_ASSERT(state); // set receiver bandwidth @@ -768,19 +772,38 @@ int16_t SX127x::setRxBandwidth(float rxBw) { } int16_t SX127x::setAFCBandwidth(float rxBw){ - // check active modem - if(getActiveModem() != SX127X_FSK_OOK){ - return(ERR_WRONG_MODEM); - } + // check active modem + if(getActiveModem() != SX127X_FSK_OOK){ + return(ERR_WRONG_MODEM); + } - RADIOLIB_CHECK_RANGE(rxBw, 2.6, 250.0, ERR_INVALID_RX_BANDWIDTH); + RADIOLIB_CHECK_RANGE(rxBw, 2.6, 250.0, ERR_INVALID_RX_BANDWIDTH); - // set mode to STANDBY - int16_t state = setMode(SX127X_STANDBY); - RADIOLIB_ASSERT(state); + // set mode to STANDBY + int16_t state = setMode(SX127X_STANDBY); + RADIOLIB_ASSERT(state); - // set AFC bandwidth - return(_mod->SPIsetRegValue(SX127X_REG_AFC_BW, calculateBWManExp(rxBw), 4, 0)); + // set AFC bandwidth + return(_mod->SPIsetRegValue(SX127X_REG_AFC_BW, calculateBWManExp(rxBw), 4, 0)); +} + +int16_t SX127x::setAFC(bool isEnabled){ + // check active modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + //set AFC auto on/off + return(_mod->SPIsetRegValue(SX127X_REG_RX_CONFIG, isEnabled ? SX127X_AFC_AUTO_ON : SX127X_AFC_AUTO_OFF, 4, 4)); +} + +int16_t SX127x::setAFCAGCTrigger(uint8_t trigger){ + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + //set AFC&AGC trigger + return(_mod->SPIsetRegValue(SX127X_REG_RX_CONFIG, trigger, 2, 0)); } int16_t SX127x::setSyncWord(uint8_t* syncWord, size_t len) { diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 7508f6c6..e16c8cdf 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -823,6 +823,24 @@ class SX127x: public PhysicalLayer { */ int16_t setAFCBandwidth(float afcBw); + /*! + \brief Enables or disables FSK automatic frequency correction(AFC) + + \param isEnabled AFC enabled or disabled + + \return \ref status_codes + */ + int16_t setAFC(bool isEnabled); + + /*! + \brief Controls trigger of AFC and AGC + + \param trigger one from SX127X_RX_TRIGGER_NONE, SX127X_RX_TRIGGER_RSSI_INTERRUPT, SX127X_RX_TRIGGER_PREAMBLE_DETECT, SX127X_RX_TRIGGER_BOTH + + \return \ref status_codes + */ + int16_t setAFCAGCTrigger(uint8_t trigger); + /*! \brief Sets FSK sync word. Allowed sync words are up to 8 bytes long and can not contain null bytes. Only available in FSK mode.