Variable/fixed packet length mode config for RF69/SX1231

This commit is contained in:
Federico Maggi 2019-11-08 16:43:23 +01:00
parent f44f6ffb56
commit a5295432d7
3 changed files with 97 additions and 2 deletions

View file

@ -4,6 +4,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT,
_mod = module;
_tempOffset = 0;
_packetLengthQueried = false;
_packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE;
}
int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
@ -54,27 +55,37 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
return(state);
}
// configure bitrate
_rxBw = 125.0;
state = setBitRate(br);
if(state != ERR_NONE) {
return(state);
}
// configure default RX bandwidth
state = setRxBandwidth(rxBw);
if(state != ERR_NONE) {
return(state);
}
// configure default frequency deviation
state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) {
return(state);
}
// configure default TX output power
state = setOutputPower(power);
if(state != ERR_NONE) {
return(state);
}
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
// default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library
uint8_t syncWord[] = {0x2D, 0x01};
state = setSyncWord(syncWord, 2);
@ -250,6 +261,11 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
// set packet length
_mod->SPIwriteRegister(RF69_REG_FIFO, len);
// optionally write packet length
if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) {
SPIwriteRegister(RF69_REG_FIFO, len);
}
// check address filtering
uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1);
if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) {
@ -563,13 +579,63 @@ int16_t RF69::getTemperature() {
size_t RF69::getPacketLength(bool update) {
if(!_packetLengthQueried && update) {
if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) {
_packetLength = _mod->SPIreadRegister(RF69_REG_FIFO);
} else {
_packetLength = _mod->SPIreadRegister(RF69_REG_PAYLOAD_LENGTH);
}
_packetLengthQueried = true;
}
return(_packetLength);
}
int16_t RF69::fixedPacketLengthMode(uint8_t len) {
if (len > RF69_MAX_PACKET_LENGTH) {
return(ERR_PACKET_TOO_LONG);
}
// set to fixed packet length
int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_FIXED, 7, 7);
if (state != ERR_NONE) {
return(state);
}
// set length to register
state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len);
if (state != ERR_NONE) {
return(state);
}
// all went well: cache the reg value
_packetLengthConfig = RF69_PACKET_FORMAT_FIXED;
return(state);
}
int16_t RF69::variablePacketLengthMode(uint8_t maxLen) {
if (maxLen > RF69_MAX_PACKET_LENGTH) {
return(ERR_PACKET_TOO_LONG);
}
// set to variable packet length
int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE, 7, 7);
if (state != ERR_NONE) {
return(state);
}
// set max length to register
state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, maxLen);
if (state != ERR_NONE) {
return(state);
}
// all went well: cache the reg value
_packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE;
return(state);
}
int16_t RF69::config() {
int16_t state = ERR_NONE;

View file

@ -706,6 +706,24 @@ class RF69: public PhysicalLayer {
*/
size_t getPacketLength(bool update = true);
/*!
\brief Set modem in fixed packet length mode.
\param len Packet length.
\returns \ref status_codes
*/
int16_t fixedPacketLengthMode(uint8_t len = RF69_MAX_PACKET_LENGTH);
/*!
\brief Set modem in variable packet length mode.
\param len Maximum packet length.
\returns \ref status_codes
*/
int16_t variablePacketLengthMode(uint8_t maxLen = RF69_MAX_PACKET_LENGTH);
protected:
Module* _mod;
@ -715,6 +733,7 @@ class RF69: public PhysicalLayer {
size_t _packetLength;
bool _packetLengthQueried;
uint8_t _packetLengthConfig;
int16_t config();
int16_t directMode();

View file

@ -53,22 +53,26 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state);
}
// configure bitrate
_rxBw = 125.0;
state = setBitRate(br);
if(state != ERR_NONE) {
return(state);
}
// configure default RX bandwidth
state = setRxBandwidth(rxBw);
if(state != ERR_NONE) {
return(state);
}
// configure default frequency deviation
state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) {
return(state);
}
// configure default TX output power
state = setOutputPower(power);
if(state != ERR_NONE) {
return(state);
@ -81,6 +85,12 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state);
}
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
// SX1231 V2a only
if(_chipRevision == SX1231_CHIP_REVISION_2_A) {
// modify default OOK threshold value