← AXC-001

Circuit review & bench-test guide

AXC-001 — W5500 SPI Ethernet PMOD module

Design-stage — board not yet fabricated

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#

3. Power and control sequence#

  1. 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.
  2. The internal 1.2 V core regulator starts (C7 4.7 µF on TOCAP, C8 10 nF on 1V2OUT — both datasheet-mandated values).
  3. 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.
  4. 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.
  5. PMODE straps are left open; internal pull-ups latch PMODE=111 (all-capable auto-negotiation) at reset, exactly as the WIZnet reference does.
  6. 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.
  7. 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#

ReferencePins/signalsIntended use
J112-pin PMOD plug, Type 2A expanded SPI1 ~CS, 2 MOSI, 3 MISO, 4 SCK, 5/11 GND, 6/12 3V3, 7 ~INT, 8 ~RST, 9/10 NC
J2HR911105A 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 pin123456789101112
Net~CSMOSIMISOSCKGND3V3~INT~RSTNCNCGND3V3

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.PartFunction and why neededIf absent/openIf shorted, wrong, or misassembled
U1WIZnet W5500, LQFP-48TCP/IP + MAC + PHY behind SPI; 8 hardware socketsNothing worksRotated 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
J2Hanrun HR911105A MagJackRJ45 + 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 connectionTD/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
Y125 MHz crystal, CL = 12 pF, 3225 4-pad (MPN still TBD: ABM8 class)PHY/PLL reference; everything times off itChip dead or SPI-only-garbage; no link everWrong CL crystal pulls frequency: Ethernet may work marginally or fail interop; GND pads (2/4) unsoldered degrades stability
C1, C218 pF C0G (Murata GRM1885C1H180JA01D)Crystal load: C = 2 × (CL − Cstray) = 2 × (12 − 3) = 18 pF, matching the WIZnet referenceOscillator may still start but off-frequencyShort kills oscillation; grossly wrong value shifts frequency — check startup and frequency, not just "it pings"
R71 MΩCrystal feedback bias (per WIZnet reference)Oscillator may fail to start at some cornersShort loads the oscillator; usually still starts but margin is gone

5.2 MDI termination and analog bias (WIZnet reference values)#

Refs.ValueFunctionIf omitted or wrong
R1, R249.9 Ω 1 % to 3V3ATX± line pull-ups: the W5500 TX driver is current-mode and needs these to develop the line voltageOpen = dead/asymmetric TX, no or unreliable link; wrong value skews amplitude and return loss
R3 + C310 Ω + 22 nFTX center-tap feed from 3V3A with local decouplingOpen R3 = no TX bias at all; open C3 = noisy TX common mode
R4 + C4, R5 + C549.9 Ω + 6.8 nF eachRX± AC terminations to GNDOpen = reflections/degraded RX, worse on long cables; shorted cap DC-loads the receive pair
C610 nFRX center-tap decoupling to GNDMore common-mode noise into the receiver
R612.4 kΩ 1 % to GNDEXRES1 bias — exact value required by the W5500 datasheet; sets internal analog currentsWrong/open value skews PHY amplitudes and can cause marginal, temperature-dependent link — measure the fitted value, this is not a ±5 % position
C74.7 µF (TOCAP)Internal 1.2 V regulator output cap, datasheet valueOpen = core-rail instability, resets/hangs
C810 nF (1V2OUT)1.2 V output decoupling, datasheet valueMarginal core noise

5.3 Host lines, LEDs, and decoupling#

Refs.ValueFunctionIf omitted or wrong
R12100 Ω seriesProtection on the module-driven MISO lineOpen = SPI reads all-zero/all-one while writes may "work"; a grossly wrong value still passes 33 MHz poorly — verify by measurement
R13100 Ω seriesSame for the module-driven ~INT lineOpen = interrupts never arrive; polling still works, which can mask it
R1010 kΩ to 3V3~INT pull-up (INTn is open-drain; pulled up on-module per line rule)Floating ~INT = phantom or missing interrupts
R1110 kΩ to 3V3~RST idle pull-upOpen + host pin floating = chip may sit in reset or bounce
R8, R9330 Ω from 3V3Green (link) / yellow (activity) LED anode feeds; W5500 LINKLED/ACTLED sinkDark LEDs (cosmetic, but the bring-up procedure below uses them)
FB1120 Ω @ 100 MHz bead (Murata BLM18AG121SN1D)Splits digital 3V3 from analog 3V3A, per the reference designOpen = entire analog bank dead (no link, SPI fine — a distinctive signature); shorted-by-substitution just weakens filtering
C9–C12100 nF on 3V3A (×4)Analog rail HF decouplingRail noise, degraded PHY sensitivity
C13100 nF on 3V3Digital rail HF decouplingRail noise near U1
C14, C1510 µF on 3V3 / 3V3ABulk per railDroop during PHY start and TX bursts
#FLG01–03ERC power flagsSchematic 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#

DeviceKey manufacturer facts used hereBoard-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 currentVERSIONR 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 11LED 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 schematic49.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 railThis 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 calculationThe 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 filmValues 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.

QuantityTargetHow to measure
3V3-to-GND resistance, unpoweredHigh (caps only), both polaritiesDMM at J1 pin 6 to 5
3V3-to-3V3A~0 Ω (through FB1)DMM
EXRES1 pad to GND12.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 VBench supply readout
Y1 oscillation25 MHz, clean sine-ish on XO; probe XI only with ≤1 pF active/low-C probe or check XO sideScope after power
VERSIONR (0x0039)0x04, every read, at every tested SCK rateSPI master read
PHYCFGR (0x002E) with cable to 100BASE-TX switchLNK=1, and SPD/DPX matching the partner (expect 100/full against a modern switch)SPI read
Green LEDOn when cable to a live partner, off when unpluggedEyes
Yellow LEDBlinks on traffic (e.g. during ping flood)Eyes
AutonegotiationLink established against 10/half, 10/full, 100/half, 100/full forced partners (PMODE=111)Managed switch or forced-mode NIC
~INTHigh idle; falls on enabled socket event; returns high after the host clears SIR/Sn_IRScope at J1 pin 7

8. Manual schematic and assembly review checklist#

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#

  1. Visual inspection under magnification: U1 all sides, Y1 pads, the termination bank, J2 solder.
  2. 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).
  3. Buzz all four MDI lines U1↔J2 and the LED network.

B. Standalone power-on (bench supply, no host, no cable)#

  1. 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.
  2. Scope Y1: 25 MHz present and stable within ~10 ms of power.
  3. Check ~RST high (R11), ~INT high (R10), both LEDs off (no cable).
  4. 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)#

  1. Connect a 3.3 V SPI master to J1 (~CS/MOSI/MISO/SCK, GND common). Start at ≤1 MHz SCK.
  2. 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.
  3. Write/read-back a scratch register (e.g. GAR/SHAR) to prove MOSI as well as MISO.
  4. 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.
  5. 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.
  6. 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)#

  1. 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).
  2. Run the spi_w5500 driver core: repeat the VERSIONR gate through fabric, first at low SCK, then at the target rate (≤33 MHz sustained).
  3. Repeat the socket/ping exercise from C.6 through fabric/AruviOS; verify interrupt-driven RX (not polled) using ~INT on pin 7.
  4. Soak: ping flood for 30 minutes; record error counters, current, and U1 temperature.

E. Robustness checks#

  1. Cable matrix: short patch, long (≥30 m) cable, crossover, and both auto-MDIX orientations.
  2. Power-cycle loop: 50 cold starts; VERSIONR gate + link-up each time.
  3. 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#

SymptomFirst measurementsLikely areas
VERSIONR never reads 0x04SCK/MOSI/~CS at U1 pins; 25 MHz at Y1; 3V3 at U1SPI wiring, R12 open (reads stuck), crystal dead, U1 solder/orientation
VERSIONR OK at 1 MHz, fails fastMISO waveform at speedR12 + stray C, long leads, SPI mode mismatch
SPI OK, never linkPHYCFGR LNK bit; 3V3A at C15FB1 open (3V3A dead), MDI pair swap, termination bank, EXRES1 value, partner/cable
Link at 100 but not 10 (or vice versa)PHYCFGR forced-mode sweepMarginal termination/crystal frequency — measure Y1 exactly
Link LED dark but PHYCFGR LNK=1LED network continuityR8 open, LED polarity (clone jack), J2 pins 9/10
No interrupts, polling worksJ1 pin 7 levelR13 open, R10 missing, Sn_IMR/SIMR not enabled
Resets/hangs under traffic1.2 V behavior via TOCAP node, rail droopC7 missing/wrong, host rail sag at ~130 mA, bulk caps
Works on bench master, flaky on FPGACompare SCK edges, ground pathPMOD contact resistance, SCK rate, hold-time in fabric driver

11. Bench record template#

FieldRecord
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.