From 1e9365ab492aadbd8f1749f6e580b6c09c3c2c05 Mon Sep 17 00:00:00 2001 From: Dontsov Evgeny Date: Thu, 31 May 2018 03:12:31 +0300 Subject: [PATCH 1/6] sx127x 20dBm support 2 --- src/LoRa.cpp | 33 +++++++++++++++++++++++++++++---- src/LoRa.h | 2 ++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 78eb172..66af347 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -10,6 +10,7 @@ #define REG_FRF_MID 0x07 #define REG_FRF_LSB 0x08 #define REG_PA_CONFIG 0x09 +#define REG_OCP 0x0b #define REG_LNA 0x0c #define REG_FIFO_ADDR_PTR 0x0d #define REG_FIFO_TX_BASE_ADDR 0x0e @@ -34,6 +35,7 @@ #define REG_SYNC_WORD 0x39 #define REG_DIO_MAPPING_1 0x40 #define REG_VERSION 0x42 +#define REG_PA_DAC 0x4d // modes #define MODE_LONG_RANGE_MODE 0x80 @@ -351,11 +353,22 @@ void LoRaClass::setTxPower(int level, int outputPin) writeRegister(REG_PA_CONFIG, 0x70 | level); } else { + // PA BOOST - if (level < 2) { - level = 2; - } else if (level > 17) { - level = 17; + if (level > 17) { + level = 17; + + // High Power +20 dBm Operation (Semtech SX1276/77/78/79 5.4.3.) + writeRegister(REG_PA_DAC, 0x87); + setOCP_sx127x(140); + } + else { + if (level < 2) { + level = 2; + } + //Default value PA_HF/LF or +17dBm + writeRegister(REG_PA_DAC, 0x84); + setOCP_sx127x(100); } writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2)); @@ -472,6 +485,18 @@ void LoRaClass::disableCrc() writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb); } +void LoRaClass::setOCP_sx127x(uint8_t mA) +{ + uint8_t ocpTrim = 27; + if (mA <= 120) { + ocpTrim = (mA - 45)/5; + } + else if (mA <=240) { + ocpTrim = (mA + 30)/10; + } + writeRegister(REG_OCP, 0x20 | (0x1F & ocpTrim)); +} + byte LoRaClass::random() { return readRegister(REG_RSSI_WIDEBAND); diff --git a/src/LoRa.h b/src/LoRa.h index a7ec8ff..0e02429 100644 --- a/src/LoRa.h +++ b/src/LoRa.h @@ -54,6 +54,8 @@ class LoRaClass : public Stream { void setSyncWord(int sw); void enableCrc(); void disableCrc(); + // Over Current Protection control (Semtech SX1276/77/78/79 5.4.4.) + void setOCP_sx127x(uint8_t mA); // deprecated void crc() { enableCrc(); } From aa39c1f039466ea43fff2de84b0d4f3ca974890e Mon Sep 17 00:00:00 2001 From: Dontsov Evgeny Date: Tue, 31 Jul 2018 02:28:40 +0300 Subject: [PATCH 2/6] support 20dBm --- API.md | 2 +- src/LoRa.cpp | 4 ++-- src/LoRa.h | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/API.md b/API.md index 0e4a8e9..bf5c9f8 100644 --- a/API.md +++ b/API.md @@ -236,7 +236,7 @@ LoRa.setTxPower(txPower, outputPin); * `txPower` - TX power in dB, defaults to `17` * `outputPin` - (optional) PA output pin, supported values are `PA_OUTPUT_RFO_PIN` and `PA_OUTPUT_PA_BOOST_PIN`, defaults to `PA_OUTPUT_PA_BOOST_PIN`. -Supported values are between `2` and `17` for `PA_OUTPUT_PA_BOOST_PIN`, `0` and `14` for `PA_OUTPUT_RFO_PIN`. +Supported values are `2` - `20` for `PA_OUTPUT_PA_BOOST_PIN`, `0` and `14` for `PA_OUTPUT_RFO_PIN`. Most modules have the PA output pin connected to PA BOOST, diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 66af347..4971cfb 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -360,7 +360,7 @@ void LoRaClass::setTxPower(int level, int outputPin) // High Power +20 dBm Operation (Semtech SX1276/77/78/79 5.4.3.) writeRegister(REG_PA_DAC, 0x87); - setOCP_sx127x(140); + setOCP(140); } else { if (level < 2) { @@ -368,7 +368,7 @@ void LoRaClass::setTxPower(int level, int outputPin) } //Default value PA_HF/LF or +17dBm writeRegister(REG_PA_DAC, 0x84); - setOCP_sx127x(100); + setOCP(100); } writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2)); diff --git a/src/LoRa.h b/src/LoRa.h index 0e02429..19afe1d 100644 --- a/src/LoRa.h +++ b/src/LoRa.h @@ -54,8 +54,7 @@ class LoRaClass : public Stream { void setSyncWord(int sw); void enableCrc(); void disableCrc(); - // Over Current Protection control (Semtech SX1276/77/78/79 5.4.4.) - void setOCP_sx127x(uint8_t mA); + void setOCP(uint8_t mA); // Over Current Protection control // deprecated void crc() { enableCrc(); } From 61e5af7a0714710564c67f1466f9db75c100fbe5 Mon Sep 17 00:00:00 2001 From: Dontsov Evgeny Date: Tue, 31 Jul 2018 02:30:34 +0300 Subject: [PATCH 3/6] support +20dDbm --- src/LoRa.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 4971cfb..4483818 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -485,7 +485,7 @@ void LoRaClass::disableCrc() writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb); } -void LoRaClass::setOCP_sx127x(uint8_t mA) +void LoRaClass::setOCP(uint8_t mA) { uint8_t ocpTrim = 27; if (mA <= 120) { From 91ea82c1415ccad5f371643b3f1b53775b24f5ab Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Mon, 6 Aug 2018 18:53:24 -0400 Subject: [PATCH 4/6] Update LoRa.cpp minor code styling --- src/LoRa.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 4483818..e998fe6 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -353,7 +353,6 @@ void LoRaClass::setTxPower(int level, int outputPin) writeRegister(REG_PA_CONFIG, 0x70 | level); } else { - // PA BOOST if (level > 17) { level = 17; @@ -361,8 +360,7 @@ void LoRaClass::setTxPower(int level, int outputPin) // High Power +20 dBm Operation (Semtech SX1276/77/78/79 5.4.3.) writeRegister(REG_PA_DAC, 0x87); setOCP(140); - } - else { + } else { if (level < 2) { level = 2; } @@ -488,12 +486,13 @@ void LoRaClass::disableCrc() void LoRaClass::setOCP(uint8_t mA) { uint8_t ocpTrim = 27; + if (mA <= 120) { - ocpTrim = (mA - 45)/5; - } - else if (mA <=240) { - ocpTrim = (mA + 30)/10; + ocpTrim = (mA - 45) / 5; + } else if (mA <=240) { + ocpTrim = (mA + 30) / 10; } + writeRegister(REG_OCP, 0x20 | (0x1F & ocpTrim)); } From 87a16d5426a0ae12dbedc65e618181c62ba93eb2 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Mon, 6 Aug 2018 18:55:07 -0400 Subject: [PATCH 5/6] Update API.md --- API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/API.md b/API.md index bf5c9f8..0a55f14 100644 --- a/API.md +++ b/API.md @@ -236,7 +236,7 @@ LoRa.setTxPower(txPower, outputPin); * `txPower` - TX power in dB, defaults to `17` * `outputPin` - (optional) PA output pin, supported values are `PA_OUTPUT_RFO_PIN` and `PA_OUTPUT_PA_BOOST_PIN`, defaults to `PA_OUTPUT_PA_BOOST_PIN`. -Supported values are `2` - `20` for `PA_OUTPUT_PA_BOOST_PIN`, `0` and `14` for `PA_OUTPUT_RFO_PIN`. +Supported values are `2` to `20` for `PA_OUTPUT_PA_BOOST_PIN`, and `0` to `14` for `PA_OUTPUT_RFO_PIN`. Most modules have the PA output pin connected to PA BOOST, From 53757255fd97e585aec30d8ec7812fe0986f5dff Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Mon, 6 Aug 2018 19:22:58 -0400 Subject: [PATCH 6/6] Update LoRa.cpp properly map TX power levels 18 and 19 --- src/LoRa.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/LoRa.cpp b/src/LoRa.cpp index e998fe6..5b793a1 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -355,7 +355,12 @@ void LoRaClass::setTxPower(int level, int outputPin) } else { // PA BOOST if (level > 17) { - level = 17; + if (level > 20) { + level = 20; + } + + // subtract 3 from level, so 18 - 20 maps to 15 - 17 + level -= 3; // High Power +20 dBm Operation (Semtech SX1276/77/78/79 5.4.3.) writeRegister(REG_PA_DAC, 0x87);