diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 78eb172..c026d5f 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -373,6 +373,11 @@ void LoRaClass::setFrequency(long frequency) writeRegister(REG_FRF_LSB, (uint8_t)(frf >> 0)); } +int LoRaClass::getSpreadingFactor() +{ + return readRegister(REG_MODEM_CONFIG_2) >> 4; +} + void LoRaClass::setSpreadingFactor(int sf) { if (sf < 6) { @@ -390,6 +395,7 @@ void LoRaClass::setSpreadingFactor(int sf) } writeRegister(REG_MODEM_CONFIG_2, (readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0)); + setLdoFlag(); } long LoRaClass::getSignalBandwidth() @@ -397,15 +403,15 @@ long LoRaClass::getSignalBandwidth() byte bw = (readRegister(REG_MODEM_CONFIG_1) >> 4); switch (bw) { case 0: return 7.8E3; - case 1: return 10.4E3; - case 2: return 15.6E3; - case 3: return 20.8E3; - case 4: return 31.25E3; - case 5: return 41.7E3; - case 6: return 62.5E3; - case 7: return 125E3; - case 8: return 250E3; - case 9: return 500E3; + case 1: return 10.4E3; + case 2: return 15.6E3; + case 3: return 20.8E3; + case 4: return 31.25E3; + case 5: return 41.7E3; + case 6: return 62.5E3; + case 7: return 125E3; + case 8: return 250E3; + case 9: return 500E3; } } @@ -436,6 +442,20 @@ void LoRaClass::setSignalBandwidth(long sbw) } writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0x0f) | (bw << 4)); + setLdoFlag(); +} + +void LoRaClass::setLdoFlag() +{ + // Section 4.1.1.5 + long symbolDuration = 1000 / ( getSignalBandwidth() / (1L << getSpreadingFactor()) ) ; + + // Section 4.1.1.6 + boolean ldoOn = symbolDuration > 16; + + uint8_t config3 = readRegister(REG_MODEM_CONFIG_3); + bitWrite(config3, 3, ldoOn); + writeRegister(REG_MODEM_CONFIG_3, config3); } void LoRaClass::setCodingRate4(int denominator) diff --git a/src/LoRa.h b/src/LoRa.h index a7ec8ff..46c2880 100644 --- a/src/LoRa.h +++ b/src/LoRa.h @@ -72,8 +72,11 @@ private: void handleDio0Rise(); + int getSpreadingFactor(); long getSignalBandwidth(); + void setLdoFlag(); + uint8_t readRegister(uint8_t address); void writeRegister(uint8_t address, uint8_t value); uint8_t singleTransfer(uint8_t address, uint8_t value);