Hello Community,
I’m working on a custom LoRa project with two Heltec WiFi LoRa 32 V4 boards and have run into a frustrating issue that I can’t solve despite extensive testing. I’m hoping someone here can help me figure out what I’m missing!
The Problem
I have two Heltec WiFi LoRa 32 V4 boards that work perfectly with Meshtastic firmware (bidirectional communication, good RSSI/SNR values). However, when I use custom firmware (RadioLib + raw SX1262 initialization), the TX side always reports success but the RX side never receives any packets.
-
With Meshtastic: Both boards communicate perfectly -
With custom firmware: TX reports ERR_NONE, but RX never sees packets -
This happens even at very close distance (< 1 meter)
This is a simple Heltec V4 → Heltec V4 point-to-point test, no other devices involved.
My Hardware Setup
-
2 × Heltec WiFi LoRa 32 V4 (ESP32-S3 + SX1262 + GC1109 front-end, EU868 version)
-
PlatformIO, Arduino framework, RadioLib 7.4.0, U8g2
-
Original 868 MHz antennas supplied with the boards
-
Both boards are identical hardware
LoRa Parameters (Identical on Both Boards)
I’m using the same parameters on both TX and RX:
Frequency: 869.525 MHz Bandwidth: 250 kHz Spreading Factor: 11 Coding Rate: 4/8 Sync Word: 0x12 (Meshtastic privatenetwork) Preamble: 8 Header: explicitCRC: enabled TX Power: 22 dBm
Both boards call radio.begin(869.525, 250.0, 11, 8, 0x12, 22, 8) followed by radio.setCRC(true) and radio.explicitHeader().
Pin Configuration (from Heltec V4 documentation)
// SX1262 SPI pinsLORA_SCK = 9 LORA_MISO = 11 LORA_MOSI = 10 LORA_NSS = 8 LORA_DIO1 = 14 LORA_RST = 12 LORA_BUSY = 13 // GC1109 Front-end controlFEM_EN = 2 // CSD - Frontend enable (set HIGH)FEM_PA = 46 // CTX - TX/RX switch (controlled by DIO2?)
My Initialization Sequence
Based on research in Meshtastic source code and community forums, I’ve implemented this initialization on both TX and RX:
1. Hardware Reset
- Pull RST low, then high, wait for BUSY to go low
2. Raw SX1262 Commands (before RadioLib begin!)
SetDio3AsTcxoCtrl (0x97) // 3.3V TCXO, ~2.5ms delaySetDio2AsRfSwitch (0x9D, 0x01)// Auto RF switch via DIO2SetStandby (0x80) // STDBY_RCSetRegulatorMode (0x96, 0x00) // DC-DC modeCalibrate (0x89, 0x7F) // Calibrate allCalibrateImage (0x98, 0xE1, 0xE9)// 860-880 MHzSetPaConfig (0x95, {0x04, 0x07, 0x00, 0x01})// High powerSetTxParams (0x8E, {0x1F, 0x03})// 31 = 22dBm + 9 offsetSetBufferBaseAddress (0x8F, {0x00, 0x00})
3. GPIO Setup
digitalWrite(FEM_EN, HIGH); // GC1109 permanently enabled
4. RadioLib Initialization
radio.begin(869.525, 250.0, 11, 8, 0x12, 22, 8); radio.setCRC(true); radio.explicitHeader();
5. TX Loop
radio.transmit("HELTEC_" + String(count)); // Always returns ERR_NONE, realistic TX duration
6. RX Loop
radio.startReceive(); // Called once in setup() // In loop(): if(radio.available()) { radio.readData(msg); // Never called - available() is always false}
What I’ve Already Tested
I’ve spent 15+ hours debugging this and tried:
-
Different TCXO voltages: 1.7V, 2.4V, 3.0V, 3.3V with various delays
-
Different SyncWords: 0x12 and 0x34, matching on both sides
-
With/without DIO2 RF switch: Manual GPIO46 control vs automatic DIO2
-
Different power levels: 0-22 dBm
-
Initialization order: Raw init before/after RadioLib begin
-
Role swap: Tested both boards as TX and RX
-
Frequency variations: 868.0 MHz, 869.525 MHz
-
Parameter variations: Different SF/BW combinations
-
CPS pin tests: Tried GPIOs 3, 4, 5, 6, 7, 45, 47 set HIGH (no CPS found in V4 docs)
Result: Always the same - TX reports success, RX never receives anything.
What Works vs. What Doesn’t
Works perfectly:
-
Meshtastic on both boards (bidirectional, good RSSI/SNR)
-
This proves the hardware, antennas, and RF path are functional
Doesn’t work:
-
Custom firmware on both boards (identical parameters)
-
TX side shows success, RX side shows nothing
-
No packets at any distance, even touching antennas
My Questions
I would really appreciate help with these questions:
-
Is there a known-good minimal example for Heltec V4 ↔ V4 point-to-point LoRa?
Even pseudo-code or key settings would help! -
Is my SX1262 + GC1109 initialization sequence correct for V4?
Specifically the TCXO, DIO2, and PA configuration? -
Is DIO2 really wired to GC1109 CTX on the V4?
ShouldSetDio2AsRfSwitchhandle the TX/RX switching automatically? -
Is there a hidden CPS pin or other GC1109 control pin I’m missing?
The GC1109 datasheet mentions CPS (power select) but I can’t find it in V4 docs. -
Could RadioLib be overwriting my raw SX1262 settings?
Is there a V4-specific way to use RadioLib that preserves the critical settings? -
What TCXO voltage does the V4 actually use?
I’ve tried 1.7V, 2.4V, 3.0V, and 3.3V without success.
Additional Info
-
The boards are definitely functional - Meshtastic proves this
-
I’ve verified with a logic analyzer that SPI commands are being sent correctly
-
Status registers show no errors after initialization
-
Both TX and RX init sequences complete successfully
I’m clearly missing something that Meshtastic does correctly but I haven’t replicated. Any insights, code examples, or schematic details for the Heltec V4 would be incredibly helpful!
Thank you in advance for any guidance! ![]()