From 8fc323a900a9885bb47beacbfa336a12a0a23524 Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 13:13:00 +0800 Subject: [PATCH 1/7] Add function to set DIO2 of SX126x chips to be used as RF antenna switch (based on example design of Semtech and used in many modules). This breaks the CAD function as DIO2 cannot be used as IRQ output. Signed-off-by: Bernd Giesecke --- src/Module.cpp | 4 ++++ src/Module.h | 16 +++++++++++++++- src/modules/SX126x.cpp | 28 ++++++++++++++++++++++++++++ src/modules/SX126x.h | 7 +++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/Module.cpp b/src/Module.cpp index 5c238519..da2ac6f9 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -79,6 +79,10 @@ void Module::term() { _spi->end(); } +void Module::setDio2Func(bool enable) { + _dio2RfSwitch = enable; +} + void Module::ATemptyBuffer() { while(ModuleSerial->available() > 0) { ModuleSerial->read(); diff --git a/src/Module.h b/src/Module.h index c596276f..0ed6a3eb 100644 --- a/src/Module.h +++ b/src/Module.h @@ -277,6 +277,20 @@ class Module { */ int getTx() const { return(_tx); } + /*! + \brief Access method to get DIO2 RF switch flag. + + \returns true if DIO2 is set as RF switch. + */ + int getDio2Func() const { return(_dio2RfSwitch); } + + /*! + \brief Access method to set/reset DIO2 RF switch flag. + + \returns true if DIO2 is set as RF switch. + */ + void setDio2Func(bool enable); + /*! \brief Access method to get the SPI interface. @@ -297,7 +311,7 @@ class Module { int _rx; int _int0; int _int1; - + bool _dio2RfSwitch = false; SPIClass* _spi; SPISettings _spiSettings; diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 05274763..e43a774d 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -274,6 +274,11 @@ int16_t SX126x::scanChannel() { return(ERR_WRONG_MODEM); } + if (_mod->getDio2Func()) { + // If DIO2 is used as RF switch this function does not work + return(ERR_WRONG_MODEM); + } + // set mode to standby int16_t state = standby(); if(state != ERR_NONE) { @@ -1058,6 +1063,29 @@ int16_t SX126x::setFrequencyRaw(float freq) { return(ERR_NONE); } +int16_t SX126x::setDio2AsRfSwitch(bool enable) { + int dio2 = _mod->getInt1(); + if (dio2 == -1) + { + // DIO2 is not defined, return error + _mod->setDio2Func(false); + return ERR_WRONG_MODEM; + } + uint8_t* data = new uint8_t[1]; + if (enable) { + // set DIO2 as RF switch + data[0] = SX126X_DIO2_AS_RF_SWITCH; + } else { + data[0] = SX126X_DIO2_AS_IRQ; + } + int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1); + + if (state == ERR_NONE) { + _mod->setDio2Func(enable); + } + return(state); +} + int16_t SX126x::config(uint8_t modem) { // set DIO2 as IRQ uint8_t* data = new uint8_t[1]; diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index a9a84b4b..1f34c759 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -678,6 +678,13 @@ class SX126x: public PhysicalLayer { */ float getSNR(); + /*! + \brief Set DIO2 to function as RF switch (default in Semtech example designs). + + \returns \ref status_codes + */ + int16_t setDio2AsRfSwitch(bool enable = false); + protected: // SX1276x SPI command implementations int16_t setTx(uint32_t timeout = 0); From 23b0b9b25adfff134dedee985e5e83c9a69cde7d Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 14:28:33 +0800 Subject: [PATCH 2/7] Moved `setDio2AsRfSwitch()` from module to SX126x Added new error code Removed memory leak Signed-off-by: Bernd Giesecke --- src/Module.cpp | 4 ---- src/Module.h | 15 --------------- src/TypeDef.h | 5 +++++ src/modules/SX126x.cpp | 16 +++++----------- src/modules/SX126x.h | 4 +++- 5 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index da2ac6f9..5c238519 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -79,10 +79,6 @@ void Module::term() { _spi->end(); } -void Module::setDio2Func(bool enable) { - _dio2RfSwitch = enable; -} - void Module::ATemptyBuffer() { while(ModuleSerial->available() > 0) { ModuleSerial->read(); diff --git a/src/Module.h b/src/Module.h index 0ed6a3eb..03fb75d4 100644 --- a/src/Module.h +++ b/src/Module.h @@ -277,20 +277,6 @@ class Module { */ int getTx() const { return(_tx); } - /*! - \brief Access method to get DIO2 RF switch flag. - - \returns true if DIO2 is set as RF switch. - */ - int getDio2Func() const { return(_dio2RfSwitch); } - - /*! - \brief Access method to set/reset DIO2 RF switch flag. - - \returns true if DIO2 is set as RF switch. - */ - void setDio2Func(bool enable); - /*! \brief Access method to get the SPI interface. @@ -311,7 +297,6 @@ class Module { int _rx; int _int0; int _int1; - bool _dio2RfSwitch = false; SPIClass* _spi; SPISettings _spiSettings; diff --git a/src/TypeDef.h b/src/TypeDef.h index b007f408..efda5ef0 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -461,6 +461,11 @@ */ #define ERR_SPI_CMD_FAILED -707 +/*! + \brief SX126x scan channel not possible because DIO2 is used as RF antenna switch. +*/ +#define ERR_DIO2_UNAVAIL_CAD_FAILED -708 + /*! \} */ diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index e43a774d..deb2dba8 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -274,9 +274,9 @@ int16_t SX126x::scanChannel() { return(ERR_WRONG_MODEM); } - if (_mod->getDio2Func()) { + if (_dio2RfSwitch) { // If DIO2 is used as RF switch this function does not work - return(ERR_WRONG_MODEM); + return(ERR_DIO2_UNAVAIL_CAD_FAILED); } // set mode to standby @@ -1064,14 +1064,7 @@ int16_t SX126x::setFrequencyRaw(float freq) { } int16_t SX126x::setDio2AsRfSwitch(bool enable) { - int dio2 = _mod->getInt1(); - if (dio2 == -1) - { - // DIO2 is not defined, return error - _mod->setDio2Func(false); - return ERR_WRONG_MODEM; - } - uint8_t* data = new uint8_t[1]; + uint8_t data[1]; if (enable) { // set DIO2 as RF switch data[0] = SX126X_DIO2_AS_RF_SWITCH; @@ -1081,13 +1074,14 @@ int16_t SX126x::setDio2AsRfSwitch(bool enable) { int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1); if (state == ERR_NONE) { - _mod->setDio2Func(enable); + _dio2RfSwitch = true; } return(state); } int16_t SX126x::config(uint8_t modem) { // set DIO2 as IRQ + _dio2RfSwitch = false; uint8_t* data = new uint8_t[1]; data[0] = SX126X_DIO2_AS_IRQ; int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1); diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 1f34c759..0139e191 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -683,7 +683,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t setDio2AsRfSwitch(bool enable = false); + int16_t setDio2AsRfSwitch(bool enable = true); protected: // SX1276x SPI command implementations @@ -727,6 +727,8 @@ class SX126x: public PhysicalLayer { float _dataRate; + bool _dio2RfSwitch = false; + int16_t config(uint8_t modem); // common low-level SPI interface From c9779648d5784eefc6b49c3a270ceb53bf13dd9c Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 14:32:33 +0800 Subject: [PATCH 3/7] Put back accidentially removed empty line. Signed-off-by: Bernd Giesecke --- src/Module.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Module.h b/src/Module.h index 03fb75d4..c596276f 100644 --- a/src/Module.h +++ b/src/Module.h @@ -297,6 +297,7 @@ class Module { int _rx; int _int0; int _int1; + SPIClass* _spi; SPISettings _spiSettings; From 7ab491d221a73ae973de55ec2a444724b88470d4 Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 14:44:37 +0800 Subject: [PATCH 4/7] Correct wrong declaration of ```ESP8266::getNumBytes(uint32_t timeout, size_t minBytes)``` Signed-off-by: Bernd Giesecke --- src/modules/ESP8266.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/ESP8266.cpp b/src/modules/ESP8266.cpp index c6dcc55a..8586cf96 100644 --- a/src/modules/ESP8266.cpp +++ b/src/modules/ESP8266.cpp @@ -180,7 +180,7 @@ size_t ESP8266::receive(uint8_t* data, size_t len, uint32_t timeout) { return(i); } -uint16_t ESP8266::getNumBytes(uint32_t timeout, size_t minBytes) { +size_t ESP8266::getNumBytes(uint32_t timeout, size_t minBytes) { // wait for available data uint32_t start = millis(); while(_mod->ModuleSerial->available() < (int16_t)minBytes) { From 039cb0646017a630a2943e63897f192c6d927831 Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 15:18:11 +0800 Subject: [PATCH 5/7] Added missing keyword Signed-off-by: Bernd Giesecke --- keywords.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/keywords.txt b/keywords.txt index 7621a797..31d82ea1 100644 --- a/keywords.txt +++ b/keywords.txt @@ -104,6 +104,7 @@ setGdo1Action KEYWORD2 # SX126x-specific setDio2Action KEYWORD2 setTCXO KEYWORD2 +setDio2AsRfSwitch KEYWORD2 # ESP8266 join KEYWORD2 From 8c0a7a2ea31d2f92b47cd5d7e2fe76578a1b814c Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 15:35:24 +0800 Subject: [PATCH 6/7] Moved DIO2 setting into begin()/beginFSK() Signed-off-by: Bernd Giesecke --- src/modules/SX126x.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index deb2dba8..3a74fe4e 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -33,6 +33,11 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, uint1 } // configure publicly accessible settings + state = setDio2AsRfSwitch(false); + if(state != ERR_NONE) { + return(state); + } + state = setSpreadingFactor(sf); if(state != ERR_NONE) { return(state); @@ -86,6 +91,11 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, uint16_t preambleL } // configure publicly accessible settings + state = setDio2AsRfSwitch(false); + if(state != ERR_NONE) { + return(state); + } + state = setBitRate(br); if(state != ERR_NONE) { return(state); @@ -1080,18 +1090,10 @@ int16_t SX126x::setDio2AsRfSwitch(bool enable) { } int16_t SX126x::config(uint8_t modem) { - // set DIO2 as IRQ - _dio2RfSwitch = false; - uint8_t* data = new uint8_t[1]; - data[0] = SX126X_DIO2_AS_IRQ; - int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1); - if(state != ERR_NONE) { - return(state); - } - // set regulator mode + uint8_t* data = new uint8_t[1]; data[0] = SX126X_REGULATOR_DC_DC; - state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1); + int16_t state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1); if(state != ERR_NONE) { return(state); } From b8b20a3753276304508936c89e653a7471fe3504 Mon Sep 17 00:00:00 2001 From: Bernd Giesecke Date: Tue, 4 Jun 2019 15:38:42 +0800 Subject: [PATCH 7/7] Corrected bug. Signed-off-by: Bernd Giesecke --- src/modules/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 3a74fe4e..8291857c 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1084,7 +1084,7 @@ int16_t SX126x::setDio2AsRfSwitch(bool enable) { int16_t state = SPIwriteCommand(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, data, 1); if (state == ERR_NONE) { - _dio2RfSwitch = true; + _dio2RfSwitch = enable; } return(state); }