No satellites seen on L80-R

# 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.*

It seems to have been a layout issue, the revised version has RF energy and is able to get a GPS lock.