From 44b7930a0167622763381f6dd39ce34308580941 Mon Sep 17 00:00:00 2001 From: Justin Stephens Date: Fri, 12 Nov 2021 18:28:09 -0500 Subject: [PATCH] Added support for on-the-fly FIFO refilling in FSK. FSK can now transmit variable-length packets up to 255 long, as specified in the data sheet. --- src/modules/SX127x/SX127x.cpp | 38 +++++++++++++++++++++++++++-------- src/modules/SX127x/SX127x.h | 4 ++-- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index b0f1f8ab..5f518a1e 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -472,6 +472,15 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { state |= _mod->SPIsetRegValue(SX127X_REG_FIFO_TX_BASE_ADDR, SX127X_FIFO_TX_BASE_ADDR_MAX); state |= _mod->SPIsetRegValue(SX127X_REG_FIFO_ADDR_PTR, SX127X_FIFO_TX_BASE_ADDR_MAX); + // write packet to FIFO + _mod->SPIwriteRegisterBurst(SX127X_REG_FIFO, data, len); + + // set RF switch (if present) + _mod->setRfSwitchState(LOW, HIGH); + + // start transmission + state |= setMode(SX127X_TX); + } else if(modem == SX127X_FSK_OOK) { // check packet length if(len >= SX127X_MAX_PACKET_LENGTH_FSK) { @@ -494,16 +503,29 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { if((filter == SX127X_ADDRESS_FILTERING_NODE) || (filter == SX127X_ADDRESS_FILTERING_NODE_BROADCAST)) { _mod->SPIwriteRegister(SX127X_REG_FIFO, addr); } + + // Pre-load the FIFO with message before entering TX mode + uint8_t* ind = data; + _mod->SPIwriteRegisterBurst(SX127X_REG_FIFO, ind, min(len, 64)); + ind += min(len, 64); + + // set RF switch (if present) and start transmitting + _mod->setRfSwitchState(LOW, HIGH); + state |= setMode(SX127X_TX); + + // Re-fill the FIFO on-the-fly as bytes are transmitted + while (ind < data + len) { + uint16_t flags = getIRQFlags(); + bool fifo_full = flags >> 15; + + // If FIFO not full, write another byte + if (!fifo_full) { + _mod->SPIwriteRegister(SX127X_REG_FIFO, *ind); + ind++; + } + } } - // write packet to FIFO - _mod->SPIwriteRegisterBurst(SX127X_REG_FIFO, data, len); - - // set RF switch (if present) - _mod->setRfSwitchState(LOW, HIGH); - - // start transmission - state |= setMode(SX127X_TX); RADIOLIB_ASSERT(state); return(ERR_NONE); diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index dc33ec08..b8347c2c 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -12,7 +12,7 @@ // SX127x physical layer properties #define SX127X_FREQUENCY_STEP_SIZE 61.03515625 #define SX127X_MAX_PACKET_LENGTH 255 -#define SX127X_MAX_PACKET_LENGTH_FSK 64 +#define SX127X_MAX_PACKET_LENGTH_FSK 255 #define SX127X_CRYSTAL_FREQ 32.0 #define SX127X_DIV_EXPONENT 19 @@ -601,7 +601,7 @@ class SX127x: public PhysicalLayer { int16_t beginFSK(uint8_t chipVersion, float br, float freqDev, float rxBw, uint16_t preambleLength, bool enableOOK); /*! - \brief Binary transmit method. Will transmit arbitrary binary data up to 255 bytes long using %LoRa or up to 63 bytes using FSK modem. + \brief Binary transmit method. Will transmit arbitrary binary data up to 255 bytes long. For overloads to transmit Arduino String or C-string, see PhysicalLayer::transmit. \param data Binary data that will be transmitted.