diff --git a/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino b/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino index f0fe3e8b..ec3f03a3 100644 --- a/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino +++ b/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino @@ -114,10 +114,10 @@ void loop() { } - // NOTE: in FSK mode, SX127x will not automatically - // turn transmitter off after sending a packet - // set mode to standby to ensure we don't jam others - //radio.standby() + // clean up after transmission is finished + // this will ensure transmitter is disabled, + // RF switch is powered down etc. + radio.finishTransmit(); // wait a second before transmitting again delay(1000); diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 143ab2c0..db16ff81 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -159,7 +159,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { while(!_mod->digitalRead(_mod->getIrq())) { _mod->yield(); if(_mod->micros() - start > timeout) { - clearIRQFlags(); + finishTransmit(); return(RADIOLIB_ERR_TX_TIMEOUT); } } @@ -177,8 +177,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { while(!_mod->digitalRead(_mod->getIrq())) { _mod->yield(); if(_mod->micros() - start > timeout) { - clearIRQFlags(); - standby(); + finishTransmit(); return(RADIOLIB_ERR_TX_TIMEOUT); } } @@ -189,12 +188,8 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { // update data rate uint32_t elapsed = _mod->micros() - start; _dataRate = (len*8.0)/((float)elapsed/1000000.0); - - // clear interrupt flags - clearIRQFlags(); - - // set mode to standby to disable transmitter - return(standby()); + + return(finishTransmit()); } int16_t SX127x::receive(uint8_t* data, size_t len) { @@ -607,6 +602,14 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { return(RADIOLIB_ERR_NONE); } +int16_t SX127x::finishTransmit() { + // clear interrupt flags + clearIRQFlags(); + + // set mode to standby to disable transmitter/RF switch + return(standby()); +} + int16_t SX127x::readData(uint8_t* data, size_t len) { int16_t modem = getActiveModem(); diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 553a2fe9..c960f2d2 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -800,6 +800,13 @@ class SX127x: public PhysicalLayer { */ int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0) override; + /*! + \brief Clean up after transmission is done. + + \returns \ref status_codes + */ + int16_t finishTransmit() override; + /*! \brief Interrupt-driven receive method. DIO0 will be activated when full valid packet is received.