Skip to content

Commit 447fb11

Browse files
committed
Hold GC1109 PA_POWER during deep sleep for LNA RX wake
The GC1109 FEM needs its VFEM_Ctrl pin held HIGH during deep sleep to keep the LNA active, enabling proper RX sensitivity for wake-on-packet. Without this, the LNA is unpowered during sleep and RX wake sensitivity is degraded by ~17dB. Release RTC holds in begin() after configuring GPIO registers (not before) to ensure glitch-free pin transitions on wake. Trade-off: ~6.5mA additional sleep current for significantly improved wake-on-packet range.
1 parent 06ab9f7 commit 447fb11

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ void HeltecTrackerV2Board::begin() {
66
pinMode(PIN_ADC_CTRL, OUTPUT);
77
digitalWrite(PIN_ADC_CTRL, LOW); // Initially inactive
88

9+
// Set up digital GPIO registers before releasing RTC hold. The hold latches
10+
// the pad state including function select, so register writes accumulate
11+
// without affecting the pad. On hold release, all changes apply atomically
12+
// (IO MUX switches to digital GPIO with output already HIGH — no glitch).
913
pinMode(P_LORA_PA_POWER, OUTPUT);
1014
digitalWrite(P_LORA_PA_POWER,HIGH);
15+
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_POWER);
1116

12-
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
1317
pinMode(P_LORA_PA_EN, OUTPUT);
1418
digitalWrite(P_LORA_PA_EN,HIGH);
19+
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
1520
pinMode(P_LORA_PA_TX_EN, OUTPUT);
1621
digitalWrite(P_LORA_PA_TX_EN,LOW);
1722

@@ -48,7 +53,9 @@ void HeltecTrackerV2Board::begin() {
4853

4954
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
5055

51-
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN); //It also needs to be enabled in receive mode
56+
// Hold GC1109 FEM pins during sleep to keep LNA active for RX wake
57+
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER);
58+
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN);
5259

5360
if (pin_wake_btn < 0) {
5461
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet

variants/heltec_tracker_v2/platformio.ini

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ build_flags =
1717
-D P_LORA_SCLK=9
1818
-D P_LORA_MISO=11
1919
-D P_LORA_MOSI=10
20-
-D P_LORA_PA_POWER=7 ;power en
21-
-D P_LORA_PA_EN=4
22-
-D P_LORA_PA_TX_EN=46 ;enable tx
23-
-D LORA_TX_POWER=10 ;If it is configured as 10 here, the final output will be 22 dbm.
24-
-D MAX_LORA_TX_POWER=22 ;Max SX1262 output
20+
-D P_LORA_PA_POWER=7 ; VFEM_Ctrl - GC1109 LDO power enable
21+
-D P_LORA_PA_EN=4 ; CSD - GC1109 chip enable (HIGH=on)
22+
-D P_LORA_PA_TX_EN=46 ; CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
23+
-D LORA_TX_POWER=10 ; 10dBm + ~11dB GC1109 gain = ~21dBm output
24+
-D MAX_LORA_TX_POWER=22 ; Max SX1262 output -> ~28dBm at antenna
2525
-D SX126X_DIO2_AS_RF_SWITCH=true
2626
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
2727
-D SX126X_CURRENT_LIMIT=140

variants/heltec_v4/HeltecV4Board.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ void HeltecV4Board::begin() {
77
pinMode(PIN_ADC_CTRL, OUTPUT);
88
digitalWrite(PIN_ADC_CTRL, LOW); // Initially inactive
99

10+
// Set up digital GPIO registers before releasing RTC hold. The hold latches
11+
// the pad state including function select, so register writes accumulate
12+
// without affecting the pad. On hold release, all changes apply atomically
13+
// (IO MUX switches to digital GPIO with output already HIGH — no glitch).
1014
pinMode(P_LORA_PA_POWER, OUTPUT);
1115
digitalWrite(P_LORA_PA_POWER,HIGH);
16+
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_POWER);
1217

13-
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
1418
pinMode(P_LORA_PA_EN, OUTPUT);
1519
digitalWrite(P_LORA_PA_EN,HIGH);
20+
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
1621
pinMode(P_LORA_PA_TX_EN, OUTPUT);
1722
digitalWrite(P_LORA_PA_TX_EN,LOW);
1823

@@ -50,7 +55,9 @@ void HeltecV4Board::begin() {
5055

5156
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
5257

53-
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN); //It also needs to be enabled in receive mode
58+
// Hold GC1109 FEM pins during sleep to keep LNA active for RX wake
59+
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER);
60+
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN);
5461

5562
if (pin_wake_btn < 0) {
5663
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet

0 commit comments

Comments
 (0)