Skip to content

Commit 044505d

Browse files
committed
Fix handling RX/TX for Hetlec v4 FEM
The root cause was that RadioLib didn't know about the external GC1109 RF switch. Without the SX126X_RXEN/TXEN definitions, RadioLib never called setRfSwitchPins(), so it couldn't automatically manage PA_TX_EN during RX/TX transitions.
1 parent 0c3fb91 commit 044505d

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

variants/heltec_v4/HeltecV4Board.cpp

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

10+
// ---- GC1109 RF FRONT END CONFIGURATION ----
11+
// The Heltec V4 uses a GC1109 FEM chip with integrated PA and LNA
12+
// RF switch control: PA_TX_EN LOW = RX path (LNA), HIGH = TX path (PA)
13+
14+
// PA_POWER: Power enable for GC1109 chip (always on)
1015
pinMode(P_LORA_PA_POWER, OUTPUT);
11-
digitalWrite(P_LORA_PA_POWER,HIGH);
16+
digitalWrite(P_LORA_PA_POWER, HIGH);
1217

18+
// PA_EN: Main enable for GC1109 (must be HIGH for both RX and TX)
1319
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
1420
pinMode(P_LORA_PA_EN, OUTPUT);
15-
digitalWrite(P_LORA_PA_EN,HIGH);
16-
pinMode(P_LORA_PA_TX_EN, OUTPUT);
17-
digitalWrite(P_LORA_PA_TX_EN,LOW);
21+
digitalWrite(P_LORA_PA_EN, HIGH);
1822

23+
// PA_TX_EN: RF switch control (LOW=RX/LNA, HIGH=TX/PA)
24+
pinMode(P_LORA_PA_TX_EN, OUTPUT);
25+
digitalWrite(P_LORA_PA_TX_EN, LOW); // Default to RX mode
26+
// -------------------------------------------
1927

2028
periph_power.begin();
2129

@@ -32,13 +40,13 @@ void HeltecV4Board::begin() {
3240
}
3341

3442
void HeltecV4Board::onBeforeTransmit(void) {
35-
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
36-
digitalWrite(P_LORA_PA_TX_EN,HIGH);
43+
digitalWrite(P_LORA_TX_LED, HIGH); // Turn TX LED on
44+
digitalWrite(P_LORA_PA_TX_EN, HIGH); // Switch to TX path (PA)
3745
}
3846

3947
void HeltecV4Board::onAfterTransmit(void) {
40-
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
41-
digitalWrite(P_LORA_PA_TX_EN,LOW);
48+
digitalWrite(P_LORA_PA_TX_EN, LOW); // Switch back to RX path (LNA)
49+
digitalWrite(P_LORA_TX_LED, LOW); // Turn TX LED off
4250
}
4351

4452
void HeltecV4Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
@@ -50,7 +58,9 @@ void HeltecV4Board::begin() {
5058

5159
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
5260

53-
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN); //It also needs to be enabled in receive mode
61+
// Hold GC1109 FEM pins during sleep (PA_EN=HIGH, PA_TX_EN=LOW for RX mode)
62+
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN);
63+
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_TX_EN);
5464

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

variants/heltec_v4/platformio.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ build_flags =
3131
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
3232
-D SX126X_CURRENT_LIMIT=140
3333
-D SX126X_RX_BOOSTED_GAIN=1
34+
-D SX126X_RXEN=RADIOLIB_NC ; No separate RX enable pin
35+
-D SX126X_TXEN=46 ; TX enable pin (P_LORA_PA_TX_EN) controls RF switch
3436
-D PIN_GPS_RX=38
3537
-D PIN_GPS_TX=39
3638
-D PIN_GPS_RESET=42

0 commit comments

Comments
 (0)