Circuit review & bench-test guide
AXC-001 — W5500 SPI Ethernet PMOD module
Document purpose#
This document explains the axc-001-ethernet-spi PMOD module at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on generate_design.py, README.md, and the ERC report in reports/.
This board has never been fabricated. Repository status is schematic generated, ERC clean (0 errors / 0 warnings), netlist reviewed; PCB layout not started; not released. There is no PCB, no BOM export, no DRC record, and no first-article bench result. Every number below is a target to verify against real hardware, not a proven result. The analog front end is copied from the WIZnet W5500-Ref-RJ45WithMag reference schematic, which raises confidence in the topology but proves nothing about this layout-to-be or assembly.
1. What the board does#
The board puts a WIZnet W5500 — hardwired TCP/IP + MAC + PHY behind a plain SPI slave — on a PMOD Type 2A plug, with a Hanrun HR911105A integrated-magnetics RJ45. The FPGA host talks SPI (mode 0/3, up to 33 MHz sustained, 80 MHz burst per WIZnet) to 8 hardware sockets; ~INT signals socket events on PMOD pin 7. It is catalog #1 (L3) in the comms line and the "working web server in a weekend" half of the paired lesson with AXC-002 (LAN8720A soft MAC).
Functional block diagram#
PMOD host (3.3 V) Module Network
┌──────────────┐ ┌────────────────────────────────┐ ┌──────────────────┐
│ 1 ~CS ───────┼──>│ SCSn │ │ │
│ 2 MOSI ──────┼──>│ MOSI U1 W5500 TX± ─┼──>│ J2 HR911105A │
│ 3 MISO <──R12┼───│ MISO (TCP/IP+MAC+PHY) RX± <┼───│ MagJack │
│ 4 SCK ───────┼──>│ SCLK │ │ (magnetics + │
│ 7 ~INT <──R13┼───│ INTn (o.d., R10 10k PU) │ │ link/act LEDs │
│ 8 ~RST ──────┼──>│ RSTn (R11 10k PU) │ │ via R8/R9 330R) │
│ 6/12 3V3 ────┼─┬>│ VDD Y1 25 MHz XI/XO │ └──────────────────┘
│ 5/11 GND ────┼─┼─│ GND C1/C2 18p, R7 1M │
└──────────────┘ │ │ EXRES1: R6 12.4k 1% │
FB1 120R└>│ AVDD (3V3A) TOCAP C7 4.7µ │
│ termination: R1–R5, C3–C6 │
└────────────────────────────────┘
2. Safety and scope boundaries#
- Everything is 3.3 V; electrical hazard to people is negligible. The real risks are mis-assembly of the dense LQFP-48 and the analog termination bank, and time lost chasing "no link" symptoms that are actually cable, switch, or magnetics problems.
- Standalone bench work must use a current-limited 3.3 V supply (200 mA limit; the W5500 draws ~130 mA typical when the PHY is up).
- Ethernet is transformer-isolated at J2, so a live switch/router is safe to attach. Do not attach anything carrying PoE at 48 V until the Bob Smith / chassis-return arrangement (jack pin 8 to GND, chassis-split cap deferred to layout) has been reviewed for the deployment environment.
- The W5500 is not 5 V tolerant. Never drive SPI or ~RST from 5 V logic.
- ERC-clean is a schematic check only. No PCB exists; the MDI trace matching, 3V3A island, and jack placement are all unbuilt and unverified.
- A working ping is not EMC or safety certification, and the deferred 1 nF/2 kV chassis split means EMC behavior is explicitly open.
3. Power and control sequence#
- 3V3 arrives from the PMOD host (pins 6/12) or the bench supply. FB1 (120 Ω @ 100 MHz) derives 3V3A for the analog bank; C9–C13 (100 nF) and C14/C15 (10 µF) decouple both rails.
- The internal 1.2 V core regulator starts (C7 4.7 µF on TOCAP, C8 10 nF on 1V2OUT — both datasheet-mandated values).
- Y1 (25 MHz, CL = 12 pF) oscillates across XI/XO with C1/C2 18 pF load caps and R7 1 MΩ feedback. No crystal, no chip: SPI reads will fail or return garbage.
- R11 holds ~RST high so an unconfigured host cannot hold the part in reset; the host may still pulse ~RST low (≥500 µs recommended) for a clean start.
- PMODE straps are left open; internal pull-ups latch PMODE=111 (all-capable auto-negotiation) at reset, exactly as the WIZnet reference does.
- The PHY auto-negotiates with the link partner. LINKLED sinks through J2's green LED (anode fed from 3V3 via R8 330 Ω); ACTLED blinks the yellow LED via R9 on traffic.
- The host reads VERSIONR (offset 0x0039, common register block) — the value is fixed at 0x04 — as the canonical "SPI path alive" check, then configures MAC/IP/socket registers. ~INT (open-drain, R10 10 k pull-up, R13 100 Ω series) falls on enabled socket/IP events.
4. Interfaces#
| Reference | Pins/signals | Intended use |
|---|---|---|
| J1 | 12-pin PMOD plug, Type 2A expanded SPI | 1 ~CS, 2 MOSI, 3 MISO, 4 SCK, 5/11 GND, 6/12 3V3, 7 ~INT, 8 ~RST, 9/10 NC |
| J2 | HR911105A MagJack (8 MDI pins + LED pins + pin 8 chassis + shell) | 10/100BASE-T to the network; integrated magnetics and Bob Smith network |
PMOD pin map (host viewpoint):
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | ~CS | MOSI | MISO | SCK | GND | 3V3 | ~INT | ~RST | NC | NC | GND | 3V3 |
SPI: mode 0 or 3, W5500 frame = 16-bit address + control byte (block select, R/W, operation mode) + data. There are no test points defined yet (no layout exists); bench probing is at J1/J2 pins, the passives, and the LQFP pins under magnification.
5. Component-by-component review#
The board is dense (~30 nets), so components are grouped by function.
5.1 Controller, jack, and clock#
| Ref. | Part | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| U1 | WIZnet W5500, LQFP-48 | TCP/IP + MAC + PHY behind SPI; 8 hardware sockets | Nothing works | Rotated LQFP or bridged 0.5 mm pins gives anything from dead SPI to a hot chip; RSVD pins 23, 38–42 must be at GND and VBG must float per datasheet — miswiring these is a silent spec violation |
| J2 | Hanrun HR911105A MagJack | RJ45 + integrated 10/100 magnetics + green/yellow LEDs; pin 8 is the Bob Smith chassis return (tied to GND per its datasheet), SH = shell (GND) | No network connection | TD/RD pair swap kills or degrades link (auto-MDIX may mask it — verify, don't assume); LED pin mix-up (green A9/K10, yellow A12/K11) gives dark or always-on LEDs; open pin 8/shell degrades ESD/EMC behavior |
| Y1 | 25 MHz crystal, CL = 12 pF, 3225 4-pad (MPN still TBD: ABM8 class) | PHY/PLL reference; everything times off it | Chip dead or SPI-only-garbage; no link ever | Wrong CL crystal pulls frequency: Ethernet may work marginally or fail interop; GND pads (2/4) unsoldered degrades stability |
| C1, C2 | 18 pF C0G (Murata GRM1885C1H180JA01D) | Crystal load: C = 2 × (CL − Cstray) = 2 × (12 − 3) = 18 pF, matching the WIZnet reference | Oscillator may still start but off-frequency | Short kills oscillation; grossly wrong value shifts frequency — check startup and frequency, not just "it pings" |
| R7 | 1 MΩ | Crystal feedback bias (per WIZnet reference) | Oscillator may fail to start at some corners | Short loads the oscillator; usually still starts but margin is gone |
5.2 MDI termination and analog bias (WIZnet reference values)#
| Refs. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R1, R2 | 49.9 Ω 1 % to 3V3A | TX± line pull-ups: the W5500 TX driver is current-mode and needs these to develop the line voltage | Open = dead/asymmetric TX, no or unreliable link; wrong value skews amplitude and return loss |
| R3 + C3 | 10 Ω + 22 nF | TX center-tap feed from 3V3A with local decoupling | Open R3 = no TX bias at all; open C3 = noisy TX common mode |
| R4 + C4, R5 + C5 | 49.9 Ω + 6.8 nF each | RX± AC terminations to GND | Open = reflections/degraded RX, worse on long cables; shorted cap DC-loads the receive pair |
| C6 | 10 nF | RX center-tap decoupling to GND | More common-mode noise into the receiver |
| R6 | 12.4 kΩ 1 % to GND | EXRES1 bias — exact value required by the W5500 datasheet; sets internal analog currents | Wrong/open value skews PHY amplitudes and can cause marginal, temperature-dependent link — measure the fitted value, this is not a ±5 % position |
| C7 | 4.7 µF (TOCAP) | Internal 1.2 V regulator output cap, datasheet value | Open = core-rail instability, resets/hangs |
| C8 | 10 nF (1V2OUT) | 1.2 V output decoupling, datasheet value | Marginal core noise |
5.3 Host lines, LEDs, and decoupling#
| Refs. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R12 | 100 Ω series | Protection on the module-driven MISO line | Open = SPI reads all-zero/all-one while writes may "work"; a grossly wrong value still passes 33 MHz poorly — verify by measurement |
| R13 | 100 Ω series | Same for the module-driven ~INT line | Open = interrupts never arrive; polling still works, which can mask it |
| R10 | 10 kΩ to 3V3 | ~INT pull-up (INTn is open-drain; pulled up on-module per line rule) | Floating ~INT = phantom or missing interrupts |
| R11 | 10 kΩ to 3V3 | ~RST idle pull-up | Open + host pin floating = chip may sit in reset or bounce |
| R8, R9 | 330 Ω from 3V3 | Green (link) / yellow (activity) LED anode feeds; W5500 LINKLED/ACTLED sink | Dark LEDs (cosmetic, but the bring-up procedure below uses them) |
| FB1 | 120 Ω @ 100 MHz bead (Murata BLM18AG121SN1D) | Splits digital 3V3 from analog 3V3A, per the reference design | Open = entire analog bank dead (no link, SPI fine — a distinctive signature); shorted-by-substitution just weakens filtering |
| C9–C12 | 100 nF on 3V3A (×4) | Analog rail HF decoupling | Rail noise, degraded PHY sensitivity |
| C13 | 100 nF on 3V3 | Digital rail HF decoupling | Rail noise near U1 |
| C14, C15 | 10 µF on 3V3 / 3V3A | Bulk per rail | Droop during PHY start and TX bursts |
| #FLG01–03 | ERC power flags | Schematic bookkeeping only — no physical parts | — |
Every ref-des on the board is covered above: U1, J1, J2, Y1, FB1, R1–R13, C1–C15.
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts used here | Board-specific interpretation |
|---|---|---|
| W5500 (datasheet v1.1.0) | SPI mode 0/3; VERSIONR (0x0039) always reads 0x04; EXRES1 = 12.4 kΩ 1 %; TOCAP 4.7 µF; 1V2OUT 10 nF; VBG floats; RSVD 23/38–42 to GND; PMODE straps sample at reset (open = internal pull-ups = 111 all-capable autoneg); ~130 mA typical operating current | VERSIONR is the designated first SPI transaction of bring-up. PMODE=111 means autonegotiation — confirm the negotiated result via PHYCFGR (0x002E: LNK/SPD/DPX bits) rather than trusting the LED |
| HR911105A (LCSC datasheet C12074) | Integrated 1:1 magnetics + Bob Smith network on pin 8 ("connect CHS GND to PCB ground"); green LED anode 9 / cathode 10, yellow anode 12 / cathode 11 | LED polarity was verified against the datasheet at capture; re-verify on the physical part, since MagJack LED pinouts are a classic clone-part trap |
| WIZnet W5500-Ref-RJ45WithMag reference schematic | 49.9 Ω TX pull-ups, 10 Ω + 22 nF TCT, 49.9 Ω + 6.8 nF RX terminations, 10 nF RCT, 18 pF crystal loads, 1 MΩ feedback, ferrite-split analog rail | This board copies those values verbatim; deviations found at review should be treated as errors unless documented |
| Crystal (ABM8 class, MPN TBD) | CL = 12 pF assumed by the C1/C2 calculation | The MPN is not pinned yet. If procurement lands a different CL, C1/C2 must be recalculated — flag this at BOM review |
| Murata GRM caps / Yageo RC0603 (series page) | Standard X7R/X5R/C0G and 1 % thick film | Values non-critical except R6, R1–R5 (1 %) and the C0G crystal/termination caps |
7. Expected values before bench testing#
All values are design targets for a board that does not yet exist.
| Quantity | Target | How to measure |
|---|---|---|
| 3V3-to-GND resistance, unpowered | High (caps only), both polarities | DMM at J1 pin 6 to 5 |
| 3V3-to-3V3A | ~0 Ω (through FB1) | DMM |
| EXRES1 pad to GND | 12.4 kΩ ±1 % | DMM before power |
| J1 pin 3 to U1 MISO pin | ~100 Ω (R12) | DMM |
| Supply current, idle with link up | ~130 mA class at 3.3 V | Bench supply readout |
| Y1 oscillation | 25 MHz, clean sine-ish on XO; probe XI only with ≤1 pF active/low-C probe or check XO side | Scope after power |
| VERSIONR (0x0039) | 0x04, every read, at every tested SCK rate | SPI master read |
| PHYCFGR (0x002E) with cable to 100BASE-TX switch | LNK=1, and SPD/DPX matching the partner (expect 100/full against a modern switch) | SPI read |
| Green LED | On when cable to a live partner, off when unplugged | Eyes |
| Yellow LED | Blinks on traffic (e.g. during ping flood) | Eyes |
| Autonegotiation | Link established against 10/half, 10/full, 100/half, 100/full forced partners (PMODE=111) | Managed switch or forced-mode NIC |
| ~INT | High idle; falls on enabled socket event; returns high after the host clears SIR/Sn_IR | Scope at J1 pin 7 |
8. Manual schematic and assembly review checklist#
- Verify U1 orientation (pin 1 dot) and inspect all four LQFP-48 sides for bridges/opens under magnification; 0.5 mm pitch.
- Confirm RSVD pins 23, 38–42 land on GND and VBG is truly floating on the final layout — buzz them.
- Measure R6 = 12.4 kΩ and confirm R1/R2/R4/R5 are 49.9 Ω 1 % before power.
- Confirm TX pull-ups go to 3V3A (not 3V3) and the RX terminations go to GND — the two banks look identical on a crowded board.
- Buzz U1 TXP/TXN/RXP/RXN to J2 TD+/TD−/RD+/RD− respectively; a pair swap here is the highest-value single check on the board.
- Verify J2 LED wiring: 3V3 → R8 → pin 9, pin 10 → LINKLED; 3V3 → R9 → pin 12, pin 11 → ACTLED. Verify pin 8 and SH to GND.
- Confirm Y1's GND pads (2/4) are soldered, C1/C2 are the 18 pF C0G parts, and the fitted crystal really is CL = 12 pF (MPN was TBD at capture).
- Confirm FB1 is fitted (an open bead is invisible to a digital-only test).
- At layout review (future): MDI pairs matched and short, termination bank tight to U1, 3V3A island under the analog side, jack off the far edge, >25 mil PMOD-clip clearance, and decide the 1 nF/2 kV chassis split.
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, equipment IDs, link-partner identity (switch model/port config), and cable type.
A. Unpowered inspection and resistance tests#
- Visual inspection under magnification: U1 all sides, Y1 pads, the termination bank, J2 solder.
- DMM: 3V3-to-GND and 3V3A-to-GND high resistance both polarities; 3V3-to-3V3A ≈ 0 Ω (FB1); R6 pad to GND = 12.4 kΩ; J1 pin 3 to U1 MISO ≈ 100 Ω; J1 pin 7 to 3V3 ≈ 10 kΩ (R10, through R13 in path: ~10.1 k).
- Buzz all four MDI lines U1↔J2 and the LED network.
B. Standalone power-on (bench supply, no host, no cable)#
- Feed current-limited 3.3 V (200 mA) into J1 pins 6/5. Record current: expect tens of mA rising toward ~130 mA class as the PHY runs.
- Scope Y1: 25 MHz present and stable within ~10 ms of power.
- Check ~RST high (R11), ~INT high (R10), both LEDs off (no cable).
- No heating anywhere. A hot U1 with low current elsewhere suggests a rotated part — power off immediately.
C. Standalone SPI bring-up (bench SPI master: FT232H/Bus Pirate class)#
- Connect a 3.3 V SPI master to J1 (~CS/MOSI/MISO/SCK, GND common). Start at ≤1 MHz SCK.
- Read VERSIONR (block 0, offset 0x0039): must return 0x04. Repeat 100×; any miss is a wiring/solder/clock problem. Then re-run at the target SCK rate. This is the canonical bring-up gate — do not proceed until it is bulletproof.
- Write/read-back a scratch register (e.g. GAR/SHAR) to prove MOSI as well as MISO.
- Attach a cable to a live 100BASE-TX switch. Poll PHYCFGR (0x002E): LNK should assert within ~2 s; record negotiated SPD/DPX. Green LED must track LNK; unplug/replug and watch both.
- Autonegotiation matrix: against a managed switch (or forced NIC), force the partner to 10/half, 10/full, 100/half, 100/full and confirm PHYCFGR reports the matching result each time. PMODE=111 means the W5500 advertises everything; a failure here points at the MDI analog path, not the straps.
- Configure SHAR/GAR/SUBR/SIPR, open a UDP socket, and exchange packets with a PC. Confirm the yellow LED blinks with traffic and ~INT falls on RECV events when Sn_IMR is enabled (scope J1 pin 7).
D. Hosted bring-up (FPGA PMOD host)#
- Plug into the ECP5 host. Confirm the host 3.3 V rail carries the ~130 mA load (this is at the edge of the ~100 mA PMOD guidance — record the rail voltage under load).
- Run the
spi_w5500driver core: repeat the VERSIONR gate through fabric, first at low SCK, then at the target rate (≤33 MHz sustained). - Repeat the socket/ping exercise from C.6 through fabric/AruviOS; verify interrupt-driven RX (not polled) using ~INT on pin 7.
- Soak: ping flood for 30 minutes; record error counters, current, and U1 temperature.
E. Robustness checks#
- Cable matrix: short patch, long (≥30 m) cable, crossover, and both auto-MDIX orientations.
- Power-cycle loop: 50 cold starts; VERSIONR gate + link-up each time.
- Hot-plug the Ethernet cable repeatedly during traffic; confirm the stack recovers and ~INT storms don't wedge the driver.
F. Release-only tests#
EMC (radiated/conducted), ESD to the jack, the chassis-split decision (1 nF/2 kV vs direct GND at pin 8), and interop against a wider switch population are controlled-lab work, out of bench scope.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| VERSIONR never reads 0x04 | SCK/MOSI/~CS at U1 pins; 25 MHz at Y1; 3V3 at U1 | SPI wiring, R12 open (reads stuck), crystal dead, U1 solder/orientation |
| VERSIONR OK at 1 MHz, fails fast | MISO waveform at speed | R12 + stray C, long leads, SPI mode mismatch |
| SPI OK, never link | PHYCFGR LNK bit; 3V3A at C15 | FB1 open (3V3A dead), MDI pair swap, termination bank, EXRES1 value, partner/cable |
| Link at 100 but not 10 (or vice versa) | PHYCFGR forced-mode sweep | Marginal termination/crystal frequency — measure Y1 exactly |
| Link LED dark but PHYCFGR LNK=1 | LED network continuity | R8 open, LED polarity (clone jack), J2 pins 9/10 |
| No interrupts, polling works | J1 pin 7 level | R13 open, R10 missing, Sn_IMR/SIMR not enabled |
| Resets/hangs under traffic | 1.2 V behavior via TOCAP node, rail droop | C7 missing/wrong, host rail sag at ~130 mA, bulk caps |
| Works on bench master, flaky on FPGA | Compare SCK edges, ground path | PMOD contact resistance, SCK rate, hold-time in fabric driver |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Crystal MPN actually fitted (CL?) | |
| Supply / SPI master / scope IDs and calibration | |
| Unpowered resistance results (9.A) | |
| Power-on current, standalone | |
| Y1 frequency measured | |
| VERSIONR gate: rate(s) and 100× result | |
| Autonegotiation matrix results (PHYCFGR per forced mode) | |
| Link/act LED behavior | |
| ~INT capture reference | |
| Hosted rail voltage under load; soak result | |
| Cable-matrix and power-cycle-loop results | |
| Deviations, photos, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The design leans deliberately on the WIZnet reference schematic — the termination values, crystal loading, EXRES1, TOCAP/1V2OUT, RSVD/VBG handling, and the ferrite-split analog rail all match it — and adds the line's standard 100 Ω series protection and on-module pull-ups. The highest-risk items are exactly the ones no schematic check can see: LQFP-48 assembly quality, an MDI pair swap, a wrong-CL crystal (the MPN is still TBD), and the ~130 mA draw against the host PMOD rail budget. VERSIONR = 0x04 is the single most valuable bring-up gate on the board; the autonegotiation matrix and the deferred chassis-split/EMC questions are the main open items after it. Nothing here has ever been powered.