diff --git a/keywords.txt b/keywords.txt index 32dddce8..6338be87 100644 --- a/keywords.txt +++ b/keywords.txt @@ -59,6 +59,7 @@ setCodingRate KEYWORD2 setFrequency KEYWORD2 setSyncWord KEYWORD2 setOutputPower KEYWORD2 +setBitRate KEYWORD2 # ESP8266 join KEYWORD2 @@ -99,6 +100,7 @@ ERR_INVALID_FREQUENCY LITERAL1 ERR_INVALID_OUTPUT_POWER LITERAL1 PREAMBLE_DETECTED LITERAL1 CHANNEL_FREE LITERAL1 +ERR_INVALID_BIT_RATE LITERAL1 ERR_AT_FAILED LITERAL1 ERR_URL_MALFORMED LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index d3172549..c71c47f2 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -67,6 +67,7 @@ #define ERR_INVALID_OUTPUT_POWER 0x0C #define PREAMBLE_DETECTED 0x0D #define CHANNEL_FREE 0x0E +#define ERR_INVALID_BIT_RATE 0x0F // ESP8266 status codes #define ERR_AT_FAILED 0x01 diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 54ce2222..d7390945 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(float freq) { +uint8_t RF69::begin(float freq, uint32_t br) { // set module properties _mod->init(USE_SPI, INT_0); @@ -39,7 +39,7 @@ uint8_t RF69::begin(float freq) { DEBUG_PRINTLN_STR("Found RF69! (match by RF69_REG_VERSION == 0x24)"); } - return(config(freq)); + return(config(freq, br)); } uint8_t RF69::transmit(Packet& pack) { @@ -129,15 +129,36 @@ uint8_t RF69::standby() { return(setMode(RF69_STANDBY)); } -uint8_t RF69::config(float freq) { +uint8_t RF69::setFrequency(float freq) { + uint8_t state = RF69::config(freq, _br); + if(state == ERR_NONE) { + RF69::_freq = freq; + } + return(state); +} + +uint8_t RF69::setBitRate(uint32_t br) { + uint8_t state = RF69::config(_freq, br); + if(state == ERR_NONE) { + RF69::_br = br; + } + return(state); +} + +uint8_t RF69::config(float freq, uint32_t br) { 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 < 1200) || (br > 300000)) { + return(ERR_INVALID_BIT_RATE); + } + //set mode to STANDBY status = setMode(RF69_STANDBY); if(status != ERR_NONE) { @@ -163,9 +184,10 @@ uint8_t RF69::config(float freq) { return(status); } - //set bit rate (4.8 kbps by default) - status = _mod->SPIsetRegValue(RF69_REG_BITRATE_MSB, RF69_BITRATE_MSB, 7, 0); - status = _mod->SPIsetRegValue(RF69_REG_BITRATE_LSB, RF69_BITRATE_LSB, 7, 0); + //set bit rate + uint16_t bitRate = 32000000 / 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); } diff --git a/src/modules/RF69.h b/src/modules/RF69.h index b3fee824..1866328e 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -322,11 +322,11 @@ //RF69_REG_RX_TIMEOUT_1 #define RF69_TIMEOUT_RX_START_OFF 0x00 // 7 0 RSSI interrupt timeout disabled (default) -#define RF69_TIMEOUT_RX_START 0x70 // 7 0 timeout will occur if RSSI interrupt is not received +#define RF69_TIMEOUT_RX_START 0xFF // 7 0 timeout will occur if RSSI interrupt is not received //RF69_REG_RX_TIMEOUT_2 #define RF69_TIMEOUT_RSSI_THRESH_OFF 0x00 // 7 0 PayloadReady interrupt timeout disabled (default) -#define RF69_TIMEOUT_RSSI_THRESH 0x70 // 7 0 timeout will occur if PayloadReady interrupt is not received +#define RF69_TIMEOUT_RSSI_THRESH 0xFF // 7 0 timeout will occur if PayloadReady interrupt is not received //RF69_REG_PREAMBLE_MSB + REG_PREAMBLE_MSB #define RF69_PREAMBLE_MSB 0x00 // 7 0 2-byte preamble size value @@ -425,7 +425,7 @@ class RF69 { public: RF69(Module* module); - uint8_t begin(float freq = 915.0); + uint8_t begin(float freq = 434.0, uint32_t br = 48000); uint8_t transmit(Packet& pack); uint8_t receive(Packet& pack); @@ -433,13 +433,15 @@ class RF69 { uint8_t standby(); uint8_t setFrequency(float freq); + uint8_t setBitRate(uint32_t br); private: Module* _mod; float _freq; + uint32_t _br; - uint8_t config(float freq); + uint8_t config(float freq, uint32_t br); uint8_t setMode(uint8_t mode); void clearIRQFlags(); };