Circuit review & bench-test guide
AXL-007 — I2C hub PMOD module (TCA9548A)
Document purpose#
This document explains the axl-007-i2c-hub prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic, 2026-07-12), the README, and the TI TCA9548A datasheet.
The board is a design-stage prototype. The schematic is generated and ERC clean per reports/erc.rpt (2026-07-12: 0 errors / 0 warnings, with the standard ignored-check list) and the netlist has been reviewed, but PCB layout has not started and no board has been fabricated or assembled. There is no first-article bench result of any kind. Every expected value below is a design target to verify, not proof that an assembled board works.
1. What the board does#
The board is a 12-pin PMOD (Type 6 extended, I2C) module carrying a TI TCA9548A 8-channel bidirectional I2C switch. The upstream PMOD bus (SCL/SDA on pins 3/4, repeated on 9/10) fans out to mux channels 0–3, each terminated in a Qwiic socket (JST SM04B-SRSS-TB). Writing one control byte to address 0x70 connects any channel — or combination of channels — to the upstream pair, which resolves address clashes when a class chains many identical sensor modules: two same-address sensors on two channels is the canonical demo. Channels 4–7 are unconnected in rev 1 (four Qwiic sockets are what fits the 20 mm module outline).
Upstream pull-ups (4.7 kΩ, removable via solder jumpers JP1/JP2) follow the lab-line convention. Each downstream channel carries its own fixed 4.7 kΩ pull-up pair — a deselected mux segment is electrically floating and cannot borrow the upstream pull-ups; this is the schematic's stated lesson. ~RESET is host-driven directly on PMOD pin 2 with a 10 kΩ default-run pull-up (R11), so the hub runs unless the host deliberately resets it.
Functional block diagram#
PMOD J1 U1 TCA9548A (TSSOP-24)
2 RESET_N ──┬────────────── ~RESET (pin 3)
└─ R11 10k ── 3V3
3/9 SCL ──┬── JP2 ── R2 4.7k ── 3V3 SCL ──┐ 8-ch switch, ctrl reg
4/10 SDA ──┴── JP1 ── R1 4.7k ── 3V3 SDA ──┤ addr 0x70 (A0-A2 = GND)
5/11 GND, 6/12 3V3 ── C1 100n, C2 1u ── VCC = 3V3, GND
│
ch0: SD0/SC0 ── R3/R4 4.7k to 3V3 ── J2 Qwiic (1 GND, 2 3V3, 3 SDA, 4 SCL)
ch1: SD1/SC1 ── R5/R6 4.7k to 3V3 ── J3 Qwiic
ch2: SD2/SC2 ── R7/R8 4.7k to 3V3 ── J4 Qwiic
ch3: SD3/SC3 ── R9/R10 4.7k to 3V3 ── J5 Qwiic
ch4-7: SD4-7/SC4-7 no-connect (rev 1)
2. Safety and scope boundaries#
- The whole module — VCC, upstream bus, every downstream segment, and Qwiic power — lives on one 3.3 V rail. Never plug it into a 5 V PMOD host, and never wire a 5 V-driven bus segment into a Qwiic socket: the TCA9548A's I/O pins are 5 V tolerant, but every pull-up and every attached Qwiic device here is 3.3 V.
- The Qwiic sockets pass 3V3 straight through from the PMOD rail with no per-socket fuse or switch. The host's PMOD supply limit is the only protection; budget total downstream current accordingly.
- Standalone bench work uses a current-limited 3.3 V supply (limit ~100 mA; the mux itself draws microamps, attached Qwiic devices dominate).
- Earth-referenced oscilloscope grounds clip only to board GND.
- The mux passes signals; it does not buffer, retime, or level-shift rise times. Total bus capacitance of the upstream segment plus every selected downstream segment must stay within the 400 pF I2C budget.
- A clean control-register readback proves the mux answers; it says nothing about the devices behind it or about signal integrity at 400 kHz with long Qwiic cables.
3. Power and control sequence#
- 3V3 and GND arrive on PMOD pins 6/12 and 5/11; C1 (100 nF) decouples U1 and C2 (1 µF) provides module bulk.
- The TCA9548A's internal power-on reset holds it in reset until VCC passes V_PORR (1.2 V typ, 1.5 V max). Registers and the I2C state machine then initialize to all zeroes: the control register reads 0x00 and all eight channels are deselected at power-up (datasheet Section 7.4.2). Every downstream segment sits isolated, held at 3V3 by its own pull-up pair.
- A0–A2 are hardwired to GND, so the device answers at 7-bit address 0x70 (1110000b). There are no address straps on this board.
- ~RESET idles high through R11 (10 kΩ). The host may drive PMOD pin 2 low (≥6 ns) at any time: registers and state machine reset, all channels deselect, and a stuck SDA is released within 500 ns (datasheet 7.4.1, 5.7/5.8). If the host leaves pin 2 floating, R11 keeps the hub running.
- The host writes a single control byte — no register pointer exists — where bit n enables channel n. It then addresses downstream devices as if they were alone on the bus. Reading one byte from 0x70 returns the control register.
- Deselecting (write 0x00) or resetting returns every segment to its isolated, pulled-up idle state.
4. Interfaces and pin maps#
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | NC | RESET_N | SCL | SDA | GND | 3V3 | NC | NC | SCL | SDA | GND | 3V3 |
Qwiic sockets (all four identical; standard Qwiic pinout):
| Socket | Mux channel | Pin 1 | Pin 2 | Pin 3 | Pin 4 |
|---|---|---|---|---|---|
| J2 | 0 | GND | 3V3 | SD0 | SC0 |
| J3 | 1 | GND | 3V3 | SD1 | SC1 |
| J4 | 2 | GND | 3V3 | SD2 | SC2 |
| J5 | 3 | GND | 3V3 | SD3 | SC3 |
U1 connections actually used (TSSOP-24 pin numbers per datasheet Table 4-1): A0/A1/A2 (pins 1/2/21) = GND, ~RESET (3) = RESET_N, SD0–SD3/SC0–SC3 (4–11) = channels 0–3, GND (12), SD4–SD7/SC4–SC7 (13–20) = no-connect, SCL (22), SDA (23), VCC (24) = 3V3.
I2C address strap review (datasheet Table 7-1 vs this board):
| A2 A1 A0 wiring | 7-bit address | Available on this board? |
|---|---|---|
| GND GND GND | 0x70 (1110000b) | Yes — hardwired, the only option |
| any pin to VCC | 0x71–0x77 | No — A0–A2 are not strapped or jumpered |
So exactly one AXL-007 can sit on an upstream bus (a second hub would clash at 0x70 unless placed behind a channel of the first — legal, but untested). The 0x70–0x77 range also collides with some Qwiic devices (e.g. other muxes, some LED drivers); keep such parts downstream, never upstream.
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 / value | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J1 | 12-pin PMOD plug (I2C, doubled on pins 9/10; pin 2 = RESET_N) | Host power, upstream I2C, and reset connection | No power or bus | Offset insertion puts 3V3 on signal pins; verify orientation |
| U1 | TI TCA9548APWR, TSSOP-24 (PW) | 8-channel translating I2C switch with reset — the entire module function | No channel selection; downstream segments permanently isolated | Rotated package scrambles the pinout (VCC is diagonal from A0); SDA/SCL bridge hangs the upstream bus; a bridged SCn/SDn pair hangs one channel |
| J2 | JST SM04B-SRSS-TB(LF)(SN) Qwiic, channel 0 | Downstream socket: 1 GND, 2 3V3, 3 SD0, 4 SC0 | Channel 0 unusable | Mirrored footprint swaps GND/SCL ends and back-feeds attached devices; the JST SH shell is keyed, so raw miswiring needs a wrong footprint, not a wrong cable |
| J3 | Same, channel 1 | Same for SD1/SC1 | Channel 1 unusable | Same as J2 |
| J4 | Same, channel 2 | Same for SD2/SC2 | Channel 2 unusable | Same as J2 |
| J5 | Same, channel 3 | Same for SD3/SC3 | Channel 3 unusable | Same as J2 |
| R1 | 4.7 kΩ 0603 (Yageo RC0603FR-074K7L) | Upstream SDA pull-up (3V3 to SDA_PU, through JP1) | Upstream bus works only if the host provides pull-ups | Too small stiffens the bus; parallels with host pull-ups if both present |
| R2 | 4.7 kΩ 0603 | Upstream SCL pull-up (through JP2) | Same as R1 | Same as R1 |
| R3 | 4.7 kΩ 0603 | Channel 0 SDA pull-up — fixed, no jumper: a deselected segment floats otherwise | Segment idles undefined when no device with its own pull-ups is attached; glitches on every channel switch | Short to 3V3 holds SD0 high permanently, channel 0 dead |
| R4 | 4.7 kΩ 0603 | Channel 0 SCL pull-up (fixed) | Same as R3 | Same as R3 |
| R5 | 4.7 kΩ 0603 | Channel 1 SDA pull-up | Same as R3 | Same as R3 |
| R6 | 4.7 kΩ 0603 | Channel 1 SCL pull-up | Same as R3 | Same as R3 |
| R7 | 4.7 kΩ 0603 | Channel 2 SDA pull-up | Same as R3 | Same as R3 |
| R8 | 4.7 kΩ 0603 | Channel 2 SCL pull-up | Same as R3 | Same as R3 |
| R9 | 4.7 kΩ 0603 | Channel 3 SDA pull-up | Same as R3 | Same as R3 |
| R10 | 4.7 kΩ 0603 | Channel 3 SCL pull-up | Same as R3 | Same as R3 |
| R11 | 10 kΩ 0603 (Yageo RC0603FR-0710KL) | ~RESET pull-up: hub runs unless the host drives PMOD 2 low; datasheet requires the pin pulled up when unused | ~RESET floats — spurious resets, channels drop randomly | Short to 3V3 defeats host reset (recovery from a stuck bus then needs a power cycle) |
| C1 | 100 nF 16 V X7R (Murata GRM188R71C104KA01D) | U1 decoupling | Noisier switching, worse transient immunity | Short kills the rail (host/supply limit should catch it) |
| C2 | 1 µF 10 V X7R (Murata GRM188R71A105KA61D) | Module bulk decoupling for hot-plugged Qwiic loads | Rail dips on Qwiic hot-insert | Same as C1 |
| JP1 | 2-pad solder jumper, bridged (DNP in BOM/POS) | Disconnects R1 when the host or a chained module provides the upstream SDA pull-up | If cut with no other SDA pull-up: upstream bus hangs | Re-bridge with solder to restore |
| JP2 | 2-pad solder jumper, bridged | Same for SCL/R2 | Same as JP1 | Same as JP1 |
| #FLG01/#FLG02 | ERC power flags (3V3, GND) | Schematic ERC bookkeeping only | ERC warnings | Not applicable; no physical part |
Note there are deliberately no jumpers on the downstream pull-ups (R3–R10). If a Qwiic device that carries its own pull-ups (common; often 2.2 kΩ) is attached, the segment's effective pull-up drops to ~1.5 kΩ and the upstream-plus-segment total when selected approaches the 3 mA I2C sink budget. One device per channel is the design intent; daisy-chaining several pull-up-equipped Qwiic boards on one channel needs a pull-up audit.
6. Datasheet summary and design interpretation#
Consulted: TI TCA9548A datasheet SCPS207H (May 2012 – revised September 2024), <https://www.ti.com/lit/ds/symlink/tca9548a.pdf>, product page <https://www.ti.com/product/TCA9548A>.
| Manufacturer fact (SCPS207H) | Board-specific interpretation |
|---|---|
| Supply 1.65–5.5 V (1.65–3.6 V above 85 °C); I_CC 6 µA typ at 100 kHz / 3.6 V, 20 µA typ at 400 kHz / 3.6 V, standby 0.1 µA typ | 3.3 V PMOD rail fits; the mux itself is negligible next to pull-up and Qwiic-device current |
| Single 8-bit control register, no register pointer: the data byte follows the address directly on writes; a 1-byte read returns the register (Sections 7.5.3, Figure 7-4) | Exact wire bytes in Section 9.C; there is nothing else to configure |
| Power-on reset initializes registers and state machine to all zeroes — all channels deselected (7.4.2); V_PORR 1.2 V typ / 1.5 V max rising, V_PORF 1 V typ falling | First readback after power-up must be 0x00; any other value means a prior write survived or the part never reset |
| A2–A0 select 0x70–0x77 (Table 7-1) | All three grounded here: 0x70 only, one hub per upstream bus |
| ~RESET active low, t_W(L) ≥ 6 ns; resets registers/state machine, deselects all channels, releases a stuck SDA within 500 ns; must be pulled up if unused (7.4.1, 5.7, 5.8) | Routed to PMOD 2 with R11 10 kΩ — the deliberate recovery path for a hung downstream segment (Section 9.G) |
| Switch R_ON 5–30 Ω (12 Ω typ) at VCC 3–3.6 V, V_O = 0.4 V, I_O = 15 mA | Adds ~10–20 mV to downstream low levels at typical bus currents — measurable, harmless |
| Pass-gate switch output V_o(sw) only ~1.9 V typ at VCC = 3.3 V with a −100 µA load: the switch cannot pull a segment high; the external pull-ups on each side set the high level (Section 5.5; Description) | This is why R3–R10 exist per channel: a deselected segment has no path to any pull-up and floats |
| Voltage translation: each SCn/SDn pair may run at its own pull-up voltage (1.8/2.5/3.3 vs 5 V), with VCC limiting the passed high level | Unused here: every segment's pull-ups and Qwiic power pin are the same 3V3 rail. Do not retrofit a 5 V segment — the sockets feed devices 3V3 regardless |
| I2C standard (0–100 kHz) and fast (0–400 kHz) modes; C_b budget 400 pF per bus line; I/O 5 V tolerant | Bring up at 100 kHz, run at 400 kHz; selected segments' capacitance adds to the upstream bus (multi-select worsens this) |
| Any combination of channels may be enabled simultaneously (Description) | Legitimate for broadcasting writes to identical devices; never for reads of same-address devices (collisions) — see Section 9.H |
Check the latest datasheet revision before procurement.
7. Expected values before bench testing#
Targets assume VDD = 3.300 V and address 0x70. All are design targets, not measured results.
| Quantity | Design target / calculated | What to measure |
|---|---|---|
| Supply current, no Qwiic devices, bus idle | ~0.1–2 µA device + leakage | Bench supply, standalone context |
| Supply current, 100 kHz traffic, no devices | ~6 µA device + ~0.7 mA per line held low (3.3 V / 4.7 kΩ) averaged by duty | Same |
| VCC at U1 pin 24 | 3.300 V | DMM |
| RESET_N idle (PMOD 2 open) | 3.3 V through R11 | DMM |
| SDA (and SCL) to 3V3, unpowered, JP1/JP2 bridged | ~4.7 kΩ | Ohmmeter |
| Each SDn/SCn to 3V3, unpowered | ~4.7 kΩ (all channels off when unpowered; segments isolated) | Ohmmeter, all 8 downstream pins |
| Any SDn to upstream SDA, unpowered | Open (>1 MΩ apart from the two pull-ups in series via 3V3, ~9.4 kΩ) | Ohmmeter — note the 9.4 kΩ through-the-rail path is normal |
| I2C scan, upstream | ACK only at 0x70 (no devices attached, all channels off) | Adapter address scan |
| Control register at power-up | 0x00 | First read, Section 9.C |
| Readback after each select write | Echoes the written byte exactly | Section 9.C walk |
| Idle level, every SDn/SCn, powered, deselected | 3.3 V (own pull-ups — the lesson) | DMM/scope at each Qwiic pin 3/4 |
| Low level at a selected Qwiic pin while host drives upstream low | V_OL(host) + I_seg × R_ON ≈ host low + ~10–20 mV (R_ON 12 Ω typ, 30 Ω max) | Scope, Section 9.F |
| Effective pull-up, channel N selected, bare segment | R1 ∥ R_chN ≈ 2.35 kΩ → ~1.4 mA sink at low | Calculated; verify low levels |
| Same with one pull-up-equipped Qwiic device (assume 2.2 kΩ) | ≈ 1.16 kΩ → ~2.8 mA sink — at the I2C 3 mA budget | Audit each attached device |
| ~RESET recovery | Pulse ≥ 6 ns low; SDA released ≤ 500 ns; register reads 0x00 after | Section 9.G |
8. Manual schematic and assembly review checklist#
- Confirm U1 orientation (pin 1 = A0, adjacent to the ~RESET pin 3 corner) and the PWR suffix (TSSOP-24/PW).
- Verify A0, A1, A2 (pins 1, 2, 21) all land on GND — the address is hardwired, so a lifted pin silently moves the device to 0x71–0x74.
- Verify JP1/JP2 are bridged for a single-module build.
- Measure R1/R2 = 4.7 k from SDA/SCL to 3V3; R3–R10 = 4.7 k from each Qwiic pin 3/4 to 3V3; R11 = 10 k from RESET_N to 3V3.
- Buzz PMOD pins 3-to-9 (SCL) and 4-to-10 (SDA) — they are paired nets.
- Check each Qwiic socket's pin 1 is GND and pin 2 is 3V3 (a mirrored footprint powers attached devices backwards).
- Confirm SD4–SD7/SC4–SC7 (U1 pins 13–20) are genuinely unconnected — no accidental bridges to the channel 0–3 nets on the 0.65 mm-pitch TSSOP.
- Check C1 placement close to U1 pin 24 during layout review (layout not yet started — carry forward).
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, host identity, bus speed, measured VDD, and the identity of every attached Qwiic device.
A. Unpowered inspection and resistance tests#
- Complete the checklist above under magnification.
- Measure 3V3-to-GND resistance in both polarities; investigate < 1 kΩ.
- Confirm SDA, SCL, and all eight SDn/SCn pins each read ~4.7 kΩ to 3V3, RESET_N reads ~10 kΩ to 3V3, and no signal is shorted to a neighbor or to GND.
B. First power, no I2C traffic, no Qwiic devices#
Context (a) — PMOD host: plug into a 3.3 V PMOD port on the ECP5 host (ULX3S-class) with the FPGA unconfigured. Context (b) — standalone: wire 3V3/GND from a current-limited bench supply and SDA/SCL from a 3.3 V lab adapter (Raspberry Pi Pico, FT2232H, Bus Pirate — I2C mode); leave RESET_N open (R11 holds it high) or wire it to an adapter GPIO for Section 9.G.
- Supply current in the microamp band; SDA, SCL, RESET_N, and all eight downstream SDn/SCn pins sit at 3.3 V. A downstream pin at 3.3 V with all channels off is the per-channel pull-ups doing their job.
- Measure VCC at U1 pin 24.
C. Control-register bring-up (exact bytes)#
Bus speed 100 kHz for bring-up. Address 0x70 means write byte 0xE0 and read byte 0xE1 on the wire. The TCA9548A has a single control register and no register pointer: a write is address + one data byte, a read is address + one returned byte — nothing else.
- Power-up readback.
S 0xE1 [byte] P. Expect 0x00 — all channels deselected, per the power-on reset. An ACK on 0xE1 at all is the first pass criterion; NACK means solder or address trouble (A0–A2 are hardwired, so there is no strap to check — go to U1 pins 1/2/21). - Channel walk with readback. For each pattern, write then read:
| Write on the wire | Selects | Readback expected |
|---|---|---|
S 0xE0 0x01 P | channel 0 (J2) | S 0xE1 → 0x01 |
S 0xE0 0x02 P | channel 1 (J3) | 0x02 |
S 0xE0 0x04 P | channel 2 (J4) | 0x04 |
S 0xE0 0x08 P | channel 3 (J5) | 0x08 |
S 0xE0 0x10 P | channel 4 — no external segment on this board | 0x10 |
S 0xE0 0x20 P | channel 5 — same | 0x20 |
S 0xE0 0x40 P | channel 6 — same | 0x40 |
S 0xE0 0x80 P | channel 7 — same | 0x80 |
S 0xE0 0x00 P | nothing (all off) | 0x00 |
S 0xE0 0x03 P | channels 0 and 1 together | 0x03 |
Every readback must echo the write exactly. 0x10–0x80 are register-only checks here: the register accepts them, but the switch outputs go to unconnected pins (rev 1). Multi-select (0x03 and similar) is legitimate only for broadcasting writes to identical devices — reading two same-address devices at once corrupts data (both drive SDA); see 9.H.
- Finish with
S 0xE0 0x00 Pand confirm 0x00 back.
D. Per-channel bus scan with one device#
- Attach one known-good Qwiic device (e.g. an AXS-line sensor module) to J2. With the control register at 0x00, scan the upstream bus: only 0x70 ACKs — the device is invisible.
- Write
0xE0 0x01, rescan: the device's address now ACKs alongside 0x70. - Write
0xE0 0x02(wrong channel), rescan: the device disappears again. - Move the device to J3, J4, J5 in turn and repeat with 0x02/0x04/0x08. Each socket must make the device appear only under its own bit.
E. Downstream isolation with two same-address devices#
This is the board's reason to exist. Use two devices with the same I2C address whose readings can be told apart — e.g. two AXS-032 ADS1115 modules both strapped 0x48, one with AIN0 grounded and one with AIN0 on a divider, or two identical temperature sensors with one warmed.
- Device A on J2 (channel 0), device B on J3 (channel 1). Control register 0x00: scan shows neither ACKs at 0x48; only 0x70 answers.
S 0xE0 0x01 P: scan shows 0x48. Read the distinguishing value — it must match device A (e.g. the grounded-input reading).S 0xE0 0x02 P: scan again shows 0x48 — same address, but the reading must now match device B. The same address answering with physically different data under different control bytes is the pass criterion.S 0xE0 0x00 P: neither device ACKs at 0x48 again.- Negative test:
S 0xE0 0x03 P(both channels), then attempt a read at 0x48 — expect corrupted/ANDed data or an analyzer error, never trust it. This demonstrates why multi-select reads of clashing addresses are illegal; a broadcast write (e.g. the same config to both ADCs) is the one legitimate multi-select use with clashing addresses.
F. Per-channel pull-up and low-level checks#
Upstream pull-ups are R1/R2 behind JP1/JP2; every downstream segment has fixed R3–R10. No segment on this board relies on the attached device's pull-ups — the fixed pairs guarantee a defined idle even with bare-die-style modules attached.
- Unpowered, jumpers bridged: each channel's SDA/SCL (Qwiic pins 3/4) to 3V3 reads ~4.7 kΩ; upstream SDA/SCL likewise ~4.7 kΩ.
- Unpowered, JP1/JP2 cut (do this once, deliberately, then re-bridge): upstream SDA/SCL to 3V3 goes open (megohms); the downstream readings do not change — proving the downstream pull-ups are jumper-independent. Re-bridge and re-verify ~4.7 kΩ before proceeding.
- Powered, channel 0 selected, host driving SDA low at 100 kHz: scope upstream SDA and J2 pin 3 together. The downstream low sits above the upstream low by I × R_ON — expect ~10–20 mV at ~1.4 mA (bare segment). Both lows must stay below 0.4 V. Repeat per channel.
- With a pull-up-equipped Qwiic device attached, recompute the sink current (Section 7 table); if the combined pull-up drops below ~1.1 kΩ, document it — the design intent is one device per channel.
G. Stuck-bus isolation and ~RESET recovery (deliberate fault)#
The mux's ability to fence off a hung segment is a feature; test it on purpose.
- All channels off. Short J2 pin 3 (SD0) to GND through a 100 Ω resistor — a simulated device holding SDA low. Upstream scan still works and 0x70 still ACKs: the fault is invisible while channel 0 is deselected.
S 0xE0 0x01 P: upstream SDA is now held low through the switch. The bus is hung — the mux itself can no longer be addressed (no START can form). Confirm the adapter reports bus-busy/timeout.- Recover via ~RESET: pulse PMOD pin 2 low (any pulse ≥ 6 ns; a GPIO or a momentary jumper to GND through the 10 kΩ source impedance of R11 is fine). Upstream SDA must release within 500 ns; the control register reads 0x00; a scan works again with the fault still physically present on the (now deselected) segment.
- Context (a): drive PMOD 2 from an FPGA GPIO — this is the reset line the eventual HDL lab must own. Context (b): if the adapter has no spare GPIO, a power cycle is the fallback recovery; note it in the record.
- Remove the short; verify channel 0 works again (Section 9.D step 2).
H. Multi-select, speed, and host-integration tests#
- Broadcast-write demo: two identical devices on channels 0/1, control register 0x03, one configuration write — then select each channel alone and confirm both devices took the config. Reads stay single-channel.
- 400 kHz fast-mode regression of 9.C–9.E, with the longest intended Qwiic cables attached: multi-select adds every selected segment's capacitance to the upstream bus, so check rise times against the 400 pF budget at 0x0F (all four channels — the worst legitimate case on this board).
- In the PMOD-host context, run the eventual I2C-master + mux-select HDL lab against Sections 9.C–9.E as its acceptance test.
- Temperature, EMC, and long-cable characterization are out of scope for the first article.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| No ACK at 0x70 | SDA/SCL idle levels, RESET_N level | RESET_N stuck low (host pin or R11), TSSOP solder, pull-ups missing (JP1/JP2 cut with no host pull-ups) |
| ACK at 0x71–0x77 instead | A0/A1/A2 pin voltages (all must be 0 V) | Lifted or bridged address pin — the address is hardwired, so this is a solder defect |
| Control register not 0x00 at power-up | Repeat after clean power cycle; watch VCC ramp | Supply never dropped below V_PORF (~1 V) between "power cycles"; a prior write survived |
| Readback differs from write | Bus analyzer capture of the write | Missing STOP, adapter sending a register pointer byte (there is none — that byte becomes the control value), solder |
| Device visible with channel off | Readback of control register | Register not actually 0x00; SCn/SDn solder bridge to the upstream pins |
| Device invisible with channel on | Idle level at the Qwiic pins, readback | Wrong bit for that socket (J2=0x01 … J5=0x08), segment pull-up open, device unpowered (socket pin 2) |
| Two same-address devices both respond | Control register value | Multi-bit pattern written accidentally (e.g. 0x03) |
| Upstream bus hangs after a select | Which line is low; deselect via ~RESET | Stuck-low downstream device or short on the selected segment — the 9.G scenario in the wild |
| ~RESET pulse does not recover | RESET_N voltage during pulse, t < 6 ns? | R11 shorted, pulse never reaches U1 pin 3, upstream (not downstream) fault |
| Downstream low level high by tens of mV | Segment sink current, R_ON estimate | Normal I×R_ON up to ~30 Ω worst case; investigate only if > ~100 mV |
| Glitches on downstream lines at channel switch | Scope SDn/SCn during select/deselect | Missing/open per-channel pull-up (R3–R10) — the exact failure the fixed pull-ups exist to prevent |
| Fast-mode failures with long cables | Rise time vs 400 pF budget | Too many selected segments, cable capacitance; drop to 100 kHz or select fewer channels |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Host context (PMOD FPGA / standalone adapter) and IDs | |
| JP1/JP2 states as inspected | |
| Bus speed(s) used | |
| Measured VDD | |
| Power-up control-register readback (expect 0x00) | |
| Channel walk (0x01…0x80, 0x00, 0x03) readbacks | |
| Per-channel scan results (device visible/invisible per bit) | |
| Two-device isolation result (addresses, distinguishing readings) | |
| Per-channel pull-up resistances and low-level captures | |
| Stuck-bus + ~RESET recovery result | |
| Multi-select broadcast-write result | |
| 100 kHz vs 400 kHz comparison, cable lengths | |
| Deviations, captures, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The design applies the TCA9548A's application guidance directly and gets the one non-obvious requirement right: fixed pull-up pairs on every downstream segment, because a deselected pass-gate segment floats and the switch itself cannot pull anything high. The hardwired 0x70 address, the host-driven ~RESET with a default-run pull-up (making stuck-bus recovery a first-class, testable path), and the register-only handling of the unconnected channels 4–7 are all coherent with the single-rail 3.3 V lab-line architecture. No discrepancy was found between the README and the generated schematic.
The principal open risks are that no PCB exists yet (layout, TSSOP-24 escape, and Qwiic socket orientation unverified), the single hardwired address (one hub per bus, and 0x70 collides with other mux-family Qwiic parts), the unfused 3V3 pass-through to four hot-pluggable sockets, pull-up stacking when attached Qwiic devices carry their own resistors (the combined sink current approaches the 3 mA I2C budget), and the fact that every expected value in this guide — including all control-register behavior — is taken from the datasheet rather than measured on hardware.