From 9ca2499b451b4121d424e7aa9e873199ade8c829 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 14:48:27 +0100 Subject: [PATCH 1/4] [CC1101] Fixed setRxBandwidth() --- src/modules/CC1101/CC1101.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 06c9a98f..52305737 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -357,14 +357,14 @@ int16_t CC1101::setRxBandwidth(float rxBw) { for(int8_t e = 3; e >= 0; e--) { for(int8_t m = 3; m >= 0; m --) { float point = (CC1101_CRYSTAL_FREQ * 1000000.0)/(8 * (m + 4) * ((uint32_t)1 << e)); - if(abs((rxBw * 1000.0) - point) <= 0.001) { + if(abs((rxBw * 1000.0) - point) <= 1000) { // set Rx channel filter bandwidth return(SPIsetRegValue(CC1101_REG_MDMCFG4, (e << 6) | (m << 4), 7, 4)); } } } - return(ERR_UNKNOWN); + return(ERR_INVALID_RX_BANDWIDTH); } int16_t CC1101::setFrequencyDeviation(float freqDev) { From 13a77dff2adaa3e88335eb6949fdb9513e454d2d Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 14:49:41 +0100 Subject: [PATCH 2/4] [CC1101] Persist modulation change after it's asserted --- src/modules/CC1101/CC1101.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 52305737..b4af2d0d 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -566,24 +566,24 @@ int16_t CC1101::setOOK(bool enableOOK) { int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_ASK_OOK, 6, 4); RADIOLIB_ASSERT(state); - // update current modulation - _modulation = CC1101_MOD_FORMAT_ASK_OOK; - // PA_TABLE[0] is (by default) the power value used when transmitting a "0L". // Set PA_TABLE[1] to be used when transmitting a "1L". state = SPIsetRegValue(CC1101_REG_FREND0, 1, 2, 0); RADIOLIB_ASSERT(state); + + // update current modulation + _modulation = CC1101_MOD_FORMAT_ASK_OOK; } else { int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_2_FSK, 6, 4); RADIOLIB_ASSERT(state); - // update current modulation - _modulation = CC1101_MOD_FORMAT_2_FSK; - // Reset FREND0 to default value. state = SPIsetRegValue(CC1101_REG_FREND0, 0, 2, 0); RADIOLIB_ASSERT(state); + + // update current modulation + _modulation = CC1101_MOD_FORMAT_2_FSK; } // Update PA_TABLE values according to the new _modulation. From c0f5ef922c3d96c13f96bee20df5e272b71e340f Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 14:50:23 +0100 Subject: [PATCH 3/4] [CC1101] Update cached len value. --- src/modules/CC1101/CC1101.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index b4af2d0d..2884ee0d 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -792,6 +792,7 @@ int16_t CC1101::setPacketMode(uint8_t mode, uint8_t len) { RADIOLIB_ASSERT(state); // update the cached value + _packetLength = len; _packetLengthConfig = mode; return(state); } From 293fba2656794a3c8141455841b2d6ff70f5abb5 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 15:09:39 +0100 Subject: [PATCH 4/4] [CC1101] Added carrier sense as sync word qualifier --- src/modules/CC1101/CC1101.cpp | 21 ++++++++++++--------- src/modules/CC1101/CC1101.h | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 2884ee0d..380658bd 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -470,7 +470,7 @@ int16_t CC1101::setOutputPower(int8_t power) { } } -int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) { +int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits, bool requireCarrierSense) { if((maxErrBits > 1) || (len != 2)) { return(ERR_INVALID_SYNC_WORD); } @@ -485,7 +485,7 @@ int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) _syncWordLength = len; // enable sync word filtering - int16_t state = enableSyncWordFiltering(maxErrBits); + int16_t state = enableSyncWordFiltering(maxErrBits, requireCarrierSense); RADIOLIB_ASSERT(state); // set sync word register @@ -495,9 +495,9 @@ int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) return(state); } -int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits) { +int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits, bool requireCarrierSense) { uint8_t syncWord[] = { syncH, syncL }; - return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits)); + return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits, requireCarrierSense)); } int16_t CC1101::setPreambleLength(uint8_t preambleLength) { @@ -627,21 +627,24 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(setPacketMode(CC1101_LENGTH_CONFIG_VARIABLE, maxLen)); } -int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits) { +int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits, bool requireCarrierSense) { switch (maxErrBits){ case 0: // in 16 bit sync word, expect all 16 bits. - return (SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_16_16, 2, 0)); + return (SPIsetRegValue(CC1101_REG_MDMCFG2, + requireCarrierSense ? CC1101_SYNC_MODE_16_16_THR : CC1101_SYNC_MODE_16_16, 2, 0)); case 1: // in 16 bit sync word, expect at least 15 bits. - return (SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_15_16, 2, 0)); + return (SPIsetRegValue(CC1101_REG_MDMCFG2, + requireCarrierSense ? CC1101_SYNC_MODE_15_16_THR : CC1101_SYNC_MODE_15_16, 2, 0)); default: return (ERR_INVALID_SYNC_WORD); } } -int16_t CC1101::disableSyncWordFiltering() { - return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_NONE, 2, 0)); +int16_t CC1101::disableSyncWordFiltering(bool requireCarrierSense) { + return(SPIsetRegValue(CC1101_REG_MDMCFG2, + requireCarrierSense ? CC1101_SYNC_MODE_NONE_THR : CC1101_SYNC_MODE_NONE, 2, 0)); } int16_t CC1101::setCrcFiltering(bool crcOn) { diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 0d3e44d9..2486647f 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -709,9 +709,11 @@ class CC1101: public PhysicalLayer { \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes */ - int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0); + int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0, bool requireCarrierSense = false); /*! \brief Sets 1 or 2 bytes of sync word. @@ -722,9 +724,11 @@ class CC1101: public PhysicalLayer { \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes */ - int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0); + int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0, bool requireCarrierSense = false); /*! \brief Sets preamble length. @@ -808,16 +812,20 @@ class CC1101: public PhysicalLayer { \param numBits Sync word length in bits. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes */ - int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0); + int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0, bool requireCarrierSense = false); /*! \brief Disable preamble and sync word filtering and generation. + \param requireCarrierSense Require carrier sense above threshold. + \returns \ref status_codes */ - int16_t disableSyncWordFiltering(); + int16_t disableSyncWordFiltering(bool requireCarrierSense = false); /*! \brief Enable CRC filtering and generation.