From c491a2ab82897112f1511f873214c2aaa00cf853 Mon Sep 17 00:00:00 2001 From: "Daniel A. Maierhofer" Date: Sun, 18 Jan 2015 12:09:08 +0100 Subject: [PATCH 1/3] Ensure FIFO & associated flags are reset during initialize() by https://github.com/dekay/RFM69/commit/aa3ebc2997d87230b72c13b7bedc480871c96296 --- RFM69.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/RFM69.cpp b/RFM69.cpp index 2418250..eb6b361 100644 --- a/RFM69.cpp +++ b/RFM69.cpp @@ -70,6 +70,7 @@ bool RFM69::initialize(uint8_t freqBand, uint8_t nodeID, uint8_t networkID) /* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2 }, // (BitRate < 2 * RxBw) //for BR-19200: /* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_3 }, /* 0x25 */ { REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 }, // DIO0 is the only IRQ we're using + /* 0x28 */ { REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN }, // writing to this bit ensures that the FIFO & status flags are reset /* 0x29 */ { REG_RSSITHRESH, 220 }, // must be set to dBm = (-Sensitivity / 2), default is 0xE4 = 228 so -114dBm ///* 0x2D */ { REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } // default 3 preamble bytes 0xAAAAAA /* 0x2E */ { REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0 }, From 8cecd36d9b63b30831549b0b2aefe3e94780ff06 Mon Sep 17 00:00:00 2001 From: "Daniel A. Maierhofer" Date: Sun, 18 Jan 2015 12:22:43 +0100 Subject: [PATCH 2/3] Follow Optimized Frequency Hopping Sequence by https://github.com/mike-zero/RFM69/commit/cf13c60ae5a1bf449af8bdcd8f49506028744c6a Don't remove "if (newMode == _mode)" to prevent unnecessary mode switching by setFrequency() --- RFM69.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/RFM69.cpp b/RFM69.cpp index eb6b361..b6d5db3 100644 --- a/RFM69.cpp +++ b/RFM69.cpp @@ -119,16 +119,24 @@ uint32_t RFM69::getFrequency() // set the frequency (in Hz) void RFM69::setFrequency(uint32_t freqHz) { - // TODO: datasheet p38 hopping sequence may need to be followed in some cases + uint8_t oldMode = _mode; + if (oldMode == RF69_MODE_TX) { + setMode(RF69_MODE_RX); + } freqHz /= RF69_FSTEP; // divide down by FSTEP to get FRF writeReg(REG_FRFMSB, freqHz >> 16); writeReg(REG_FRFMID, freqHz >> 8); writeReg(REG_FRFLSB, freqHz); + if (oldMode == RF69_MODE_RX) { + setMode(RF69_MODE_SYNTH); + } + setMode(oldMode); } void RFM69::setMode(uint8_t newMode) { - if (newMode == _mode) return; // TODO: can remove this? + if (newMode == _mode) + return; switch (newMode) { case RF69_MODE_TX: @@ -148,7 +156,8 @@ void RFM69::setMode(uint8_t newMode) case RF69_MODE_SLEEP: writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_SLEEP); break; - default: return; + default: + return; } // we are using packet mode, so this check is not really needed From 3899f1f018abe7241809db0f9b6298b51584bda4 Mon Sep 17 00:00:00 2001 From: "Daniel A. Maierhofer" Date: Sun, 18 Jan 2015 12:31:16 +0100 Subject: [PATCH 3/3] Ensure _slaveSelectPin is driven high after initialize() or setCS() --- RFM69.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RFM69.cpp b/RFM69.cpp index b6d5db3..d0f6c97 100644 --- a/RFM69.cpp +++ b/RFM69.cpp @@ -87,6 +87,7 @@ bool RFM69::initialize(uint8_t freqBand, uint8_t nodeID, uint8_t networkID) {255, 0} }; + digitalWrite(_slaveSelectPin, HIGH); pinMode(_slaveSelectPin, OUTPUT); SPI.begin(); @@ -456,6 +457,7 @@ void RFM69::setHighPowerRegs(bool onOff) { void RFM69::setCS(uint8_t newSPISlaveSelect) { _slaveSelectPin = newSPISlaveSelect; + digitalWrite(_slaveSelectPin, HIGH); pinMode(_slaveSelectPin, OUTPUT); }