Merge branch 'master' into sx126x_txpower

This commit is contained in:
BarryPSmith 2019-11-10 09:13:57 -08:00
commit fedbbcf931
7 changed files with 219 additions and 40 deletions

View file

@ -88,6 +88,8 @@ setDataShaping KEYWORD2
setOOK KEYWORD2 setOOK KEYWORD2
setDataShapingOOK KEYWORD2 setDataShapingOOK KEYWORD2
setCRC KEYWORD2 setCRC KEYWORD2
variablePacketLengthMode KEYWORD2
fixedPacketLengthMode KEYWORD2
# RF69-specific # RF69-specific
setAESKey KEYWORD2 setAESKey KEYWORD2

View file

@ -3,6 +3,7 @@
CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_EXPONENT, CC1101_MAX_PACKET_LENGTH) { CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_EXPONENT, CC1101_MAX_PACKET_LENGTH) {
_mod = module; _mod = module;
_packetLengthQueried = false; _packetLengthQueried = false;
_packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE;
} }
int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
@ -20,15 +21,15 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po
flagFound = true; flagFound = true;
} else { } else {
#ifdef RADIOLIB_DEBUG #ifdef RADIOLIB_DEBUG
Serial.print(F("CC1101 not found! (")); RADIOLIB_DEBUG_PRINT(F("CC1101 not found! ("));
Serial.print(i + 1); RADIOLIB_DEBUG_PRINT(i + 1);
Serial.print(F(" of 10 tries) CC1101_REG_VERSION == ")); RADIOLIB_DEBUG_PRINT(F(" of 10 tries) CC1101_REG_VERSION == "));
char buffHex[7]; char buffHex[7];
sprintf(buffHex, "0x%04X", version); sprintf(buffHex, "0x%04X", version);
Serial.print(buffHex); RADIOLIB_DEBUG_PRINT(buffHex);
Serial.print(F(", expected 0x0014")); RADIOLIB_DEBUG_PRINT(F(", expected 0x0014"));
Serial.println(); RADIOLIB_DEBUG_PRINTLN();
#endif #endif
delay(1000); delay(1000);
i++; i++;
@ -55,26 +56,36 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state); return(state);
} }
// configure bitrate
state = setBitRate(br); state = setBitRate(br);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default RX bandwidth
state = setRxBandwidth(rxBw); state = setRxBandwidth(rxBw);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default frequency deviation
state = setFrequencyDeviation(freqDev); state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default TX output power
state = setOutputPower(power); state = setOutputPower(power);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
// flush FIFOs // flush FIFOs
SPIsendCommand(CC1101_CMD_FLUSH_RX); SPIsendCommand(CC1101_CMD_FLUSH_RX);
SPIsendCommand(CC1101_CMD_FLUSH_TX); SPIsendCommand(CC1101_CMD_FLUSH_TX);
@ -162,7 +173,7 @@ int16_t CC1101::receiveDirect() {
int16_t CC1101::packetMode() { int16_t CC1101::packetMode() {
int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL1, CC1101_CRC_AUTOFLUSH_OFF | CC1101_APPEND_STATUS_ON | CC1101_ADR_CHK_NONE, 3, 0); int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL1, CC1101_CRC_AUTOFLUSH_OFF | CC1101_APPEND_STATUS_ON | CC1101_ADR_CHK_NONE, 3, 0);
state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF | CC1101_PKT_FORMAT_NORMAL, 6, 4); state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF | CC1101_PKT_FORMAT_NORMAL, 6, 4);
state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON | CC1101_LENGTH_CONFIG_VARIABLE, 2, 0); state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON | _packetLengthConfig, 2, 0);
return(state); return(state);
} }
@ -192,8 +203,10 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
return(state); return(state);
} }
// write packet length // optionally write packet length
SPIwriteRegister(CC1101_REG_FIFO, len); if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) {
SPIwriteRegister(CC1101_REG_FIFO, len);
}
// check address filtering // check address filtering
uint8_t filter = SPIgetRegValue(CC1101_REG_PKTCTRL1, 1, 0); uint8_t filter = SPIgetRegValue(CC1101_REG_PKTCTRL1, 1, 0);
@ -477,13 +490,63 @@ uint8_t CC1101::getLQI() {
size_t CC1101::getPacketLength(bool update) { size_t CC1101::getPacketLength(bool update) {
if(!_packetLengthQueried && update) { if(!_packetLengthQueried && update) {
_packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) {
_packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO);
} else {
_packetLength = _mod->SPIreadRegister(CC1101_REG_PKTLEN);
}
_packetLengthQueried = true; _packetLengthQueried = true;
} }
return(_packetLength); return(_packetLength);
} }
int16_t CC1101::fixedPacketLengthMode(uint8_t len) {
if (len > CC1101_MAX_PACKET_LENGTH) {
return(ERR_PACKET_TOO_LONG);
}
// set to fixed packet length
int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_FIXED, 1, 0);
if (state != ERR_NONE) {
return(state);
}
// set length to register
state = SPIsetRegValue(CC1101_REG_PKTLEN, len);
if (state != ERR_NONE) {
return(state);
}
// all went well: cache the reg value
_packetLengthConfig = CC1101_LENGTH_CONFIG_FIXED;
return(state);
}
int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) {
if (maxLen > CC1101_MAX_PACKET_LENGTH) {
return(ERR_PACKET_TOO_LONG);
}
// set to fixed packet length
int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0);
if (state != ERR_NONE) {
return(state);
}
// set max length to register
state = SPIsetRegValue(CC1101_REG_PKTLEN, maxLen);
if (state != ERR_NONE) {
return(state);
}
// all went well: cache the reg value
_packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE;
return(state);
}
int16_t CC1101::config() { int16_t CC1101::config() {
// enable automatic frequency synthesizer calibration // enable automatic frequency synthesizer calibration
int16_t state = SPIsetRegValue(CC1101_REG_MCSM0, CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4); int16_t state = SPIsetRegValue(CC1101_REG_MCSM0, CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4);

View file

@ -739,6 +739,24 @@ class CC1101: public PhysicalLayer {
*/ */
size_t getPacketLength(bool update = true); 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 = CC1101_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 = CC1101_MAX_PACKET_LENGTH);
private: private:
Module* _mod; Module* _mod;
@ -748,6 +766,7 @@ class CC1101: public PhysicalLayer {
size_t _packetLength; size_t _packetLength;
bool _packetLengthQueried; bool _packetLengthQueried;
uint8_t _packetLengthConfig;
int16_t config(); int16_t config();
int16_t directMode(); int16_t directMode();

View file

@ -4,6 +4,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT,
_mod = module; _mod = module;
_tempOffset = 0; _tempOffset = 0;
_packetLengthQueried = false; _packetLengthQueried = false;
_packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE;
} }
int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
@ -19,15 +20,15 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
flagFound = true; flagFound = true;
} else { } else {
#ifdef RADIOLIB_DEBUG #ifdef RADIOLIB_DEBUG
Serial.print(F("RF69 not found! (")); RADIOLIB_DEBUG_PRINT(F("RF69 not found! ("));
Serial.print(i + 1); RADIOLIB_DEBUG_PRINT(i + 1);
Serial.print(F(" of 10 tries) RF69_REG_VERSION == ")); RADIOLIB_DEBUG_PRINT(F(" of 10 tries) RF69_REG_VERSION == "));
char buffHex[7]; char buffHex[7];
sprintf(buffHex, "0x%04X", version); sprintf(buffHex, "0x%04X", version);
Serial.print(buffHex); RADIOLIB_DEBUG_PRINT(buffHex);
Serial.print(F(", expected 0x0024")); RADIOLIB_DEBUG_PRINT(F(", expected 0x0024"));
Serial.println(); RADIOLIB_DEBUG_PRINTLN();
#endif #endif
delay(1000); delay(1000);
i++; i++;
@ -54,27 +55,37 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
return(state); return(state);
} }
// configure bitrate
_rxBw = 125.0; _rxBw = 125.0;
state = setBitRate(br); state = setBitRate(br);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default RX bandwidth
state = setRxBandwidth(rxBw); state = setRxBandwidth(rxBw);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default frequency deviation
state = setFrequencyDeviation(freqDev); state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default TX output power
state = setOutputPower(power); state = setOutputPower(power);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); 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 // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library
uint8_t syncWord[] = {0x2D, 0x01}; uint8_t syncWord[] = {0x2D, 0x01};
state = setSyncWord(syncWord, 2); state = setSyncWord(syncWord, 2);
@ -250,6 +261,11 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
// set packet length // set packet length
_mod->SPIwriteRegister(RF69_REG_FIFO, len); _mod->SPIwriteRegister(RF69_REG_FIFO, len);
// optionally write packet length
if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) {
_mod->SPIwriteRegister(RF69_REG_FIFO, len);
}
// check address filtering // check address filtering
uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1); uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1);
if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) { 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) { size_t RF69::getPacketLength(bool update) {
if(!_packetLengthQueried && update) { if(!_packetLengthQueried && update) {
_packetLength = _mod->SPIreadRegister(RF69_REG_FIFO); if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) {
_packetLength = _mod->SPIreadRegister(RF69_REG_FIFO);
} else {
_packetLength = _mod->SPIreadRegister(RF69_REG_PAYLOAD_LENGTH);
}
_packetLengthQueried = true; _packetLengthQueried = true;
} }
return(_packetLength); 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 RF69::config() {
int16_t state = ERR_NONE; int16_t state = ERR_NONE;

View file

@ -697,7 +697,7 @@ class RF69: public PhysicalLayer {
*/ */
int16_t getTemperature(); int16_t getTemperature();
/*! /*!
\brief Query modem for the packet length of received payload. \brief Query modem for the packet length of received payload.
\param update Update received packet length. Will return cached value when set to false. \param update Update received packet length. Will return cached value when set to false.
@ -706,6 +706,24 @@ class RF69: public PhysicalLayer {
*/ */
size_t getPacketLength(bool update = true); 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: protected:
Module* _mod; Module* _mod;
@ -715,6 +733,7 @@ class RF69: public PhysicalLayer {
size_t _packetLength; size_t _packetLength;
bool _packetLengthQueried; bool _packetLengthQueried;
uint8_t _packetLengthConfig;
int16_t config(); int16_t config();
int16_t directMode(); int16_t directMode();

View file

@ -18,15 +18,15 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
_chipRevision = version; _chipRevision = version;
} else { } else {
#ifdef RADIOLIB_DEBUG #ifdef RADIOLIB_DEBUG
Serial.print(F("SX127x not found! (")); RADIOLIB_DEBUG_PRINT(F("SX127x not found! ("));
Serial.print(i + 1); RADIOLIB_DEBUG_PRINT(i + 1);
Serial.print(F(" of 10 tries) SX127X_REG_VERSION == ")); RADIOLIB_DEBUG_PRINT(F(" of 10 tries) SX127X_REG_VERSION == "));
char buffHex[7]; char buffHex[7];
sprintf(buffHex, "0x%04X", version); sprintf(buffHex, "0x%04X", version);
Serial.print(buffHex); RADIOLIB_DEBUG_PRINT(buffHex);
Serial.print(F(", expected 0x0021 / 0x0022 / 0x0023")); RADIOLIB_DEBUG_PRINT(F(", expected 0x0021 / 0x0022 / 0x0023"));
Serial.println(); RADIOLIB_DEBUG_PRINTLN();
#endif #endif
delay(1000); delay(1000);
i++; i++;
@ -53,22 +53,26 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state); return(state);
} }
// configure bitrate
_rxBw = 125.0; _rxBw = 125.0;
state = setBitRate(br); state = setBitRate(br);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default RX bandwidth
state = setRxBandwidth(rxBw); state = setRxBandwidth(rxBw);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default frequency deviation
state = setFrequencyDeviation(freqDev); state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default TX output power
state = setOutputPower(power); state = setOutputPower(power);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
@ -81,6 +85,12 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state); return(state);
} }
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
// SX1231 V2a only // SX1231 V2a only
if(_chipRevision == SX1231_CHIP_REVISION_2_A) { if(_chipRevision == SX1231_CHIP_REVISION_2_A) {
// modify default OOK threshold value // modify default OOK threshold value

View file

@ -955,16 +955,16 @@ bool SX127x::findChip(uint8_t ver) {
flagFound = true; flagFound = true;
} else { } else {
#ifdef RADIOLIB_DEBUG #ifdef RADIOLIB_DEBUG
Serial.print(F("SX127x not found! (")); RADIOLIB_DEBUG_PRINT(F("SX127x not found! ("));
Serial.print(i + 1); RADIOLIB_DEBUG_PRINT(i + 1);
Serial.print(F(" of 10 tries) SX127X_REG_VERSION == ")); RADIOLIB_DEBUG_PRINT(F(" of 10 tries) SX127X_REG_VERSION == "));
char buffHex[5]; char buffHex[5];
sprintf(buffHex, "0x%02X", version); sprintf(buffHex, "0x%02X", version);
Serial.print(buffHex); RADIOLIB_DEBUG_PRINT(buffHex);
Serial.print(F(", expected 0x00")); RADIOLIB_DEBUG_PRINT(F(", expected 0x00"));
Serial.print(ver, HEX); RADIOLIB_DEBUG_PRINT(ver, HEX);
Serial.println(); RADIOLIB_DEBUG_PRINTLN();
#endif #endif
delay(1000); delay(1000);
i++; i++;
@ -1013,23 +1013,23 @@ void SX127x::clearFIFO(size_t count) {
#ifdef RADIOLIB_DEBUG #ifdef RADIOLIB_DEBUG
void SX127x::regDump() { void SX127x::regDump() {
Serial.println(); RADIOLIB_DEBUG_PRINTLN();
Serial.println(F("ADDR\tVALUE")); RADIOLIB_DEBUG_PRINTLN(F("ADDR\tVALUE"));
for(uint16_t addr = 0x01; addr <= 0x70; addr++) { for(uint16_t addr = 0x01; addr <= 0x70; addr++) {
if(addr <= 0x0F) { if(addr <= 0x0F) {
Serial.print(F("0x0")); RADIOLIB_DEBUG_PRINT(F("0x0"));
} else { } else {
Serial.print(F("0x")); RADIOLIB_DEBUG_PRINT(F("0x"));
} }
Serial.print(addr, HEX); RADIOLIB_DEBUG_PRINT(addr, HEX);
Serial.print('\t'); RADIOLIB_DEBUG_PRINT('\t');
uint8_t val = _mod->SPIreadRegister(addr); uint8_t val = _mod->SPIreadRegister(addr);
if(val <= 0x0F) { if(val <= 0x0F) {
Serial.print(F("0x0")); RADIOLIB_DEBUG_PRINT(F("0x0"));
} else { } else {
Serial.print(F("0x")); RADIOLIB_DEBUG_PRINT(F("0x"));
} }
Serial.println(val, HEX); RADIOLIB_DEBUG_PRINTLN(val, HEX);
delay(50); delay(50);
} }