Tests on the board
On the PC, everything passed. On the board, the first reads failed one time in six, then not at all, then again. The story of a tuning in which saying “we don’t know” was part of the work.
On this page
First test, without the board
Firmware v0.4.0 flashed onto the Pico W, nothing connected to GP2 and GP3. The probe joins the Wi-Fi, opens its two ports, answers over mDNS. The log reports its limits; “connect” answers that the target does not respond, as expected. OpenOCD connects to the probe, then fails for lack of a target, as expected too.
The board connected: errors
The probe reads the RP2040’s identifier and its ROM without fault. But reads of SRAM, peripherals and system registers often fail, through the log as through OpenOCD, at 100 kHz as at 1 MHz: 824 errors out of 4,952 reads in 10 s. No wait request from the target: the line loses sync, or the bus returns an error.
A hypothesis is put forward: the PIO program changed SWDIO in the same cycle as SWCLK’s falling edge, and interference from one wire to the other would make the target see a false edge. The program is fixed (the data is set one cycle later), and the bench now checks that no SWDIO change falls on an edge.
The comparison that proved nothing
Thanks to the update over the network, three variants were compared without touching the wiring:
| Variant | Identifier, 1,000 reads | 10 s reading |
|---|---|---|
| Fixed PIO | 1,000 correct | 0 errors |
| Original PIO | 1,000 correct | 0 errors |
| Original PIO, without reserving the PIO machine | 1,000 correct | 0 errors |
The errors had disappeared in all three cases, after the board was switched off and on again and the Pico W plugged back in. So the firmware was not at fault, and the hypothesis is not confirmed: a loose contact or a state of the board, we don’t know. The fix is kept, since it costs nothing.
The errors come back
To flash Eliott65 v0.58.0 over Wi-Fi, OpenOCD could no longer read the memory. This time, block reads came back with a wrong parity, then the line lost sync; a single read passed. After rewiring, it was worse: even the identifier came back wrong, up to 30 % of the time, shifted by one bit, the signature of a false clock edge seen by the target.
A variant with gentler pins (2 mA instead of 4, slow slew rate) was installed over the network:
| Measurement | 4 mA | 2 mA |
|---|---|---|
| Identifier, 1,000 reads at 100 kHz | 702 correct | 1,000 correct |
| Identifier at 1 and 4 MHz | — | 1,000 correct at each speed |
| 200-word blocks at 100 and 200 kHz | — | 0 errors |
| 200-word blocks at 400 kHz | — | 2 blocks failed out of 50 |
| 200-word blocks at 1 MHz | — | errors after 20 to 150 words |
| 10 s reading at 1 MHz, single-word reads | — | 0 errors |
The 2 mA setting is kept. Eliott65 v0.58.0 was then flashed over Wi-Fi at 200 kHz, and verified, in 1 min 27 s.