From d710a85985168b163267250d1cd5d814dc5968a9 Mon Sep 17 00:00:00 2001 From: jgromes <jgromes@users.noreply.github.com> Date: Thu, 18 Jun 2020 16:38:30 +0200 Subject: [PATCH] [SX126x] Implemented RF switch control (#153) --- examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino | 10 ++++++++++ src/modules/SX126x/SX126x.cpp | 10 ++++++++++ src/modules/SX126x/SX126x.h | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino index 574fdff3..338bf3f5 100644 --- a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino +++ b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino @@ -51,6 +51,16 @@ void setup() { Serial.println(state); while (true); } + + // some modules have an external RF switch + // controlled via two pins (RX enable, TX enable) + // to enable automatic control of the switch, + // call the following method + // RX enable: 4 + // TX enable: 5 + /* + lora.setRfSwitchPins(4, 5); + */ } void loop() { diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index e419761e..efbecc10 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -435,6 +435,9 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { state = fixSensitivity(); RADIOLIB_ASSERT(state); + // set RF switch (if present) + _mod->setRfSwitchState(true); + // start transmission state = setTx(SX126X_TX_TIMEOUT_NONE); RADIOLIB_ASSERT(state); @@ -451,6 +454,9 @@ int16_t SX126x::startReceive(uint32_t timeout) { int16_t state = startReceiveCommon(); RADIOLIB_ASSERT(state); + // set RF switch (if present) + _mod->setRfSwitchState(true); + // set mode to receive state = setRx(timeout); @@ -1117,6 +1123,10 @@ int16_t SX126x::setEncoding(uint8_t encoding) { return(setWhitening(encoding)); } +void SX126x::setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn) { + _mod->setRfSwitchPins(rxEn, txEn); +} + int16_t SX126x::setTCXO(float voltage, uint32_t delay) { // set mode to standby standby(); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index e6a7f078..ae2216d6 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -843,6 +843,16 @@ class SX126x: public PhysicalLayer { */ int16_t setEncoding(uint8_t encoding); + /*! + \brief Some modules contain external RF switch controlled by two pins. This function gives RadioLib control over those two pins to automatically switch Rx and Tx state. + When using automatic RF switch control, DO NOT change the pin mode of rxEn or txEn from Arduino sketch! + + \param rxEn RX enable pin. + + \param txEn TX enable pin. + */ + void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn); + #ifndef RADIOLIB_GODMODE protected: #endif