A symptom‑first index of every dead end we hit, and the actual cause.
Cause: the PWRKEY line (BCM GPIO4) is floating, so it "presses itself" and the module cycles on→off→on forever. This is not a power fault, even though it looks identical to one.
Fix: hold GPIO4 low. Add gpio=4=op,dl to /boot/firmware/config.txt and
reboot. Runtime test: pinctrl set 4 op dl should make it stop.
Work through these in order:
- Send
ATtwice. The first command after opening the port often gets no reply while the module auto‑baud‑syncs. - Wrong baud. Try 57600 first (not 115200) on the PL011. Fix it with
AT+IPR=57600. Usescripts/modem_raw_capture.pyto watch raw bytes at different baud rates. - You're on the mini‑UART.
ls -l /dev/serial0— if it points tottyS0, Bluetooth isn't disabled and the baud is unstable. Adddtoverlay=disable-bt, reboot, confirm it'sttyAMA0. - The serial console still owns the port. Disable the login shell on
serial (
raspi-config→ Serial Port) and removeconsole=serial0,...fromcmdline.txt. - The module is actually off. Press the physical PWR button, or pulse
GPIO4 (
scripts/modem_power.sh) and wait ~15 s for it to boot. - Something else holds the port.
sudo lsof /dev/serial0— a straypppdor another process can block it.
- It's scanning every band (can take ~20 minutes). Lock your carrier's
band:
AT+CBANDCFG="CAT-M",28(Telstra AU B28), thenAT+CFUN=0/AT+CFUN=1. This is the usual culprit. - Wrong RAT.
AT+CMNB=1for Cat‑M1 (default is often NB‑IoT).AT+CNMP=38for LTE‑only. - Antenna — on the MAIN (cellular) connector, not GNSS, and rated for your band. Test near a window / outdoors.
- SIM not provisioned for the tech. A consumer SIM is usually fine for
Cat‑M1 but not for NB‑IoT (which needs an IoT‑data SIM). A rejected
attach shows as EMM cause 12 in
AT+CEREG?detail. - Verify the SIM is alive:
AT+CPIN?→READY,AT+CIMIreturns an IMSI.
Cause: the 5 V rail sags under the module's ~2 A TX current spikes.
Fix: the 1000 µF capacitor mod across VCC/GND, and/or a stronger 5 V supply / separate HAT feed.
Remember: vcgencmd get_throttled = 0x0 does not clear the supply of
suspicion — the sags are too fast to latch the flag.
Normal on some SIM7080/7028 firmware. Use AT+CEREG? as the health signal,
not CSQ. Enable unsolicited registration reports with AT+CEREG=2.
The module rebooted (see the "resets every ~15 s" and "power sag" sections). A
volatile setting reverting to its default is a cheap way to detect an
unexpected module reboot. With a fixed baud you can also watch for the boot
banner (RDY / +CFUN: 1 / +CPIN: READY) in the raw UART stream.
- Make sure the module registers first — no point dialing on
NO SERVICE. nocrtsctsin the peer file — the GPIO‑header UART has no RTS/CTS.- Match the peer file's baud to the module's fixed
AT+IPR(57600 here). pppdneeds root; run viasudo, and it needs the serial port free (stop any AT session first — PPP and AT can't share the UART simultaneously).- Watch the chat in the log:
journalctl -t pppd(or/var/log/syslog).
# what is /dev/serial0 really?
ls -l /dev/serial0 ; pinctrl get 14 15 4
# full status snapshot
./scripts/modem_at.py "AT" "ATI" "AT+CPIN?" "AT+CIMI" "AT+CEREG?" "AT+CPSI?" "AT+CBANDCFG?"
# is the Pi rebooting unexpectedly? (short/odd boot durations = trouble)
journalctl --list-boots | tail