diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index daf2447d..54ce2222 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() { +uint8_t RF69::begin(float freq) { // set module properties _mod->init(USE_SPI, INT_0); @@ -36,10 +36,10 @@ uint8_t RF69::begin() { SPI.end(); return(ERR_CHIP_NOT_FOUND); } else { - DEBUG_PRINTLN_STR("Found RF69! (match by RF69_REG_VERSION == 0x12)"); + DEBUG_PRINTLN_STR("Found RF69! (match by RF69_REG_VERSION == 0x24)"); } - return(config()); + return(config(freq)); } uint8_t RF69::transmit(Packet& pack) { @@ -71,9 +71,7 @@ uint8_t RF69::transmit(Packet& pack) { _mod->SPIsetRegValue(RF69_REG_TEST_PA2, RF69_PA2_20_DBM); // wait for transmission end - while(!_mod->getInt0State()) { - DEBUG_PRINT('.'); - } + while(!_mod->getInt0State()); // clear interrupt flags clearIRQFlags(); @@ -131,9 +129,15 @@ uint8_t RF69::standby() { return(setMode(RF69_STANDBY)); } -uint8_t RF69::config() { +uint8_t RF69::config(float freq) { uint8_t status = ERR_NONE; + 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 status = setMode(RF69_STANDBY); if(status != ERR_NONE) { @@ -174,9 +178,11 @@ uint8_t RF69::config() { } //set carrier frequency - status = _mod->SPIsetRegValue(RF69_REG_FRF_MSB, RF69_FRF_MSB, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_FRF_MID, RF69_FRF_MID, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_FRF_LSB, RF69_FRF_LSB, 7, 0); + uint32_t 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); } @@ -245,10 +251,8 @@ uint8_t RF69::config() { } //set Rx timeouts - //status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START_OFF, 7, 0); - //status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH_OFF, 7, 0); + 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); } diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 118d600d..b3fee824 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -126,8 +126,8 @@ #define RF69_FDEV_LSB 0x33 // 7 0 //RF69_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB -#define RF69_FRF_MSB 0x6C // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19 -#define RF69_FRF_MID 0x40 // 7 0 where F(XOSC) = 32 MHz +#define RF69_FRF_MSB 0xE4 // 7 0 carrier frequency setting: f_RF = (F(XOSC) * FRF)/2^19 +#define RF69_FRF_MID 0xC0 // 7 0 where F(XOSC) = 32 MHz #define RF69_FRF_LSB 0x00 // 7 0 default value: 915 MHz //RF69_REG_OSC_1 @@ -318,8 +318,7 @@ #define RF69_IRQ_CRC_OK 0b00000010 // 1 1 CRC check passed //RF69_REG_RSSI_THRESH -//#define RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default) -#define RF69_RSSI_THRESHOLD 0xDC // 7 0 +#define RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default) //RF69_REG_RX_TIMEOUT_1 #define RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default) @@ -398,7 +397,6 @@ //RF69_REG_PACKET_CONFIG_2 #define RF69_INTER_PACKET_RX_DELAY 0b00000000 // 7 4 delay between FIFO empty and start of new RSSI phase -//#define RF69_INTER_PACKET_RX_DELAY 0b00010000 // 7 4 #define RF69_RESTART_RX 0b00000100 // 2 2 force receiver into wait mode #define RF69_AUTO_RX_RESTART_OFF 0b00000000 // 1 1 auto Rx restart disabled #define RF69_AUTO_RX_RESTART_ON 0b00000010 // 1 1 auto Rx restart enabled (default) @@ -427,17 +425,21 @@ class RF69 { public: RF69(Module* module); - uint8_t begin(); + uint8_t begin(float freq = 915.0); uint8_t transmit(Packet& pack); uint8_t receive(Packet& pack); uint8_t sleep(); uint8_t standby(); + + uint8_t setFrequency(float freq); private: Module* _mod; - uint8_t config(); + float _freq; + + uint8_t config(float freq); uint8_t setMode(uint8_t mode); void clearIRQFlags(); };