Skip to content

Commit 884769e

Browse files
dontsovcmcsandeepmistry
authored andcommitted
sx127x 20dBm support (#153)
1 parent 4db4095 commit 884769e

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

API.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ LoRa.setTxPower(txPower, outputPin);
249249
* `txPower` - TX power in dB, defaults to `17`
250250
* `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`.
251251

252-
Supported values are between `2` and `17` for `PA_OUTPUT_PA_BOOST_PIN`, `0` and `14` for `PA_OUTPUT_RFO_PIN`.
252+
Supported values are `2` to `20` for `PA_OUTPUT_PA_BOOST_PIN`, and `0` to `14` for `PA_OUTPUT_RFO_PIN`.
253253

254254
Most modules have the PA output pin connected to PA BOOST,
255255

src/LoRa.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define REG_FRF_MID 0x07
1111
#define REG_FRF_LSB 0x08
1212
#define REG_PA_CONFIG 0x09
13+
#define REG_OCP 0x0b
1314
#define REG_LNA 0x0c
1415
#define REG_FIFO_ADDR_PTR 0x0d
1516
#define REG_FIFO_TX_BASE_ADDR 0x0e
@@ -34,6 +35,7 @@
3435
#define REG_SYNC_WORD 0x39
3536
#define REG_DIO_MAPPING_1 0x40
3637
#define REG_VERSION 0x42
38+
#define REG_PA_DAC 0x4d
3739

3840
// modes
3941
#define MODE_LONG_RANGE_MODE 0x80
@@ -372,10 +374,24 @@ void LoRaClass::setTxPower(int level, int outputPin)
372374
writeRegister(REG_PA_CONFIG, 0x70 | level);
373375
} else {
374376
// PA BOOST
375-
if (level < 2) {
376-
level = 2;
377-
} else if (level > 17) {
378-
level = 17;
377+
if (level > 17) {
378+
if (level > 20) {
379+
level = 20;
380+
}
381+
382+
// subtract 3 from level, so 18 - 20 maps to 15 - 17
383+
level -= 3;
384+
385+
// High Power +20 dBm Operation (Semtech SX1276/77/78/79 5.4.3.)
386+
writeRegister(REG_PA_DAC, 0x87);
387+
setOCP(140);
388+
} else {
389+
if (level < 2) {
390+
level = 2;
391+
}
392+
//Default value PA_HF/LF or +17dBm
393+
writeRegister(REG_PA_DAC, 0x84);
394+
setOCP(100);
379395
}
380396

381397
writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2));
@@ -512,6 +528,19 @@ void LoRaClass::disableCrc()
512528
writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb);
513529
}
514530

531+
void LoRaClass::setOCP(uint8_t mA)
532+
{
533+
uint8_t ocpTrim = 27;
534+
535+
if (mA <= 120) {
536+
ocpTrim = (mA - 45) / 5;
537+
} else if (mA <=240) {
538+
ocpTrim = (mA + 30) / 10;
539+
}
540+
541+
writeRegister(REG_OCP, 0x20 | (0x1F & ocpTrim));
542+
}
543+
515544
byte LoRaClass::random()
516545
{
517546
return readRegister(REG_RSSI_WIDEBAND);

src/LoRa.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class LoRaClass : public Stream {
6666
void setSyncWord(int sw);
6767
void enableCrc();
6868
void disableCrc();
69+
void setOCP(uint8_t mA); // Over Current Protection control
6970

7071
// deprecated
7172
void crc() { enableCrc(); }

0 commit comments

Comments
 (0)