]> git.tnoah.ca Git - lora-radio.git/commitdiff
Fix final SX127X modulation parameter issues #39
authorjacob.eva <x00010@disroot.org>
Fri, 10 Jan 2025 21:31:03 +0000 (21:31 +0000)
committerjacob.eva <x00010@disroot.org>
Fri, 10 Jan 2025 21:31:03 +0000 (21:31 +0000)
Radio.cpp
Radio.hpp

index c84169ed4e7d42958e10e7dee94e185a57e5f06d..a8c4f2d2631e211fb4cb5360373e6cc2786ad67b 100644 (file)
--- a/Radio.cpp
+++ b/Radio.cpp
@@ -1162,23 +1162,28 @@ uint8_t ISR_VECT sx127x::singleTransfer(uint8_t address, uint8_t value) {
 
 int sx127x::begin() {
   if (_reset != -1) {
-    pinMode(_reset, OUTPUT);
+      pinMode(_reset, OUTPUT);
 
-    // Perform reset
-    digitalWrite(_reset, LOW);
-    delay(10);
-    digitalWrite(_reset, HIGH);
-    delay(10);
+      // Perform reset
+      digitalWrite(_reset, LOW);
+      delay(10);
+      digitalWrite(_reset, HIGH);
+      delay(10);
   }
 
+  sleep();
+
   if (_busy != -1) { pinMode(_busy, INPUT); }
 
   if (!_preinit_done) {
     if (!preInit()) { return false; }
   }
 
-  sleep();
   setFrequency(_frequency);
+  setSignalBandwidth(_bw);
+  setSpreadingFactor(_sf);
+  setCodingRate4(_cr);
+  setTxPower(_txp);
 
   // set base addresses
   writeRegister(REG_FIFO_TX_BASE_ADDR_7X, 0);
@@ -1190,7 +1195,6 @@ int sx127x::begin() {
 
   setSyncWord(SYNC_WORD_7X);
   enableCrc();
-  setTxPower(2);
 
   standby();
 
@@ -1201,10 +1205,8 @@ int sx127x::begin() {
 
 void sx127x::end() {
   sleep();
-  _spiModem->end();
   _bitrate = 0;
   _radio_online = false;
-  _preinit_done = false;
 }
 
 int sx127x::beginPacket(int implicitHeader) {
@@ -1377,7 +1379,7 @@ void sx127x::setTxPower(int level, int outputPin) {
 
     writeRegister(REG_PA_DAC_7X, 0x84);
     writeRegister(REG_PA_CONFIG_7X, 0x70 | level);
-
+    _txp = level;
   } else {
     if (level < 2) { level = 2; }
     else if (level > 17) { level = 17; }
@@ -1388,11 +1390,11 @@ void sx127x::setTxPower(int level, int outputPin) {
   }
 }
 
-//int8_t sx127x::getTxPower() { return readRegister(REG_PA_CONFIG_7X) - 126; }
-int8_t sx127x::getTxPower() { return _txp; }
+int8_t sx127x::getTxPower() { return readRegister(REG_PA_CONFIG_7X) - 126; }
 
 void sx127x::setFrequency(uint32_t frequency) {
   _frequency = frequency;
+
   uint32_t frf = ((uint64_t)frequency << 19) / 32000000;
 
   writeRegister(REG_FRF_MSB_7X, (uint8_t)(frf >> 16));
@@ -1403,35 +1405,23 @@ void sx127x::setFrequency(uint32_t frequency) {
 }
 
 uint32_t sx127x::getFrequency() {
-  uint8_t msb = readRegister(REG_FRF_MSB_7X);
-  uint8_t mid = readRegister(REG_FRF_MID_7X);
-  uint8_t lsb = readRegister(REG_FRF_LSB_7X);
-
-  uint32_t frf = ((uint32_t)msb << 16) | ((uint32_t)mid << 8) | (uint32_t)lsb;
-  uint64_t frm = (uint64_t)frf*32000000;
-  uint32_t frequency = (frm >> 19);
-
-  // TODO, figure out why frequency from module is slightly wrong
-  if (_frequency != frequency) {
-      return _frequency;
-  } else {
-      return frequency;
-  }
+  return _frequency;
 }
 
 void sx127x::setSpreadingFactor(int sf) {
   if (sf < 6) { sf = 6; }
   else if (sf > 12) { sf = 12; }
 
+  _sf = sf;
+
   if (sf == 6) {
-    writeRegister(REG_DETECTION_OPTIMIZE_7X, 0xc5);
-    writeRegister(REG_DETECTION_THRESHOLD_7X, 0x0c);
+      writeRegister(REG_DETECTION_OPTIMIZE_7X, 0xc5);
+      writeRegister(REG_DETECTION_THRESHOLD_7X, 0x0c);
   } else {
-    writeRegister(REG_DETECTION_OPTIMIZE_7X, 0xc3);
-    writeRegister(REG_DETECTION_THRESHOLD_7X, 0x0a);
+      writeRegister(REG_DETECTION_OPTIMIZE_7X, 0xc3);
+      writeRegister(REG_DETECTION_THRESHOLD_7X, 0x0a);
   }
 
-  _sf = sf;
 
   writeRegister(REG_MODEM_CONFIG_2_7X, (readRegister(REG_MODEM_CONFIG_2_7X) & 0x0f) | ((sf << 4) & 0xf0));
   handleLowDataRate();
@@ -1443,26 +1433,7 @@ uint8_t sx127x::getSpreadingFactor()
 }
 
 uint32_t sx127x::getSignalBandwidth() {
-    uint8_t bw;
-    if (_radio_online) {
-      bw = (readRegister(REG_MODEM_CONFIG_1_7X) >> 4);
-    } else {
-        bw = _bw;
-    }
-    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;
-    }
-
-    return 0;
+    return _bw;
 }
 
 void sx127x::setSignalBandwidth(uint32_t sbw) {
@@ -1490,7 +1461,7 @@ void sx127x::setSignalBandwidth(uint32_t sbw) {
   }
 
   writeRegister(REG_MODEM_CONFIG_1_7X, (readRegister(REG_MODEM_CONFIG_1_7X) & 0x0f) | (bw << 4));
-  _bw = bw;
+  _bw = sbw;
   handleLowDataRate();
   optimizeModemSensitivity();
 }
index 3ce4c450d81d4233c73d3eb4c27e5375efac7fbe..d21d620a856a68279ac3c1d688cb45e6905e2e8b 100644 (file)
--- a/Radio.hpp
+++ b/Radio.hpp
@@ -546,7 +546,7 @@ private:
   bool _preinit_done;
   uint8_t _sf;
   uint8_t _cr;
-  uint8_t _bw;
+  uint32_t _bw;
 };
 
 class sx128x : public RadioInterface {