From 61c8e07d179b17b9962ddf040758ccc2105ac05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grome=C5=A1?= Date: Sat, 7 Jul 2018 09:20:48 +0200 Subject: [PATCH] RF69 - Updated setting system --- src/modules/RF69.cpp | 432 +++++++++++++++++++++---------------------- src/modules/RF69.h | 2 +- 2 files changed, 217 insertions(+), 217 deletions(-) diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 29e131ce..49e61602 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -39,7 +39,35 @@ uint8_t RF69::begin(float freq, float br, float rxBw, float freqDev) { DEBUG_PRINTLN_STR("Found RF69! (match by RF69_REG_VERSION == 0x24)"); } - return(config(freq, br, rxBw, freqDev)); + // configure settings not accessible by API + uint8_t state = config(); + if(state != ERR_NONE) { + return(state); + } + + // configure publicly accessible settings + state = setFrequency(freq); + if(state != ERR_NONE) { + return(state); + } + + _rxBw = 125.0; + state = setBitRate(br); + if(state != ERR_NONE) { + return(state); + } + + state = setRxBandwidth(rxBw); + if(state != ERR_NONE) { + return(state); + } + + state = setFrequencyDeviation(freqDev); + if(state != ERR_NONE) { + return(state); + } + + return(ERR_NONE); } uint8_t RF69::transmit(Packet& pack) { @@ -130,7 +158,22 @@ uint8_t RF69::standby() { } uint8_t RF69::setFrequency(float freq) { - uint8_t state = RF69::config(freq, RF69::_br, RF69::_rxBw, RF69::_freqDev); + // check allowed frequency range + if(!((freq > 290.0) && (freq < 340.0) || + (freq > 431.0) && (freq < 510.0) || + (freq > 862.0) && (freq < 1020.0))) { + return(ERR_INVALID_FREQUENCY); + } + + // set mode to standby + setMode(RF69_STANDBY); + + //set carrier frequency + uint32_t base = 1; + uint32_t FRF = (freq * (base << 19)) / 32.0; + uint8_t state = _mod->SPIsetRegValue(RF69_REG_FRF_MSB, (FRF & 0xFF0000) >> 16, 7, 0); + state |= _mod->SPIsetRegValue(RF69_REG_FRF_MID, (FRF & 0x00FF00) >> 8, 7, 0); + state |= _mod->SPIsetRegValue(RF69_REG_FRF_LSB, FRF & 0x0000FF, 7, 0); if(state == ERR_NONE) { RF69::_freq = freq; } @@ -138,7 +181,23 @@ uint8_t RF69::setFrequency(float freq) { } uint8_t RF69::setBitRate(float br) { - uint8_t state = RF69::config(RF69::_freq, br, RF69::_rxBw, RF69::_freqDev); + // check allowed bitrate + if((br < 1.2) || (br > 300.0)) { + return(ERR_INVALID_BIT_RATE); + } + + // check bitrate-bandwidth ratio + if(!(br < 2000 * _rxBw)) { + return(ERR_INVALID_BIT_RATE_BW_RATIO); + } + + // set mode to standby + setMode(RF69_STANDBY); + + // set bit rate + uint16_t bitRate = 32000 / br; + uint8_t state = _mod->SPIsetRegValue(RF69_REG_BITRATE_MSB, (bitRate & 0xFF00) >> 8, 7, 0); + state |= _mod->SPIsetRegValue(RF69_REG_BITRATE_LSB, bitRate & 0x00FF, 7, 0); if(state == ERR_NONE) { RF69::_br = br; } @@ -146,7 +205,94 @@ uint8_t RF69::setBitRate(float br) { } uint8_t RF69::setRxBandwidth(float rxBw) { - uint8_t state = RF69::config(RF69::_freq, RF69::_br, rxBw, RF69::_freqDev); + // check bitrate-bandwidth ratio + if(!(_br < 2000 * rxBw)) { + return(ERR_INVALID_BIT_RATE_BW_RATIO); + } + + // check allowed bandwidth values + uint8_t bwMant, bwExp; + if(rxBw == 2.6) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 7; + } else if(rxBw == 3.1) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 7; + } else if(rxBw == 3.9) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 7; + } else if(rxBw == 5.2) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 6; + } else if(rxBw == 6.3) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 6; + } else if(rxBw == 7.8) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 6; + } else if(rxBw == 10.4) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 5; + } else if(rxBw == 12.5) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 5; + } else if(rxBw == 15.6) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 5; + } else if(rxBw == 20.8) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 4; + } else if(rxBw == 25.0) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 4; + } else if(rxBw == 31.3) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 4; + } else if(rxBw == 41.7) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 3; + } else if(rxBw == 50.0) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 3; + } else if(rxBw == 62.5) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 3; + } else if(rxBw == 83.3) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 2; + } else if(rxBw == 100.0) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 2; + } else if(rxBw == 125.0) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 2; + } else if(rxBw == 166.7) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 1; + } else if(rxBw == 200.0) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 1; + } else if(rxBw == 250.0) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 1; + } else if(rxBw == 333.3) { + bwMant = RF69_RX_BW_MANT_24; + bwExp = 0; + } else if(rxBw == 400.0) { + bwMant = RF69_RX_BW_MANT_20; + bwExp = 0; + } else if(rxBw == 500.0) { + bwMant = RF69_RX_BW_MANT_16; + bwExp = 0; + } else { + return(ERR_INVALID_RX_BANDWIDTH); + } + + // set mode to standby + setMode(RF69_STANDBY); + + // set Rx bandwidth + uint8_t state = _mod->SPIsetRegValue(RF69_REG_RX_BW, RF69_DCC_FREQ | bwMant | bwExp, 7, 0); if(state == ERR_NONE) { RF69::_rxBw = rxBw; } @@ -154,269 +300,123 @@ uint8_t RF69::setRxBandwidth(float rxBw) { } uint8_t RF69::setFrequencyDeviation(float freqDev) { - uint8_t state = RF69::config(RF69::_freq, RF69::_br, RF69::_rxBw, freqDev); + // check frequency deviation range + if(!((freqDev + _br/2 <= 500) && (freqDev >= 0.6))) { + return(ERR_INVALID_FREQUENCY_DEVIATION); + } + + // set mode to standby + setMode(RF69_STANDBY); + + //set allowed frequency deviation + uint32_t base = 1; + uint32_t FDEV = (freqDev * (base << 19)) / 32000; + uint8_t state = _mod->SPIsetRegValue(RF69_REG_FDEV_MSB, (FDEV & 0xFF00) >> 8, 5, 0); + state |= _mod->SPIsetRegValue(RF69_REG_FDEV_LSB, FDEV & 0x00FF, 7, 0); 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 - if(!((freq > 290.0) && (freq < 340.0) || - (freq > 431.0) && (freq < 510.0) || - (freq > 862.0) && (freq < 1020.0))) { - return(ERR_INVALID_FREQUENCY); - } - - 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); - } - +uint8_t RF69::config() { + uint8_t state = ERR_NONE; + //set mode to STANDBY - status = setMode(RF69_STANDBY); - if(status != ERR_NONE) { - return(status); + state = setMode(RF69_STANDBY); + if(state != ERR_NONE) { + return(state); } //set operation modes - status = _mod->SPIsetRegValue(RF69_REG_OP_MODE, RF69_SEQUENCER_ON | RF69_LISTEN_OFF, 7, 6); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_OP_MODE, RF69_SEQUENCER_ON | RF69_LISTEN_OFF, 7, 6); + if(state != ERR_NONE) { + return(state); } //enable over-current protection - status = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON, 4, 4); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON, 4, 4); + if(state != ERR_NONE) { + return(state); } //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_FSK_GAUSSIAN_0_3, 1, 0); - if(status != ERR_NONE) { - return(status); - } - - //set bit rate - 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 - 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 - 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); - status = _mod->SPIsetRegValue(RF69_REG_FRF_LSB, FRF & 0x0000FF, 7, 0); - if(status != ERR_NONE) { - return(status); - } - - //set Rx bandwidth - 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); + state = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_PACKET_MODE | RF69_FSK, 6, 3); + state |= _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_FSK_GAUSSIAN_0_3, 1, 0); + if(state != ERR_NONE) { + return(state); } //set RSSI threshold - status = _mod->SPIsetRegValue(RF69_REG_RSSI_THRESH, RF69_RSSI_THRESHOLD, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_RSSI_THRESH, RF69_RSSI_THRESHOLD, 7, 0); + if(state != ERR_NONE) { + return(state); } //reset FIFO flags - status = _mod->SPIsetRegValue(RF69_REG_IRQ_FLAGS_2, RF69_IRQ_FIFO_OVERRUN, 4, 4); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_IRQ_FLAGS_2, RF69_IRQ_FIFO_OVERRUN, 4, 4); + if(state != ERR_NONE) { + return(state); } //disable ClkOut on DIO5 - status = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_2, RF69_CLK_OUT_OFF, 2, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_2, RF69_CLK_OUT_OFF, 2, 0); + if(state != ERR_NONE) { + return(state); } //set synchronization - status = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_ON | RF69_FIFO_FILL_CONDITION_SYNC | RF69_SYNC_SIZE | RF69_SYNC_TOL, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_ON | RF69_FIFO_FILL_CONDITION_SYNC | RF69_SYNC_SIZE | RF69_SYNC_TOL, 7, 0); + if(state != ERR_NONE) { + return(state); } //set sync word - status = _mod->SPIsetRegValue(RF69_REG_SYNC_VALUE_1, 0x2D, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_SYNC_VALUE_2, 100, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_SYNC_VALUE_1, 0x2D, 7, 0); + state |= _mod->SPIsetRegValue(RF69_REG_SYNC_VALUE_2, 100, 7, 0); + if(state != ERR_NONE) { + return(state); } //set packet configuration and disable encryption - status = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE | RF69_DC_FREE_NONE | RF69_CRC_ON | RF69_CRC_AUTOCLEAR_ON | RF69_ADDRESS_FILTERING_OFF, 7, 1); - status = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_INTER_PACKET_RX_DELAY, 7, 4); - status = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_AUTO_RX_RESTART_ON | RF69_AES_OFF, 1, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE | RF69_DC_FREE_NONE | RF69_CRC_ON | RF69_CRC_AUTOCLEAR_ON | RF69_ADDRESS_FILTERING_OFF, 7, 1); + state |= _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_INTER_PACKET_RX_DELAY, 7, 4); + state |= _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_AUTO_RX_RESTART_ON | RF69_AES_OFF, 1, 0); + if(state != ERR_NONE) { + return(state); } //set payload length - status = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, RF69_PAYLOAD_LENGTH, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, RF69_PAYLOAD_LENGTH, 7, 0); + if(state != ERR_NONE) { + return(state); } //set FIFO threshold - status = _mod->SPIsetRegValue(RF69_REG_FIFO_THRESH, RF69_TX_START_CONDITION_FIFO_NOT_EMPTY | RF69_FIFO_THRESHOLD, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_FIFO_THRESH, RF69_TX_START_CONDITION_FIFO_NOT_EMPTY | RF69_FIFO_THRESHOLD, 7, 0); + if(state != ERR_NONE) { + return(state); } //set output power - status = _mod->SPIsetRegValue(RF69_REG_PA_LEVEL, RF69_PA0_ON | RF69_PA1_OFF | RF69_PA2_OFF | RF69_OUTPUT_POWER, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_PA_LEVEL, RF69_PA0_ON | RF69_PA1_OFF | RF69_PA2_OFF | RF69_OUTPUT_POWER, 7, 0); + if(state != ERR_NONE) { + return(state); } //set Rx timeouts - status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START, 7, 0); + state = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH, 7, 0); + if(state != ERR_NONE) { + return(state); } //enable improved fading margin - status = _mod->SPIsetRegValue(RF69_REG_TEST_DAGC, RF69_CONTINUOUS_DAGC_LOW_BETA_OFF, 7, 0); - if(status != ERR_NONE) { - return(status); + state = _mod->SPIsetRegValue(RF69_REG_TEST_DAGC, RF69_CONTINUOUS_DAGC_LOW_BETA_OFF, 7, 0); + if(state != ERR_NONE) { + return(state); } - // 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 f773075b..4e687c83 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -440,7 +440,7 @@ class RF69 { float _rxBw; float _freqDev; - uint8_t config(float freq, float br, float rxBw, float freqDev); + uint8_t config(); uint8_t setMode(uint8_t mode); void clearIRQFlags(); };