From 5c1e12e3107e798034006093eeab2e107adb91db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grome=C5=A1?= Date: Thu, 5 Jul 2018 15:39:02 +0200 Subject: [PATCH] RF69 - Added methods to set rx bandwidth and frequency deviation --- keywords.txt | 5 ++ src/TypeDef.h | 3 + src/modules/RF69.cpp | 162 +++++++++++++++++++++++++++++++++++++++---- src/modules/RF69.h | 27 ++++---- 4 files changed, 168 insertions(+), 29 deletions(-) diff --git a/keywords.txt b/keywords.txt index 6338be87..79039777 100644 --- a/keywords.txt +++ b/keywords.txt @@ -60,6 +60,8 @@ setFrequency KEYWORD2 setSyncWord KEYWORD2 setOutputPower KEYWORD2 setBitRate KEYWORD2 +setRxBandwidth KEYWORD2 +setFrequencyDeviation KEYWORD2 # ESP8266 join KEYWORD2 @@ -101,6 +103,9 @@ ERR_INVALID_OUTPUT_POWER LITERAL1 PREAMBLE_DETECTED LITERAL1 CHANNEL_FREE LITERAL1 ERR_INVALID_BIT_RATE LITERAL1 +ERR_INVALID_FREQUENCY_DEVIATION LITERAL1 +ERR_INVALID_BIT_RATE_BW_RATIO LITERAL1 +ERR_INVALID_RX_BANDWIDTH LITERAL1 ERR_AT_FAILED LITERAL1 ERR_URL_MALFORMED LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index c71c47f2..1427cf55 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -68,6 +68,9 @@ #define PREAMBLE_DETECTED 0x0D #define CHANNEL_FREE 0x0E #define ERR_INVALID_BIT_RATE 0x0F +#define ERR_INVALID_FREQUENCY_DEVIATION 0x10 +#define ERR_INVALID_BIT_RATE_BW_RATIO 0x11 +#define ERR_INVALID_RX_BANDWIDTH 0x12 // ESP8266 status codes #define ERR_AT_FAILED 0x01 diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index d7390945..29e131ce 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -4,7 +4,7 @@ RF69::RF69(Module* module) { _mod = module; } -uint8_t RF69::begin(float freq, uint32_t br) { +uint8_t RF69::begin(float freq, float br, float rxBw, float freqDev) { // set module properties _mod->init(USE_SPI, INT_0); @@ -39,7 +39,7 @@ uint8_t RF69::begin(float freq, uint32_t br) { DEBUG_PRINTLN_STR("Found RF69! (match by RF69_REG_VERSION == 0x24)"); } - return(config(freq, br)); + return(config(freq, br, rxBw, freqDev)); } uint8_t RF69::transmit(Packet& pack) { @@ -130,22 +130,38 @@ uint8_t RF69::standby() { } uint8_t RF69::setFrequency(float freq) { - uint8_t state = RF69::config(freq, _br); + uint8_t state = RF69::config(freq, RF69::_br, RF69::_rxBw, RF69::_freqDev); if(state == ERR_NONE) { RF69::_freq = freq; } return(state); } -uint8_t RF69::setBitRate(uint32_t br) { - uint8_t state = RF69::config(_freq, br); +uint8_t RF69::setBitRate(float br) { + uint8_t state = RF69::config(RF69::_freq, br, RF69::_rxBw, RF69::_freqDev); if(state == ERR_NONE) { RF69::_br = br; } return(state); } -uint8_t RF69::config(float freq, uint32_t br) { +uint8_t RF69::setRxBandwidth(float rxBw) { + uint8_t state = RF69::config(RF69::_freq, RF69::_br, rxBw, RF69::_freqDev); + if(state == ERR_NONE) { + RF69::_rxBw = rxBw; + } + return(state); +} + +uint8_t RF69::setFrequencyDeviation(float freqDev) { + uint8_t state = RF69::config(RF69::_freq, RF69::_br, RF69::_rxBw, freqDev); + if(state == ERR_NONE) { + RF69::_freqDev = freqDev; + } + return(state); +} + +uint8_t RF69::config(float freq, float br, float rxBw, float freqDev) { uint8_t status = ERR_NONE; // check supplied settings @@ -155,10 +171,18 @@ uint8_t RF69::config(float freq, uint32_t br) { return(ERR_INVALID_FREQUENCY); } - if((br < 1200) || (br > 300000)) { + if((br < 1.2) || (br > 300.0)) { return(ERR_INVALID_BIT_RATE); } + if(!(br < 2000 * rxBw)) { + return(ERR_INVALID_BIT_RATE_BW_RATIO); + } + + if(!((freqDev + br/2 <= 500) && (freqDev >= 0.6))) { + return(ERR_INVALID_FREQUENCY_DEVIATION); + } + //set mode to STANDBY status = setMode(RF69_STANDBY); if(status != ERR_NONE) { @@ -177,30 +201,32 @@ uint8_t RF69::config(float freq, uint32_t br) { return(status); } - //set data mode and modulation type + //set data mode, modulation type and shaping status = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_PACKET_MODE | RF69_FSK, 6, 3); - status = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_NO_SHAPING, 1, 0); + status = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_FSK_GAUSSIAN_0_3, 1, 0); if(status != ERR_NONE) { return(status); } //set bit rate - uint16_t bitRate = 32000000 / br; + uint16_t bitRate = 32000 / br; status = _mod->SPIsetRegValue(RF69_REG_BITRATE_MSB, (bitRate & 0xFF00) >> 8, 7, 0); status = _mod->SPIsetRegValue(RF69_REG_BITRATE_LSB, bitRate & 0x00FF, 7, 0); if(status != ERR_NONE) { return(status); } - //set allowed frequency deviation (5 kHz by default) - status = _mod->SPIsetRegValue(RF69_REG_FDEV_MSB, RF69_FDEV_MSB, 5, 0); - status = _mod->SPIsetRegValue(RF69_REG_FDEV_LSB, RF69_FDEV_LSB, 7, 0); + //set allowed frequency deviation + uint32_t base = 1; + uint32_t FDEV = (freqDev * (base << 19)) / 32000; + status = _mod->SPIsetRegValue(RF69_REG_FDEV_MSB, (FDEV & 0xFF00) >> 8, 5, 0); + status = _mod->SPIsetRegValue(RF69_REG_FDEV_LSB, FDEV & 0x00FF, 7, 0); if(status != ERR_NONE) { return(status); } //set carrier frequency - uint32_t base = 1; + base = 1; uint32_t FRF = (freq * (base << 19)) / 32.0; status = _mod->SPIsetRegValue(RF69_REG_FRF_MSB, (FRF & 0xFF0000) >> 16, 7, 0); status = _mod->SPIsetRegValue(RF69_REG_FRF_MID, (FRF & 0x00FF00) >> 8, 7, 0); @@ -210,7 +236,107 @@ uint8_t RF69::config(float freq, uint32_t br) { } //set Rx bandwidth - status = _mod->SPIsetRegValue(RF69_REG_RX_BW, RF69_DCC_FREQ | RF69_RX_BW_MANT_16 | RF69_RX_BW_EXP, 7, 0); + uint8_t bwMant, bwExp; + if((rxBw >= 2.6) && (rxBw < 2.825)) { + // RxBw = 2.6 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 7; + } else if((rxBw >= 2.825) && (rxBw < 3.5)) { + // RxBw = 3.1 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 7; + } else if((rxBw >= 3.5) && (rxBw < 4.55)) { + // RxBw = 3.9 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 7; + } else if((rxBw >= 4.55) && (rxBw < 5.75)) { + // RxBw = 5.2 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 6; + } else if((rxBw >= 5.75) && (rxBw < 7.05)) { + // RxBw = 6.3 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 6; + } else if((rxBw >= 7.05) && (rxBw < 9.1)) { + // RxBw = 7.8 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 6; + } else if((rxBw >= 9.1) && (rxBw < 11.45)) { + // RxBw = 10.4 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 5; + } else if((rxBw >= 11.45) && (rxBw < 14.05)) { + // RxBw = 12.5 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 5; + } else if((rxBw >= 14.05) && (rxBw < 18.2)) { + // RxBw = 15.6 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 5; + } else if((rxBw >= 18.2) && (rxBw < 22.9)) { + // RxBw = 20.8 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 4; + } else if((rxBw >= 22.9) && (rxBw < 28.15)) { + // RxBw = 25.0 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 4; + } else if((rxBw >= 28.15) && (rxBw < 36.5)) { + // RxBw = 31.3 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 4; + } else if((rxBw >= 36.5) && (rxBw < 45.85)) { + // RxBw = 41.7 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 3; + } else if((rxBw >= 45.85) && (rxBw < 56.25)) { + // RxBw = 50.0 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 3; + } else if((rxBw >= 56.25) && (rxBw < 72.9)) { + // RxBw = 62.5 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 3; + } else if((rxBw >= 72.9) && (rxBw < 91.65)) { + // RxBw = 83.3 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 2; + } else if((rxBw >= 91.65) && (rxBw < 112.5)) { + // RxBw = 100.0 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 2; + } else if((rxBw >= 112.5) && (rxBw < 145.85)) { + // RxBw = 125.0 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 2; + } else if((rxBw >= 145.85) && (rxBw < 183.35)) { + // RxBw = 166.7 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 1; + } else if((rxBw >= 183.35) && (rxBw < 225.0)) { + // RxBw = 200.0 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 1; + } else if((rxBw >= 225.0) && (rxBw < 291.65)) { + // RxBw = 250.0 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 1; + } else if((rxBw >= 291.65) && (rxBw < 366.65)) { + // RxBw = 333.3 kHz + bwMant = RF69_RX_BW_MANT_24; + bwExp = 0; + } else if((rxBw >= 366.65) && (rxBw < 450.0)) { + // RxBw = 400.0 kHz + bwMant = RF69_RX_BW_MANT_20; + bwExp = 0; + } else if((rxBw >= 450.0) && (rxBw <= 500.0)) { + // RxBw = 500.0 kHz + bwMant = RF69_RX_BW_MANT_16; + bwExp = 0; + } else { + return(ERR_INVALID_RX_BANDWIDTH); + } + status = _mod->SPIsetRegValue(RF69_REG_RX_BW, RF69_DCC_FREQ | bwMant | bwExp, 7, 0); if(status != ERR_NONE) { return(status); } @@ -285,6 +411,12 @@ uint8_t RF69::config(float freq, uint32_t br) { return(status); } + // configuration successful, save the new settings + RF69::_freq = freq; + RF69::_br = br; + RF69::_rxBw = rxBw; + RF69::_freqDev = freqDev; + return(ERR_NONE); } diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 1866328e..f773075b 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -114,16 +114,12 @@ #define RF69_OOK_FILTER_2BR 0b00000010 // 1 0 OOK modulation filter, f_cutoff = 2*BR //RF69_REG_BITRATE_MSB + REG_BITRATE_LSB -//#define RF69_BITRATE_MSB 0x1A // 7 0 bit rate setting: rate = F(XOSC) / BITRATE -//#define RF69_BITRATE_LSB 0x0B // 7 0 default value: 4.8 kbps -#define RF69_BITRATE_MSB 0x02 // 7 0 -#define RF69_BITRATE_LSB 0x40 // 7 0 +#define RF69_BITRATE_MSB 0x1A // 7 0 bit rate setting: rate = F(XOSC) / BITRATE +#define RF69_BITRATE_LSB 0x0B // 7 0 default value: 4.8 kbps 0x40 // 7 0 //RF69_REG_FDEV_MSB + REG_FDEV_LSB -//#define RF69_FDEV_MSB 0x00 // 5 0 frequency deviation: f_dev = f_step * FDEV -//#define RF69_FDEV_LSB 0x52 // 7 0 default value: 5 kHz -#define RF69_FDEV_MSB 0x03 // 5 0 -#define RF69_FDEV_LSB 0x33 // 7 0 +#define RF69_FDEV_MSB 0x00 // 5 0 frequency deviation: f_dev = f_step * FDEV +#define RF69_FDEV_LSB 0x52 // 7 0 default value: 5 kHz //RF69_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB #define RF69_FRF_MSB 0xE4 // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19 @@ -207,8 +203,7 @@ #define RF69_RX_BW_MANT_16 0b00000000 // 4 3 Channel filter bandwidth FSK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 2)) #define RF69_RX_BW_MANT_20 0b00001000 // 4 3 OOK: RxBw = F(XOSC)/(RxBwMant * 2^(RxBwExp + 3)) #define RF69_RX_BW_MANT_24 0b00010000 // 4 3 -//#define RF69_RX_BW_EXP 0b00000101 // 2 0 default RxBwExp value = 5 -#define RF69_RX_BW_EXP 0b00000010 // 2 0 +#define RF69_RX_BW_EXP 0b00000101 // 2 0 default RxBwExp value = 5 //RF69_REG_AFC_BW #define RF69_DCC_FREQ_AFC 0b10000000 // 7 5 default DccFreq parameter for AFC @@ -425,7 +420,7 @@ class RF69 { public: RF69(Module* module); - uint8_t begin(float freq = 434.0, uint32_t br = 48000); + uint8_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0); uint8_t transmit(Packet& pack); uint8_t receive(Packet& pack); @@ -433,15 +428,19 @@ class RF69 { uint8_t standby(); uint8_t setFrequency(float freq); - uint8_t setBitRate(uint32_t br); + uint8_t setBitRate(float br); + uint8_t setRxBandwidth(float rxBw); + uint8_t setFrequencyDeviation(float freqDev); private: Module* _mod; float _freq; - uint32_t _br; + float _br; + float _rxBw; + float _freqDev; - uint8_t config(float freq, uint32_t br); + uint8_t config(float freq, float br, float rxBw, float freqDev); uint8_t setMode(uint8_t mode); void clearIRQFlags(); };