RF69 - Updated setting system

pull/1/head
Jan Gromeš 2018-07-07 09:20:48 +02:00
rodzic 5335280288
commit 61c8e07d17
2 zmienionych plików z 217 dodań i 217 usunięć

Wyświetl plik

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

Wyświetl plik

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