# Quectel L80RE-M37 — Full Investigation Record
This file is the complete, up-to-date record of the L80RE-M37 investigation: symptom, physical setup, every firmware and diagnostic step we ran, all measured data, what each test ruled in or out, and where we stand. It is written to stand alone — ready to post to the Quectel forum or hand to support as-is.
—
## 1. Summary
- **Module:** Quectel L80RE-M37 (MTK3337-based), firmware `AXN_2.32_3337_15010801`, **integrated patch antenna on top**, connected to an ESP32-S3 host over UART.
- **Symptom:** zero satellites in view (`$GPGSV,1,1,00`) every second, no position fix, no valid GPS time — regardless of indoors/outdoors, cold start, or host radios on/off.
- **Cumulative evidence:** ~32 minutes outdoors across two runs (19 min radio-on, 13 min radio-quiet), **never a single satellite in view**, never a fix, never a valid time.
- **What still works:** 1 Hz NMEA stream (always present), config ACKs (`314`/`220` = flag 3), version reply (`$PMTK705`), zero UART dropouts.
- **Conclusion so far:** the digital/command path is healthy while the RF/correlator path sees zero signal, strongly indicating an **RF-path fault inside the module** (patch feed / LNA / SAW / TCXO / RF front-end) — an RMA candidate. Next decisive step: known-good EVB swap + patch continuity check.
## 2. Setup & wiring
- Host: **ESP32-S3** (RocketInterfaceCard rev 1.2 flight computer)
- GPS interface: **UART (Serial1) @ 9600 baud, 8N1**
- GPS RX (into host): **pin 38** · GPS TX (to module): **pin 39**
- Module: **L80RE-M37, integrated patch antenna on top**
- Tested locations: indoors (bench) and **outdoors, clear sky** (~32 min total)
- Power: **VCC clean** (scoped — no droop/ripple)
## 3. Commands we send (kept constant)
```
$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 // full NMEA (GGA,GLL,RMC,VTG,GSA,GSV)
$PMTK220,1000*1F // 1 Hz
$PMTK313,1*2E // SBAS search
$PMTK605*31 // version query
$PGCMD,33,1*6C // antenna-status request
$PMTK104 // cold start (early runs only)
```
## 4. What the module answers (and what it means)
| Command | Reply | Meaning |
|—|—|—|
| NMEA mask `$PMTK314` | `$PMTK001,314,3` | **accepted** (flag 3) |
| Rate `$PMTK220` | `$PMTK001,220,3` | **accepted** (flag 3) |
| SBAS `$PMTK313` | `$PMTK001,313,1` | **unsupported/unknown** (flag 1) — SBAS not in this build |
| Version `$PMTK605` | `$PMTK705,AXN_2.32_3337_15010801,0000,*2D` | identity confirmed |
| Antenna request `$PGCMD,33,1` | **echo** of our command; `$PGTOP` never emitted | integrated-patch variant has no antenna-detect circuit → `PTOP=0` expected |
Two keys to understand:
1. **SBAS is not supported** (flag 1) — non-issue.
2. **`$PGCMD,33,1` is a command echo, NOT antenna “short/open” status.** We briefly misread it as an antenna fault until we confirmed no `$PGTOP` exists. Per Quectel, the integrated-patch variant has no antenna-detect → `PTOP=0` is expected, not a fault.
## 5. Steps we’ve gone through (chronological)
1. **Indoor/bench observation** — no satellites, no fix. Wiring/baud confirmed working via ACKs + version reply.
2. **1 Hz → tried 5 Hz** — module rejected 5 Hz under ALLDATA; reverted to 1 Hz.
3. **Cold start (`$PMTK104`) + SBAS enable** — still zero satellites; before we corrected init ordering.
4. **Debug build additions** — raw NMEA `R,`, per-satellite `S,` rows, `VER,` version, `E,` echo markers, `ANT,` antenna, soak counters (`E:` max sat ever, `M:` sat-seconds), ACK ledger (`AOK`/`AREJ`), `W,` dropout watchdog, and `F,` per-second status row.
5. **Command-echo bug fix** — stopped parsing `$PGCMD,33,1` as antenna status; only `$PGTOP,11,x` counts. Confirmed `PTOP=0`.
6. **Init-ordering fix (Quectel guidance)** — config applied AFTER any restart; no routine cold start each boot. SBAS then surfaced as flag 1 (unsupported), confirming the earlier “missing ACK” was config-wipe timing.
7. **Run #1 — outdoor, radio-on, 19 min** (SD `/GPS_0041.csv`).
8. **Run #2 — outdoor, RF-quiet, 13 min** (SD `/GPS_0047.csv`), radios fully off (`WiFi.mode(WIFI_OFF)` + `btStop()`).
9. **VCC scoped clean.**
## 6. Full measured data
### Run #1 — outdoor, radio-on, 19 min (SD `/GPS_0041.csv`)
| Metric | Value |
|—|—|
| F rows (~seconds) | **1180 (~19 min)** |
| `$GPGSV` sentences | 1183 |
| `$GPGSV` with `satsInView > 0` | **0** |
| Per-satellite `S,` rows | **0** |
| `E:` (max sats ever) / `M:` (sat-seconds) | **0 / 0** |
| `W,` dropout events | **0** |
| GPS time | never (stale `01/06/2080`) |
### Run #2 — outdoor, RF-quiet (WiFi+BLE OFF), 13 min (SD `/GPS_0047.csv`)
| Metric | Value |
|—|—|
| F rows (≈ seconds) | **792 (~13 min)** |
| `$GPGSV` sentences | 796 |
| `$GPGSV` with `satsInView > 0` | **0** |
| `S,` rows | **0** |
| `E:` / `M:` | **0 / 0** |
| `W,` dropouts | **0** |
| GPS time | never (stale `01/06/2080`) |
| RF status in boot log | `RF_QUIET: Wi-Fi + BLE radios powered off` |
### Run #3 — outdoor, RF-quiet + factory-reset, 49 min (SD `/GPS_0052.csv`)
The full factory-reset / cold-start / reconfig cycle ran and the boot banner was captured:
```
BOOT,PMTK011,MTKGPS*08
VER,PMTK705,AXN_2.32_3337_15010801,0000,*2D
ACK,314,3 ACK,220,3
```
| Metric | Value |
|—|—|
| F rows (≈ seconds) | **2941 (~49 min)** |
| `$GPGSV` sentences | 2944 |
| `$GPGSV` with `satsInView > 0` | **0** |
| Per-satellite `S,` rows | **0** |
| `E:` / `M:` | **0 / 0** |
| `W,` dropouts | **0** |
| GPS time | never (stale `01/06/2080`) |
Every `$GPGSV` for the entire 49-min run: `$GPGSV,1,1,00`.
Sample `F,` row (identical form throughout all runs):
```
F,01:05:xx.264,01/06/2080,0,0,0.000000,0.000000,0.0,0.0,0.0,0,0,9999,U:1,E:0,M:0,PTOP:0,PGCMD:1,AOK:2,AREJ:1
```
Position sentences (constant every second, all runs):
```
$GPGSV,1,1,00 (zero satellites in view)
$GPGGA,…0,0,… (fix quality 0)
$GPRMC,…,V,… (void — no fix)
$GPGSA,A,1,… (fix mode 1 = no fix)
```
**Cumulative across all three outdoor runs: ~81 minutes, 4923 `$GPGSV` sentences, zero satellites in view, zero fixes, zero valid time.**
## 7. What each test ruled out
| Test / measurement | What it rules out |
|—|—|
| Wiring, baud, command path (`ACK` = flag 3, version reply) | not a digital/communication problem |
| 1 Hz, config-after-restart ordering | not a config/startup-ordering issue |
| SBAS wrong-flag-1 (unsupported) | not failing SBAS support — this build simply lacks it |
| Cold start (`PMTK104`) done, still zero | not a stale-almanac / cold-start wake issue |
| Missing `$PGTOP` (integrated patch, no antenna detect) | not an antenna-status failure (the only `$PGCMD,33,1` seen is our command echo) |
| VCC clean (scoped) | not a power-mode where the RF section is unpowered |
| RF-quiet outdoor 13-min radio-off (Run #2) | not local EMI/desense from the ESP32’s own Wi-Fi/BLE or board regulators |
| Factory reset (`$PMTK111`) + cold start (`$PMTK104`) outdoor 49-min (Run #3) | not corrupt-NV / stale-almanac: reset banner captured, config re-applied, still zero |
**What is NOT yet ruled out:** the RF-path stages (patch feed / LNA / SAW / down-converter+TCXO / ADC → correlator input). These are the remaining suspect.
## 8. The RF receive chain and why we can’t see the whole thing
A receiver chain is typically:
1. patch antenna → 2. LNA → 3. SAW filter → 4. down-converter + TCXO reference → 5. ADC → 6. correlator → GSV.
- Stages 1-5 (the RF/analog block) are mostly **not individually probe-able** on an L80: the LNA/SAW/down-converter/ADC have no exposed test points, and there is no public test mode. A multimeter can only check patch continuity (stage 1); a scope can check a TCXO-style reference if accessible.
- Stage 6’s output (the correlator / GSV) **is** the one thing we can read, and it has reported `0` the entire time.
- So our firmware measures the *result* of stages 1-6 through GSV, but cannot tell us which of stages 1-5 fails. That’s why the **EVB swap** is the decisive next action.
## 9. Why we label it “RF-path fault in the module”
Reason this points to the module:
- The **digital core** (UART, NMEA generation, ACK, version) has run flawlessly for ~81 minutes combined across three outdoor runs.
- The **correlator** sees **zero signal energy** even outdoors, radio-off, and after a full factory reset — no PRN, no SNR, ever (4923 GSV sentences, zero non-zero).
- Three independent outdoor runs (radio-on, radio-quiet, factory-reset) all show `$GPGSV,1,1,00` the whole time.
- VCC is clean → not a power problem.
That is the standard “digital works, RF dead” signature — the module itself is the likely fault.
## 10. Next steps (Quectel-guided, in order)
1. **Known-good EVB swap (the decisive test)** — both directions where possible:
-
Suspect module on a known-good EVB + known-good antenna → still `00` ⇒ module RF chain dead ⇒ RMA.
-
Known-good module on our board → works ⇒ our board’s GPS RF footprint/power (less likely; VCC clean).
2. **Patch continuity** — feed-to-GND should read **open / high impedance** at DC; a short suggests solder bridge or cracked ceramic.
3. **Visual feed-pin & patch inspection** (magnifier) — lifted/rotated patch, cracked ceramic; relevant if the unit has flown.
4. (Not needed) firmware/config — already exhausted.
## 11. Raw data availability
Full raw SD logs captured and preserved:
- Run #1 (radio-on, outdoor, 19 min): `/GPS_0041.csv` — captured over DUMP serial (396 KB)
- Run #2 (RF-quiet, outdoor, 13 min): `/GPS_0047.csv` — captured over DUMP serial (266 KB)
- Run #3 (RF-quiet + factory-reset, outdoor, 49 min): `/GPS_0052.csv` — directly on the mounted SD card at `/mnt/sdcard/GPS_0052.csv` (20,916 lines)
Available on request to Quectel / support, along with the exact firmware GPIO build (GPStest).
—
*Recorded 2026-08-23. Single-file, self-contained record of the investigation to date.*