RF69 - implemented carrier frequency change

This commit is contained in:
Jan Gromeš 2018-07-04 14:33:26 +02:00
parent cdecf9ec7e
commit cd2ae1883c
2 changed files with 27 additions and 21 deletions

View file

@ -4,7 +4,7 @@ RF69::RF69(Module* module) {
_mod = module; _mod = module;
} }
uint8_t RF69::begin() { uint8_t RF69::begin(float freq) {
// set module properties // set module properties
_mod->init(USE_SPI, INT_0); _mod->init(USE_SPI, INT_0);
@ -36,10 +36,10 @@ uint8_t RF69::begin() {
SPI.end(); SPI.end();
return(ERR_CHIP_NOT_FOUND); return(ERR_CHIP_NOT_FOUND);
} else { } 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) { 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); _mod->SPIsetRegValue(RF69_REG_TEST_PA2, RF69_PA2_20_DBM);
// wait for transmission end // wait for transmission end
while(!_mod->getInt0State()) { while(!_mod->getInt0State());
DEBUG_PRINT('.');
}
// clear interrupt flags // clear interrupt flags
clearIRQFlags(); clearIRQFlags();
@ -131,9 +129,15 @@ uint8_t RF69::standby() {
return(setMode(RF69_STANDBY)); return(setMode(RF69_STANDBY));
} }
uint8_t RF69::config() { uint8_t RF69::config(float freq) {
uint8_t status = ERR_NONE; 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 //set mode to STANDBY
status = setMode(RF69_STANDBY); status = setMode(RF69_STANDBY);
if(status != ERR_NONE) { if(status != ERR_NONE) {
@ -174,9 +178,11 @@ uint8_t RF69::config() {
} }
//set carrier frequency //set carrier frequency
status = _mod->SPIsetRegValue(RF69_REG_FRF_MSB, RF69_FRF_MSB, 7, 0); uint32_t base = 1;
status = _mod->SPIsetRegValue(RF69_REG_FRF_MID, RF69_FRF_MID, 7, 0); uint32_t FRF = (freq * (base << 19)) / 32.0;
status = _mod->SPIsetRegValue(RF69_REG_FRF_LSB, RF69_FRF_LSB, 7, 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) { if(status != ERR_NONE) {
return(status); return(status);
} }
@ -245,10 +251,8 @@ uint8_t RF69::config() {
} }
//set Rx timeouts //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, 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, 7, 0);
status = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH_OFF, 7, 0);
if(status != ERR_NONE) { if(status != ERR_NONE) {
return(status); return(status);
} }

View file

@ -126,8 +126,8 @@
#define RF69_FDEV_LSB 0x33 // 7 0 #define RF69_FDEV_LSB 0x33 // 7 0
//RF69_REG_FRF_MSB + REG_FRF_MID + REG_FRF_LSB //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_MSB 0xE4 // 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_MID 0xC0 // 7 0 where F(XOSC) = 32 MHz
#define RF69_FRF_LSB 0x00 // 7 0 default value: 915 MHz #define RF69_FRF_LSB 0x00 // 7 0 default value: 915 MHz
//RF69_REG_OSC_1 //RF69_REG_OSC_1
@ -318,8 +318,7 @@
#define RF69_IRQ_CRC_OK 0b00000010 // 1 1 CRC check passed #define RF69_IRQ_CRC_OK 0b00000010 // 1 1 CRC check passed
//RF69_REG_RSSI_THRESH //RF69_REG_RSSI_THRESH
//#define RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default) #define RF69_RSSI_THRESHOLD 0xE4 // 7 0 RSSI threshold level (2 dB by default)
#define RF69_RSSI_THRESHOLD 0xDC // 7 0
//RF69_REG_RX_TIMEOUT_1 //RF69_REG_RX_TIMEOUT_1
#define RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default) #define RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default)
@ -398,7 +397,6 @@
//RF69_REG_PACKET_CONFIG_2 //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 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_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_OFF 0b00000000 // 1 1 auto Rx restart disabled
#define RF69_AUTO_RX_RESTART_ON 0b00000010 // 1 1 auto Rx restart enabled (default) #define RF69_AUTO_RX_RESTART_ON 0b00000010 // 1 1 auto Rx restart enabled (default)
@ -427,17 +425,21 @@ class RF69 {
public: public:
RF69(Module* module); RF69(Module* module);
uint8_t begin(); uint8_t begin(float freq = 915.0);
uint8_t transmit(Packet& pack); uint8_t transmit(Packet& pack);
uint8_t receive(Packet& pack); uint8_t receive(Packet& pack);
uint8_t sleep(); uint8_t sleep();
uint8_t standby(); uint8_t standby();
uint8_t setFrequency(float freq);
private: private:
Module* _mod; Module* _mod;
uint8_t config(); float _freq;
uint8_t config(float freq);
uint8_t setMode(uint8_t mode); uint8_t setMode(uint8_t mode);
void clearIRQFlags(); void clearIRQFlags();
}; };