← AXO-008

Circuit review & bench-test guide

AXO-008 — ST7735 1.8" SPI TFT carrier PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axo-008-tft carrier at component level and turns the design evidence into a manual-review and bench-test plan. It is based on generate_design.py (rev 0.1-schematic, 2026-07-12), the README, the generated schematic, the ERC report (reports/erc.rpt), and well-known Sitronix ST7735/ ST7735S facts. The ST7735S datasheet is not in the local cache and was not fetched for this revision; every controller fact below is reasoned from the README plus common ST7735 knowledge and must be re-checked against Sitronix's datasheet before release.

The board is an unfabricated prototype: schematic generated, ERC clean (0 errors / 0 warnings), netlist reviewed, no PCB layout, no fabricated board, no BOM export, no bench results. The J2 socket MPN is TBD:. The plug-in is the ubiquitous 1.8" 128×160 ST7735 SPI TFT breakout — an uncontrolled commodity part whose pinout varies between clones, so carrier validation is only meaningful against a specific purchased unit. Every expected value below is a design target to verify, not proof that an assembled board works.

1. What the board does#

The carrier hosts a common 1.8" 128×160 ST7735 SPI TFT breakout on a 1×8 socket (J2) and fans it out to a single PMOD Type 2A (SPI) plug (J1) on the ECP5 host. It is a write-only display interface: the FPGA sends init commands and RGB565 pixels over 4-wire SPI, framing each byte as command or data with the D/C (A0) line, and races the beam with no framebuffer chip in the path. There is no readback — the ST7735's MISO/read path is not brought out on the common breakout, so PMOD pin 3 is NC.

The backlight LED is driven through a 100 Ω series resistor (R3) from a 3-pad solder jumper (JP1) that selects either always-on 3V3 (default) or PWM dimming from PMOD pin 9. Idle-safety pull-ups hold ~RESET and ~CS in a defined state until the host takes over. Nothing here is display-quality qualification: color fidelity, viewing angle, and panel uniformity are commodity-breakout properties, not carrier properties.

Functional block diagram#

PMOD Type 2A (J1)                          ST7735 breakout (J2, 1x8)
  1  ~CS   ──┬── R2 10k ── 3V3 ──────────  3 CS
  2  MOSI(SDA) ──────────────────────────  6 SDA
  3  NC  (no MISO - write-only display)
  4  SCK  ───────────────────────────────  7 SCK
  7  DC (A0: data/command) ───────────────  5 A0/DC
  8  ~RST  ──┬── R1 10k ── 3V3 ───────────  4 RESET
  9  BL_PWM ─┐
             ├ JP1 [1-2 def: 3V3 | 2-3: PWM] ── R3 100R ── 8 LED
  6/12 3V3 ──┴─ C1 100nF ─ C2 10uF ─ GND ─  1 VCC
  5/11 GND ──────────────────────────────  2 GND

2. Safety and scope boundaries#

3. Power and control sequence (design intent + SPI init summary)#

At the carrier level the sequence reduces to power ordering plus the ST7735 bring-up the host must perform:

  1. Host powers the PMOD (3V3 on pins 6/12, GND on 5/11). C1/C2 decouple the socket. R1 holds ~RESET high (display out of reset by default) and R2 holds ~CS high (bus idle, no garbage clocked in) until the host drives them.
  2. The backlight follows JP1: default 1-2 lights the LED from 3V3 through R3 immediately at power-up; 2-3 leaves it dark until the host drives PMOD pin 9.
  3. Hardware reset: pulse ~RESET (PMOD pin 8) low ≥10 µs, release, then wait ≥120 ms before the first command. This is the reliable cold-start path even though R1 already holds the part out of reset.
  4. SPI init (write-only, 4-wire, mode 0): SCK idles low, D/C (A0) low = command byte, D/C high = data byte, ~CS low frames each transaction. The standard ST7735 bring-up ordered command list:
  1. Draw: set the window with CASET/RASET, issue RAMWR (0x2C), then stream RGB565 bytes (two per pixel) with D/C high. There is no readback path on the breakout, so the host must track state itself.

Maximum SCK on this design is treated as ~15 MHz per the README; confirm the panel's write-cycle timing against the Sitronix datasheet before pushing the clock. The FPGA must constrain SCK/MOSI/DC skew accordingly.

4. Plug-in module verification (read before first power)#

Mandatory section. 1.8" ST7735 breakouts are mostly-but-not-always identical, the socket is an unkeyed 1×8 that accepts a reversed module, and some clones swap VCC/GND or move the LED pin. This is the load-bearing per-unit check — getting it wrong can put 3V3 on GND or reverse the whole strip.

4.1 Pin-order check against the breakout silkscreen#

The carrier assumes the most common top-down 1×8 order:

J2 pin12345678
NetVCC (3V3)GNDCS (~CS)RESET (~RST)A0/DCSDA (MOSI)SCKLED

Procedure — breakout unplugged and carrier unpowered:

  1. Read the breakout's silkscreen for all 8 positions and write them down. Known variants swap VCC/GND (pin 1/2), and some move LED away from pin 8. Do not assume; transcribe the actual legend.
  2. Buzz the breakout's own VCC pin to its LDO/backlight-driver input and GND to its ground pour to confirm which end is pin 1 (VCC) versus pin 2 (GND).
  3. On the carrier, buzz J2 pin 1 to the PMOD 3V3 pins (6/12) and J2 pin 2 to GND (5/11); then confirm the breakout's power pair lands there in the actual insertion orientation. The 1×8 socket is unkeyed and will physically accept a 180°-flipped module — mark the correct orientation on both boards.
  4. Spot-check the five signal pins end-to-end before soldering the socket or plugging in: CS to J2 pin 3 (through the R2 node), RESET to J2 pin 4 (through the R1 node), A0/DC to J2 pin 5, SDA to J2 pin 6, SCK to J2 pin 7.
  5. If the silkscreen shows a VCC/GND-swapped clone, either re-solder the socket to match that unit or do not use it — plugging a swapped clone into the assumed-order socket applies GND to VCC and 3V3 to GND. Record the decision.
  6. Only then power up.

4.2 Plug-in key specifications (ST7735/ST7735S, reasoned from README + knowledge)#

ItemValueBench relevance
Panel / format128×160 RGB, 16-bit RGB565 (COLMOD 0x05)Framebuffer-less draw sizing
Interface4-wire SPI, write-only on this breakout (no MISO/read)No readback test; state tracked in host
SCK modeMode 0 (CPOL=0, CPHA=0), idle lowScope/logic-analyzer expectation
Max SCK~15 MHz on this design (confirm vs datasheet write cycle)HDL clock constraint
D/C (A0)Low = command, high = dataThe single framing line to verify
ResetHardware ~RESET low ≥10 µs then ≥120 ms wait; SWRESET also 120 msR1 default high; host pulses for clean start
Init orderSWRESET → SLPOUT(120 ms) → FRMCTR/PWCTR → COLMOD 0x05 → MADCTL → INV → DISPONSection 3 command list
BacklightLED pin, ~20 mA through R3 100 ΩJP1/R3 path, section 4.3
Logic rail3.3 VDo not use a 5 V host

Because the read path is not present, the AruviX family's "100 Ω on module-driven lines" rule has no lines to apply to here — every SPI line is host-driven. R3's 100 Ω is a backlight LED current limiter, not a series-termination resistor.

4.3 Backlight jumper (JP1) verification#

Before first power, inspect JP1's solder bridge and confirm the intended position:

Verify on the bench by measuring the R3 breakout-side node: ~3.3 V minus the R3 drop in 1-2 mode with backlight lit; following the PMOD-pin-9 duty cycle in 2-3 mode.

5. Component-by-component review#

Every reference designator in generate_design.py appears below. #FLG01 and #FLG02 are ERC power-flag pseudo-components on 3V3 and GND; they have no physical footprint and are listed only for completeness.

Ref.Part / valueFunction and why neededIf absent/openIf shorted, wrong, or misassembled
J1PMOD Type 2A SPI plug (2×6)Host power + SPI: pin 1 ~CS, 2 MOSI/SDA, 3 NC (no MISO), 4 SCK, 7 DC/A0, 8 ~RST, 9 BL_PWM, 10 NC, 5/11 GND, 6/12 3V3No power or no busOffset/mirrored insertion puts 3V3 on signal pins; verify pin-1 orientation against Pmod spec
J21×8 socket 2.54 mm (MPN TBD:)Socket for the ST7735 breakout, assumed order VCC/GND/CS/RESET/A0/SDA/SCK/LEDNo display connectionUnkeyed: 180° insertion or a VCC/GND-swapped clone applies 3V3/GND to the wrong pins — see section 4
R110 kΩ 0603, Yageo RC0603FR-0710KL~RESET pull-up: display out of reset until the host drives it low~RESET floats; reset level depends on FPGA pin at boot — undefined cold-startBridge to GND: display held in permanent reset, never boots
R210 kΩ 0603, Yageo RC0603FR-0710KL~CS idle pull-up: an unconfigured host cannot clock garbage into the panel~CS floats; spurious bytes may latch before the host is readyBridge to GND: CS stuck asserted; bus framing broken
R3100 Ω 0603, Yageo RC0603FR-07100RLBacklight LED series resistor (~20 mA into the breakout LED pin); doubles as the LED current limitBacklight dark (open path)Short: backlight over-current (limited only by breakout/LED); wrong large value dims the backlight
JP13-pad solder jumper, bridged 1-2 (DNP in BOM/POS)Backlight source select: 1-2 = always-on 3V3, 2-3 = PWM from PMOD pin 9Open (no bridge): backlight permanently darkAll three bridged: shorts 3V3 to PMOD pin 9; wrong position defeats the intended dimming
C1100 nF 16 V X7R, Murata GRM188R71C104KA01DHigh-frequency decoupling at the socketSPI/backlight switching noise couples into the panel railShort kills the 3V3 rail (host limit should catch it)
C210 µF 10 V X5R, Murata GRM21BR61A106KE19LBulk reservoir for display + backlight at the socketRail droop on backlight/draw transients; visible artifactsShort kills the rail
#FLG01 / #FLG02ERC power flags (3V3, GND)Schematic ERC bookkeeping onlyERC warningsNot applicable; no physical part

6. Datasheet summary and design interpretation#

DeviceKey facts (reasoned from README + common ST7735 knowledge)Board-specific interpretation
ST7735 / ST7735S128×160 RGB TFT controller; 4-wire SPI mode 0; command/data via D/C (A0); COLMOD 0x05 = RGB565; standard init SWRESET → SLPOUT(120 ms) → FRMCTR/PWCTR → COLMOD → MADCTL → INV → DISPON; hardware reset ≥10 µs low then ≥120 ms; write-only on this breakout (no MISO)15 MHz SCK target and RGB565 are inside typical ST7735 capability; MADCTL is the orientation/RGB-BGR knob clones vary on; all lines host-driven, so no module-driven-line 100 Ω rule applies
1.8" breakoutUncontrolled commodity: pin order, LDO/backlight arrangement, and MADCTL RGB/BGR default vary between clonesPer-unit verification (section 4) is part of the design, not optional
Yageo RC0603 / Murata GRMThick-film 1 % resistors; X7R/X5R ceramicsUncritical

No datasheet was fetched for this revision — the ST7735S datasheet is not in the local cache. Confirm the exact init sequence, max SCK write-cycle time, and MADCTL bit definitions against Sitronix's datasheet (and the specific breakout vendor's reference init) before release.

7. Expected values before bench testing#

All are design targets assuming 3V3 = 3.300 V, not measured results.

QuantityDesign targetWhat to measure
3V3 at J2 pin 1 (assumed order)3.3 VDMM
GND at J2 pin 20 VDMM
Supply current, backlight on, idle~20–40 mA (backlight dominates)Host/bench rail delta
~RESET idle level (R1)~3.3 VDMM at J2 pin 4 node, host tristated
~CS idle level (R2)~3.3 VDMM at J2 pin 3 node, host tristated
R1, R210 kΩ to 3V3Ohmmeter
R3100 Ω, BL_SRC to LED pinOhmmeter
Backlight current~20 mA (JP1 1-2)Rail delta with/without backlight
SCKmode 0, idle low, ≤15 MHzScope at J1 pin 4 / J2 pin 7
D/C (A0)low during command bytes, high during dataLogic analyzer at J2 pin 5
Reset pulse≥10 µs low then ≥120 ms waitScope at J2 pin 4
First visible outputcolor fill / test pattern after DISPONVisual

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record board serial, host identity, the purchased breakout's silkscreen map and orientation, JP1 state, SCK frequency, and measured 3V3.

Two contexts throughout: (a) PMOD host — plug into a 3.3 V PMOD port on the ECP5 host (ULX3S-class) driving the ST7735 init/draw core; (b) standalone 3.3 V bench — wire 3V3/GND from a current-limited supply and CS/MOSI/SCK/DC/ RST/BL to a 3.3 V SPI adapter (Pi Pico, FT2232H, Bus Pirate) running a known ST7735 library.

A. Unpowered inspection and resistance tests#

  1. Complete the section 8 checklist and the section 4.1 buzz-out/orientation marking under magnification (socket empty).
  2. Measure 3V3-to-GND resistance in both meter polarities; investigate < 1 kΩ before applying power.
  3. Confirm R1 (~RESET) and R2 (~CS) each read ~10 kΩ to 3V3, and R3 reads ~100 Ω from BL_SRC to the LED pin.
  4. Verify JP1 continuity: bridged 1-2 (default) means 3V3 reaches BL_SRC; 2-3 means PMOD pin 9 reaches BL_SRC. Confirm all three pads are not bridged.

B. First power, no SPI traffic#

  1. With the breakout socketed in the verified orientation, apply power (context a or b). Watch the current limit.
  2. Measure 3V3 at J2 pin 1 and 0 V at J2 pin 2. Measure supply current.
  3. Confirm ~RESET and ~CS both sit near 3.3 V (pull-ups working, host tristated).
  4. Backlight: in JP1 1-2 the backlight should light immediately (~20 mA rail delta); in JP1 2-3 it stays dark until pin 9 is driven — confirm the expected behavior for the fitted jumper before suspecting a fault.

C. Reset and SPI framing#

  1. Pulse ~RESET (PMOD pin 8) low ≥10 µs, release, wait ≥120 ms. Scope the pulse at J2 pin 4.
  2. On a logic analyzer at the socket, confirm SCK idles low (mode 0), ~CS frames each transaction low, and D/C (A0) is low during the first command bytes. This proves the framing line before any pixels.
  3. Send SWRESET (0x01), wait 120 ms; SLPOUT (0x11), wait 120 ms. No visible change yet (display still off) — this only proves the write path clocks.

D. Init sequence and first pixels#

  1. Run the full init: FRMCTR/PWCTR (breakout reference values), COLMOD = 0x05 (RGB565), MADCTL (start with the vendor library's value), INV as required, DISPON (0x29).
  2. Set a full-screen window (CASET 0x2A / RASET 0x2B for 128×160), issue RAMWR (0x2C), and stream a solid color fill (two RGB565 bytes/pixel, D/C high). Expect a uniform screen in the commanded color.
  3. Color order check: fill pure red, green, blue in turn. If red and blue are swapped, the panel is BGR rather than RGB — flip the MADCTL RGB/BGR bit and re-test. This is the most common per-clone difference.
  4. Orientation check: draw an asymmetric pattern (e.g., a filled corner marker) and confirm origin/rotation match your MADCTL choice; adjust the row/column/exchange bits as needed and record the final MADCTL value for this breakout.

E. Draw performance and backlight control#

  1. Push a full-frame animation at the target SCK (up to ~15 MHz). Confirm no tearing artifacts beyond the expected framebuffer-less beam race, and that MOSI/DC hold against SCK at rate (widen the clock constraint if bytes drop).
  2. Backlight PWM (only if JP1 is 2-3): drive PMOD pin 9 with a PWM waveform and confirm brightness tracks duty cycle; scope the R3 breakout-side node. In JP1 1-2 the backlight is fixed-on and pin 9 has no effect — expected.
  3. 30-minute soak: continuous draw, confirm the image is stable, rail current steady, and socket/backlight temperature reasonable.

F. Release-only tests#

Panel color/uniformity grading, EMC, ESD, and long-cable SPI integrity are out of scope for the first article and require controlled plans. The TBD: socket MPN and BOM availability must be closed before any production release.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
No power / rail collapses3V3-to-GND resistance, current limitReversed/rotated breakout, VCC/GND-swapped clone, C1/C2 short
Backlight dark, SPI worksJP1 position, R3 node voltageJP1 in 2-3 with pin 9 undriven (expected), JP1 open, R3 open
Backlight-only, blank panel~RESET level, init logReset never released/pulsed, init sequence not sent, MISO-less state desync
Nothing on screen after initD/C framing, SCK modeD/C stuck (command vs data), SCK not mode 0, DISPON not sent, wrong window
Red/blue swappedMADCTL RGB/BGR bitBGR-order clone — flip MADCTL bit
Mirrored / rotated imageMADCTL row/col/exchange bitsOrientation bits vs physical mounting
Garbage/partial pixels at speedSCK frequency vs bytes landedAbove ~15 MHz or skew; tighten timing constraints
Intermittent glitches on draw3V3 droop at C2, socket contactDecoupling, socket seating, rotated/loose module
Held in reset~RESET voltage, R1R1 bridged to GND, host driving reset low, socket pin 4 mis-mapped

11. Bench record template#

FieldRecord
Board serial / assembly variant
Breakout source, 1×8 silkscreen map, orientation photos
VCC/GND-swap clone? decision recorded
JP1 state (1-2 / 2-3 / other) as inspected
Host context (PMOD FPGA / standalone adapter) and IDs
Measured 3V3 and supply current (backlight on/off)
R1 / R2 / R3 measured values
Reset pulse width capture
SCK frequency / mode capture
Init sequence used; final MADCTL value
Color-order (RGB/BGR) and orientation result
Backlight fixed-on / PWM result
30-minute soak result
Deviations, captures, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The design is a clean minimal ST7735 carrier: a single PMOD Type 2A SPI plug, idle-safety pull-ups on ~RESET and ~CS, a backlight source-select jumper with a 100 Ω current limit, and socket decoupling. Because the breakout exposes no read path, every SPI line is host-driven and the family's 100 Ω module-driven-line rule correctly has nothing to apply to — a fact the design states rather than silently omits. The datasheet-anchored constants (RGB565 COLMOD 0x05, mode-0 SPI, ~120 ms reset, the SWRESET→SLPOUT→COLMOD→MADCTL→DISPON init) give the bench plan objective bring-up gates. The principal risks are (1) the unkeyed 1×8 socket and the VCC/GND-swapped clone problem, which make the per-unit pin-order check (section 4) load-bearing; (2) MADCTL RGB/BGR and orientation defaults that vary per breakout and must be found empirically; (3) everything layout-dependent — socket orientation silkscreen, decoupling placement, SCK integrity — which exists only as intent today; and (4) the absence of any fabrication, BOM export, HDL core, or bench evidence at this revision, plus a TBD: socket MPN and a controller datasheet that was reasoned from knowledge rather than fetched.