RF69 - Added methods to set rx bandwidth and frequency deviation

pull/1/head
Jan Gromeš 2018-07-05 15:39:02 +02:00
rodzic 0c3145dcbe
commit 5c1e12e310
4 zmienionych plików z 168 dodań i 29 usunięć

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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();
};