SPI Chip-Select & Fanout: Decode Trees, Daisy-Chains, Many Slaves
← Back to: I²C / SPI / UART — Serial Peripheral Buses
Scale SPI to many slaves by treating Chip-Select as a system contract: only one device is ever active, switching windows are budgeted, and default-safe gating prevents accidental selects.
This page shows how to build glitch-free CS fanout (direct/buffer/decoder/daisy-chain), prevent MISO contention, and verify margins with measurable bring-up and production checks.
H2-1 · What Chip-Select Really Does in a Multi-Slave SPI
Concept contract
Chip-Select (CS/NSS) is not “just a pin”. In multi-slave SPI it defines the system behavior boundary: frame boundary, tri-state boundary, timing boundary, and fault-containment boundary. All later design rules enforce a single requirement: only one slave is allowed to be effective inside the active window, and the bus timing/electrical constraints must hold under worst-case conditions.
- Frame boundary: CS assert→deassert defines one transaction. Many devices latch internal state on a specific CS edge (device-dependent).
- Tri-state boundary: CS determines who is permitted to drive MISO. Non-selected devices must release MISO (or be isolated).
- Timing boundary: CS controls when it is legal to start/stop SCLK for a given slave (setup/hold and turnaround windows).
- Fault-containment boundary: CS is the primary lever to re-align device state machines after noise, brown-out, or stalls (paired with timeout/reset policy).
Scope guard: This page focuses on CS fanout/decoding/daisy-chains, CS timing windows, and multi-slave contention prevention. Clock quality and long-trace SI deep-dive belong to: SCLK Quality & Skew and Long-Trace SI.
Two dominant failure modes (multi-slave)
1) Select the wrong slave (mis-select)
- Symptoms: wrong device ID, register writes landing in another device, inconsistent readbacks across boards.
- Common root causes: CS glitch pulses, decode tree hazards, default-state issues during reset/brown-out, swapped wiring.
- First check: capture CS lines with a logic analyzer trigger on CS edges; look for narrow pulses or overlaps at transitions.
2) Bus contention (two drivers / no driver)
- Symptoms: random read data, distorted MISO waveform, intermittent CRC/compare fails, unexplained current/EMI increases.
- Common root causes: MISO not truly tri-stated when CS is inactive, insufficient turnaround time (tDIS/tEN), decode overlap.
- First check: verify tri-state timing from datasheet (tDIS/tEN) and confirm no CS overlap during switching.
Where this page goes next
- Define a measurable CS timing contract and safe switching windows (next chapter).
- Scale CS with fanout/decoders while keeping glitch-free and default-safe behavior.
- Prevent MISO contention using tri-state guarantees, gating/muxing, and deterministic turnaround budgeting.
Diagram · Single-master, multi-slave SPI with an “only-one-selected” window
H2-2 · Timing Contract: tCSS/tCSH, Inter-Slave Turnaround, and Safe Windows
Timing contract (system-level)
Switching between slaves is a four-step contract that must cover both worst cases: two drivers (contention) and no driver (floating data). The safe window is built from datasheet timing plus interconnect delays (decoder/buffer/isolator) and a design margin.
Safe switch sequence
CS_A deassert → wait (tDIS_max + path_off_delay + margin) → CS_B assert → wait (tCSS_min + path_on_delay) → start SCLK.
- tCSS / tCSH: setup/hold constraints between CS and SCLK edges for the selected device.
- tDIS (MISO release) / tEN (MISO enable): tri-state transition limits that control contention and floating windows.
- Turnaround time: the enforced idle gap used to guarantee “release before enable” across the worst-case device pair.
- Interconnect delays: decoder/buffer/isolator propagation and skew must be included in the contract (do not assume zero).
Budget template (fill from datasheets)
Use the fields below to compute a deterministic minimum gap and a safe SCLK-start delay. Keep values as max/min worst-case entries and add explicit margin.
- Slave A (deasserting): tDIS_max (MISO → Hi-Z), plus any internal “CS inactive” release conditions.
- Path A (off): decode/buffer/isolator tPD_max(off), skew(off).
- Slave B (asserting): tCSS_min (CS→SCLK), and tEN_max (MISO enable) if relevant.
- Path B (on): decode/buffer/isolator tPD_max(on), skew(on).
- Margin: X ns or X% (covers PVT spread, measurement uncertainty, and board-to-board variation).
Derived constraints (store in the design spec)
- Turnaround_min ≥ tDIS_max(A) + tPD_max(A_off) + margin
- SCLK_start_delay_min ≥ tCSS_min(B) + tPD_max(B_on)
- If MISO enable is slow: ensure the first sampling edge occurs after tEN_max(B) (or add gating/muxing for strict single-driver behavior).
Common pitfalls (and the fastest way to catch them)
-
Pitfall: budgeting only tCSS/tCSH and ignoring tDIS/tEN.
Catch: errors appear mainly when switching slaves (not during long single-slave transfers). -
Pitfall: assuming decoder/buffer/isolator delays are “too small to matter”.
Catch: one board revision works and the next fails after adding a decode tree or rerouting CS. -
Pitfall: CS overlap or narrow CS glitches during GPIO updates.
Catch: trigger on CS edges; search for pulses shorter than the analyzer sampling period (repeat with higher sample rate). -
Pitfall: “floating MISO” interpreted as valid highs (weak pull-ups, leakage).
Catch: confirm that MISO is driven before the first sampling edge; add explicit idle pattern reads to validate.
Verification & pass criteria (placeholders): CS overlap events = 0; turnaround ≥ Turnaround_min; first valid MISO transition occurs ≥ X ns before the first sampling edge; no mis-select observed across X cold boots and X brown-out cycles.
Diagram · CS switching safe window (turnaround + setup)
H2-3 · Fanout Strategies: Direct CS, Buffer Tree, GPIO Expanders, and Decoders
Intent
Scaling SPI to many slaves is a system decision, not a wiring trick. A chip-select fanout strategy must be chosen by I/O pin cost, deterministic delay, default-safe behavior, fault containment, layout complexity, and EMI/edge impact. Every non-trivial fanout method adds propagation/skew that must be budgeted back into the safe switching contract.
Engineering inputs (define before selecting)
- Slave count (N) and growth: current N, maximum N, and whether expansion must be field-upgradable.
- Switching intensity: how often firmware changes slaves per second (high switching amplifies tDIS/tEN and glitch risks).
- Determinism requirement: whether CS path delay/skew can reduce the turnaround/setup margin in the timing contract.
- Default-safe constraint: whether any accidental select is unacceptable during power-up/reset/brown-out (common for Flash/config devices).
- Fault containment: whether a single node failure must be isolated (vs. allowed to disturb the entire bus).
- Domain boundaries: multi-voltage or isolation boundaries that add delay and default-state complexity.
Strategy matrix (quick compare)
Direct CS (many MCU GPIOs)
- Best when: N is small, routing is short, and the timing contract has generous margin.
- Determinism: high (minimal added propagation); easiest to keep CS timing predictable.
- Default-safe: depends on MCU pin reset state; requires explicit pull-ups/downs for safe boot.
- Tradeoff: high pin cost; scaling beyond a small N becomes board- and firmware-heavy.
Buffer tree (fanout buffers)
- Best when: N is moderate and CS loading must be isolated to keep edges clean and consistent.
- Determinism: medium-to-high (adds propagation + channel-to-channel skew to budget).
- Default-safe: must be guaranteed by buffer enable/reset behavior and external pulls.
- Tradeoff: more parts and tree routing; skew differences can reduce turnaround margin if ignored.
Decoder tree (3→8, 4→16, cascaded)
- Best when: N is large and GPIOs must be minimized while preserving per-slave CS outputs.
- Determinism: medium (propagation/skew and hazards must be explicitly controlled).
- Default-safe: achievable only with a global enable/strobe gate and safe boot pulls.
- Tradeoff: hazard/glitch risk if address lines change without gating; cascades add skew that must be budgeted.
GPIO expander / shift register (pin saver)
- Best when: pin count is extremely constrained and CS updates are not ultra time-critical.
- Determinism: low-to-medium (update latency depends on bus transactions and internal state).
- Default-safe: hardest; must manage power-up defaults, configuration order, and failure modes.
- Tradeoff: adds “configuration dependency” (CS correctness depends on expander health and initialization).
Budget reminder: for buffer/decoder/expander solutions, include propagation + skew in the H2-2 timing contract fields (path_on_delay/path_off_delay). Treat these as worst-case values, not typical.
Decision flow (practical)
- If N is small and GPIOs are available → prefer Direct CS (simplest and most deterministic).
- If edges/load isolation is needed while keeping one-CS-per-slave → add Buffer tree and budget skew.
- If N is large and pin count must be reduced → use a Decoder tree with a global enable/strobe gate (glitch-free).
- If pin count is critical and CS update latency is acceptable → consider GPIO expanders, but require strict default-safe and failure containment design.
Rule of thumb: the more “logic” placed between firmware and CS pins, the more the design must prioritize default-safe behavior and fail-to-all-CS-inactive.
Diagram · Fanout strategy decision tree
H2-4 · CS Decode Trees: Addressing, Glitch-Free Design, and Default Safe States
Decoder risks (what goes wrong)
Risk 1 · Glitch (hazard overlap)
- What happens: while address lines transition, the decoder can temporarily assert multiple outputs or a short pulse on an unintended CS.
- Why: address bits do not arrive simultaneously; the combinational logic passes through intermediate states.
- Impact: mis-select, accidental writes, or state-machine corruption in sensitive devices.
Risk 2 · Default state (power-up / reset / brown-out)
- What happens: decoder inputs float or change during reset; outputs can briefly assert.
- Why: MCU pins may be tri-stated; supply ramps and thresholds are undefined; brown-out creates mixed reset states.
- Impact: unpredictable selects; “ghost transactions” that are difficult to debug and reproduce.
Glitch-free decode architecture (the practical fix)
The robust pattern is strobe-gated decoding: address lines only pre-select the target while a global enable (EN) acts as the real chip-select gate. Changing the address is only allowed while EN is inactive.
Three rules (store as design contract)
- Rule A (pre-select): update address lines only while EN=0 (all CS inactive).
- Rule B (open the gate): after address is stable, assert EN=1 to generate a single valid CS.
- Rule C (close before change): deassert EN=0 before switching addresses (prevents overlap and glitch pulses).
Timing tie-in: decoder propagation/skew adds to the H2-2 safe window. For cascaded trees, use worst-case tPD_max and skew_max per level; do not assume identical paths.
Default-safe and fail-safe behavior (power-up, reset, EMI)
- Boot invariant: EN must default to inactive so that all CS remain inactive during MCU pin tri-state and supply ramp.
- Initialization order: configure address lines to a known state, then enable the decoder gate (EN) only after the bus is stable.
- Brown-out behavior: if the system detects undervoltage, force EN inactive early to avoid mixed-reset selects.
- EMI resilience: treat address lines as “unsafe” under noise; the gate ensures noise cannot create a select unless EN is active.
- Fail-safe target: any abnormal condition should converge to EN=0 → all-CS inactive.
Verification & pass criteria (placeholders): With EN held inactive, no CS pulses are observed across X address transitions; during power-up/reset/brown-out tests, CS outputs remain inactive until EN is asserted; cascaded decode paths meet the H2-2 margin (turnaround ≥ X, setup ≥ X).
Diagram · Decoder tree with a global enable gate (glitch-free pattern)
H2-5 · Daisy-Chain SPI: When It Helps, When It Hurts, and How to Budget Latency
Intent
Daisy-chain SPI must be treated as a serial shift chain, not a multi-drop bus. A correct design starts with bit-length, update latency, and failure propagation budgets. This section separates true daisy-chain from “CS polling” and provides a latency template that scales to long chains.
Two patterns that often get confused
True daisy-chain (shift-register chain)
- Topology: DOUT→DIN is cascaded; a single CS gates the entire chain.
- Model: the chain behaves like one long shift register with total length Σ bitsᵢ.
- Consequence: update latency grows with chain length; any node can affect the whole chain.
“Pseudo chain” (CS polling of parallel slaves)
- Topology: multiple slaves share SCLK/MOSI/MISO; each has its own CS.
- Model: a fanout system; correctness depends on CS timing and MISO tri-state.
- Where handled: covered by CS fanout/decoder rules and MISO contention control.
Practical test: if removing a middle device breaks the data path to devices behind it, it is a true daisy-chain. If each device can be independently selected with its own CS, it is a multi-slave fanout design.
Where daisy-chain helps vs hurts
Good fit
- Pin-constrained systems that must scale to many nodes.
- Naturally chained modules where a single update frame is acceptable.
- Systems tolerant of increased update latency (refresh-based control).
Poor fit
- Low-latency closed loops that need fast random access to one node.
- High availability requirements where any single-node failure must not affect others.
- Systems where the required refresh period is shorter than the chain update time.
Latency budget template (field-based)
- Per-node shift length: bitsᵢ (include data + control + CRC/PEC + alignment bits if required).
- Total shift length: B_total = Σ(bitsᵢ) + B_overhead.
- One full-chain update: T_update = (B_total / fSCLK) + T_gap.
- Readback delay: if the protocol returns status on a later frame, T_readback ≈ k · T_update (k is 1–2 by design).
- Refresh feasibility: require T_update ≤ T_refresh · duty_limit (duty_limit is a system target).
Isolation note: for long or isolated chains, the physical-layer implementation may differ (isolation, long-line robustness). Keep this section focused on shift length + system latency; link out to the isolated-SPI/isoSPI subpage for physical-layer choices.
Diagram · True daisy-chain as a shift-register chain
H2-6 · Multi-Slave MISO Contention: Tri-State Guarantees, Bus Hold, and Gating
The contract that must be verified (before mitigation)
- Tri-state guarantee: when CS is inactive, the slave must place MISO in Hi-Z (or be externally isolated).
- Release/enable timing: budget worst-case tDIS (release) and tEN (enable) into the safe switching window.
- Default state: verify MISO behavior during power-up/reset/brown-out; “always-drive” or sticky modes turn a device into a bus aggressor.
- Bus-hold/keeper effects: a weak keeper can mimic a driven line; do not assume “stable level” implies a valid driver.
Symptom → cause → mitigation ladder
Symptoms
- Random read values or intermittent ID mismatches during slave switching.
- MISO edge deformation, unexpected plateaus, or oscillations under load.
- Unexpected current/temperature rise correlated with bus activity.
- Higher EMI when multiple slaves are connected compared to single-slave bench tests.
Root causes (mapped to fast checks)
- CS overlap or glitch: capture CS lines with a logic analyzer trigger; any overlap event is a hard fail.
- tDIS/tEN not covered: check the turnaround window; verify MISO truly releases before the next slave is enabled.
- Non-tri-stating “bad citizen”: isolate each slave; the offender will keep driving even when CS is inactive or during reset.
- Bus-hold misinterpretation: add a weak pull-up/down temporarily; a true Hi-Z will follow the pull, a driven line will not.
Mitigation ladder (least invasive → structural)
- Select/configure devices with guaranteed tri-state: confirm the mode pins/registers that control DO drive behavior.
- Add per-branch series-R on MISO: limits contention current and adds damping; it reduces damage risk but does not eliminate overlap.
- Use a bus switch / mux for MISO: enforce “only one path connected” to the master, controlled by CS/selection logic.
- Gate/isolate bad citizens: for slaves that do not reliably release MISO during reset/brown-out, isolate their outputs by design.
Pass criteria (placeholders): no CS-overlap events observed; MISO is Hi-Z when CS inactive (confirmed with a weak pull test); turnaround window covers worst-case tDIS/tEN with margin; contention-related overcurrent/thermal signatures do not appear under X stress tests.
Diagram · MISO contention vs gated selection (MUX/switch)
H2-7 · Length Matching for Many Slaves: What to Match, What Not to Match
Matching principles (engineering-focused)
- Not every trace must be equal length. Matching exists to keep skew inside a known sampling/control window, not for visual symmetry.
- Primary focus on this page: chip-select (CS) arrival timing differences that shift each slave’s internal “selected” boundary.
- When decode/fanout exists: CS skew is a sum of logic path + routing + buffer/isolation effects.
- The objective: keep CS-to-SCLK requirements and safe switching windows (turnaround) satisfied for worst-case devices.
Correction that prevents wasted effort: if a system’s dominant limitation is SCLK quality or sampling window collapse, spending layout effort on CS micromatching has low ROI. In that case, prioritize the SCLK-quality subpage and treat CS matching as a secondary refinement.
Skew budget template (method + fields, no fixed numbers)
Define the delta that actually matters
- CS-to-CS delta (multi-slave fairness): Δt(CSx−CSy) impacts unintended selection during group updates, reset, or decode transitions.
- CS-to-SCLK delta (sampling/control window): Δt(CSx−SCLK) affects whether each slave meets its CS setup/hold assumptions.
Budget decomposition
Δt_total = Δt_logic + Δt_route + Δt_buffer + Δt_isolation(optional)
- Δt_logic: decode/gate path differences (including enable/strobe gating).
- Δt_route: routing length differences translated to time delta (use a consistent PCB velocity model).
- Δt_buffer: fanout buffer channel-to-channel skew and propagation variations.
- Δt_isolation: isolator channel skew/prop delay mismatch when CS crosses domains.
Acceptance logic: treat Δt_total as a required margin consumer in the timing contract. It must be absorbed by the system’s allowed CS-to-SCLK window and by the safe switching window (turnaround) when changing slaves.
Typical mistakes (what breaks in practice)
- Only matching geometry, ignoring logic/buffer skew: routing looks “matched” but CS edges still arrive unevenly due to decode/buffer path differences.
- Updating address lines while the enable gate is open: decode transitions create brief selection glitches and unintended “micro-transactions.”
- Over-routing for matching: long detours increase coupling exposure; matching should be bounded by a timing need, not unlimited.
- Assuming reset behavior is harmless: mismatched CS paths during MCU reset/brown-out can momentarily select sensitive devices.
Diagram · CS path skew shifts each slave’s effective “selected” window
H2-8 · Chip-Select Fanout Hardware: Buffers, Level Shifters, Isolation Delays
Why fanout hardware is never “free”
Hardware inserted on chip-select paths can improve drive and domain compatibility, but it also adds propagation delay, channel skew, threshold differences, and default-state behaviors that directly affect the timing contract and safe-state guarantees.
Hardware types → risks → checks (field checklist)
Buffers / fanout drivers
- Risks: tPD shifts CS edges; channel skew creates Δt_buffer; default output behavior can generate unintended selection.
- Checks: tPD(max) and skew(max) for CS channels; output state during reset/brown-out; enable pin default and gating strategy.
- Budget tie-in: include as Δt_buffer and as a margin consumer in CS-to-SCLK and turnaround windows.
Level shifters (multi-voltage CS)
- Risks: threshold mismatches, direction assumptions, power sequencing side-effects, and uncertain output defaults.
- Checks: push-pull compatibility, direction fixed vs auto, VIH/VIL margins for both domains, and reset/power-up output state.
- Default-safe rule: ensure “all CS inactive” during power-up/reset by passive biasing and gating where needed.
Isolation (domain crossing)
- Risks: isolation delay shifts CS relative timing; channel mismatch creates Δt_isolation across CS branches.
- Checks: prop delay(max) and skew(max) across channels; keep CS branches on the same isolator family/path where possible.
- Scope note: focus on delay/skew and default safe-state; refer to isolation strategy subpage for CMTI/safety depth.
Budget reminder: in a fanout tree, “delay” is not a single number. Use worst-case tPD and worst-case skew per stage, then sum them into the same Δt_total model used for length matching.
Diagram · Multi-voltage CS fanout: level shift → buffer tree → slaves (default-safe)
H2-9 · Power-Up, Brown-Out, Hot-Plug: Preventing Accidental Select and Ghost Power
Risk checklist (real-world failure mechanisms)
- Power-up tri-state: MCU pins may start as Hi-Z. If CS floats, narrow pulses or unintended levels can accidentally select sensitive devices (flash/config/PMIC-like targets).
- Brown-out split reset: some devices reset while others remain partially alive. Bus state machines become out-of-sync, and legal-looking fragments can occur during recovery.
- Hot-plug transients: connect order and ground bounce can create CS glitches or partial frames before the system is stable.
- Ghost powering: IO injection through CS/MOSI/MISO can partially power a device into a half-awake state, causing non-Hi-Z behavior or unexpected bus loading.
Fast observable signs: first-transaction failures after reset, “impossible” IDs, CS pulses captured during power ramp, or a supposedly unpowered module still influencing MISO level.
Hardware mitigations (default-safe first)
1) Bias CS to a safe inactive level
- Use pull-up/pull-down bias so CS does not float during MCU Hi-Z windows.
- Verify the inactive polarity per slave; keep the entire tree aligned with “all inactive” as the default state.
2) Add a global enable gate (SAFE/EN)
- Treat EN as the real “CS master gate” for decode/buffer trees.
- Make EN default OFF with passive bias, then only release it after power-good and reset are stable.
3) Control hot-plug and brown-out entry/exit
- Hold all CS inactive during attach/detach windows; do not allow partial frames while rails settle.
- If modules can be unpowered while signals remain present, consider bus switches or isolation switches to physically disconnect CS/MISO paths.
4) Block ghost power paths (IO injection)
- Ensure unpowered modules do not receive active CS/MOSI that can back-feed via protection structures.
- Prefer designs where ground/power are established before signal eligibility is granted (via SAFE/EN gate).
Pass criteria (placeholders): during power-up/brown-out/hot-plug tests, CS-active events = 0 before SAFE/EN is released; no unintended writes/side effects; no “half-awake” device drives MISO while unselected.
Firmware mitigations (boot order + recovery sequences)
- Boot priority: configure all CS pins as explicit inactive outputs as early as possible; keep SAFE/EN asserted OFF until ready.
- Pre-transaction gate: only start SPI frames after system power-good/reset are stable and the bus is in an all-inactive idle.
- Brown-out handling: on detection, enter a deterministic bus reset sequence (disable engine → all CS inactive → re-init → re-enable SAFE/EN).
- Sensitive targets: require explicit “unlock then write” flows (or hardware write-protect usage) so accidental selects cannot cause persistent damage.
Quick check: if “first transaction after reset” fails but subsequent attempts pass, treat it as a strong indicator of unstable default states or split-reset sequencing. Validate SAFE/EN behavior and CS biasing before tuning timing.
Diagram · Power-up Hi-Z can float CS unless SAFE/EN gates selection
H2-10 · Bring-Up & Debug: Analyzer Triggers, Signature Patterns, and Fast Isolation
The 3-step isolation method (fast, repeatable)
Step 1 — Narrow the scope
- Capture traffic per-CS and correlate failures with a specific CS line or transaction type.
- Trigger on CS edges and count transactions to identify “only fails on CSx” vs “system-wide” issues.
- Add a short-pulse/glitch trigger to detect accidental selects.
Step 2 — Validate signatures (“who is talking”)
- Read a stable identity/version register as a signature (method, not vendor-specific values).
- If multiple CS lines return the same signature, suspect decode/mapping or selection leakage.
- If a single CS returns random data, suspect contention or timing-window collapse.
Step 3 — Prove the root cause with minimal changes
- Contention: force only one CS enabled; optionally add/enable a MISO mux and retest.
- Glitch: close SAFE/EN, stabilize address lines, then open the gate; confirm glitch events disappear.
- Timing: increase turnaround gaps, reduce SCLK, or add inter-frame delay; watch for trend improvement.
- Wrong select: build a CS→signature mapping list; any mismatch is a wiring/decoder mapping fault.
Pass criteria (placeholders): no CS glitch events; per-CS signature is stable across N reads; no duplicate signature across different CS lines unless intentionally shared; contention indicators disappear when other CS are forced inactive.
Analyzer trigger templates (CS-focused)
- CS edge + protocol decode: run per-CS decode sessions and compare transaction counts and error ratios.
- Glitch capture: trigger on pulses shorter than a defined width (or use a “runt pulse” detector if available).
- Frame boundary break: trigger when CS toggles during an active transfer or mid-byte.
- Turnaround window audit: measure time between CS deassert and next CS assert; compare to the required safe window budget.
Signature patterns → likely cause (fast interpretation)
Same signature under different CS
Likely decode mapping fault, enable-gate misuse, or selection leakage. Verify SAFE/EN gating and CS routing mapping.
Random data on one CS, stable on others
Suspect MISO contention or insufficient timing margin for that branch. Force single-slave mode and/or add MISO gating to prove it.
First transaction fails after reset, then passes
Treat as unstable default state or split-reset sequencing. Re-verify “all CS inactive” before SAFE/EN release, and check ghost-power behavior.
Errors correlate with CS switching only
Suspect turnaround budget not met, CS overlap, or decoder glitch. Audit CS-to-CS gaps and glitch events.
Diagram · Debug flow: symptom → checks → fix path (contention / glitch / timing / wrong select)
H2-11 · Engineering Checklist (Design → Bring-Up → Production)
Convert CS fanout rules into checkable gates. Each gate lists Check, Evidence, and Pass criteria (threshold placeholders).
Gate A — Design (budget + topology + default-safe)
-
Check: Build a CS timing budget with Δt components:
Δt_total = Δt_logic + Δt_route + Δt_buffer + Δt_isolation(optional).
Evidence: budget table with per-branch worst-case and margin.
Pass: CS→SCLK setup/hold margin ≥ X% (computed from the budget). -
Check: Enforce “only-one-selected window” across CS switching (include MISO tDIS/tEN worst-case).
Evidence: turnaround window definition and measurement plan.
Pass: CS overlap events = 0; turnaround ≥ (tDIS_max + margin) (placeholder). -
Check: Default-safe state: all CS inactive during power-up Hi-Z, brown-out, and hot-plug windows.
Evidence: schematic notes: CS bias (pull-up/down) + SAFE/EN gating path.
Pass: during ramps, CS-active events = 0 before SAFE/EN release. -
Check: Decoder fanout is glitch-safe: address lines settle before enable gate opens.
Evidence: decode truth table + enable timing notes.
Pass: CS glitch pulses narrower than X ns are not observed (or “not triggerable within measurement BW”). -
Check: Contention strategy exists for “bad-citizen” MISO behavior (non-Hi-Z when unselected).
Evidence: reserved footprint or BOM option for MISO mux/switch + series-R per branch.
Pass: MISO contention event = 0 (by current/shape/error counters, chosen method).
Gate B — Bring-Up (measure + trigger + prove root cause)
-
Check: Per-CS capture and statistics using logic/protocol analyzer triggers (CS edge, glitch, frame break, turnaround gap).
Evidence: saved trigger presets + per-CS failure histogram.
Pass: glitch events = 0; frame boundary breaks = 0 in N transactions (placeholder). -
Check: Signature reads confirm “who is talking” (ID/version register method; not vendor-specific addresses here).
Evidence: CS→signature mapping list; duplicate-signature anomaly log.
Pass: per-CS signature consistency ≥ X% across N reads; no unintended duplicates across different CS. -
Check: Fault injection proves recovery: power-cycle, brown-out dip, hot-plug attach/detach window.
Evidence: scripted test sequence + captured CS waveforms during ramps.
Pass: after injection, system returns to all-CS-inactive idle and succeeds signature reads within X attempts. -
Check: Minimal-change proof path exists for each failure class: contention / glitch / timing / wrong-select.
Evidence: “force single CS” mode, SAFE/EN hard-close, timing-gap sweep plan, CS mapping checklist.
Pass: root cause is reproducibly provable within X minutes using the defined steps (placeholder).
Gate C — Production (BIST + counters + thresholds)
Production self-tests
- Per-CS BIST: select each slave and read a stable signature; verify mapping and response timing.
- Optional loopback fixture: validate MISO path gating by forcing only one path enabled at a time.
- Power-cycle spot check: verify default-safe behavior (all CS inactive before SAFE/EN release).
Recommended counters (loggable fields)
- cs_glitch_count, cs_overlap_count (from analyzer or firmware-edge monitor, if available)
- signature_mismatch_count (CS→device mapping integrity)
- first_tx_fail_count (high sensitivity to default-state/brown-out issues)
- miso_contention_suspect_count (error bursts correlated with CS switching or current spikes)
- brownout_recovery_count and recovery outcome (pass/fail)
Pass criteria (placeholders): cs_glitch_count = 0; cs_overlap_count = 0; miso contention events = 0; signature pass rate ≥ X%; recovery pass within X attempts.
Diagram · Checklist overview (Design / Bring-Up / Production)
H2-12 · Applications & IC Selection Notes (CS Expansion Parts, Mux/Switch, Decoders)
Scope is limited to CS/fanout-relevant parts and fields. Part numbers are examples; verify package, suffix, logic family, and availability. For long-trace reflections/termination, link out to “Long-Trace SI”. For isolation CMTI/safety details, link out to “Isolation Strategy”.
Typical application bundles (CS/fanout-centric)
Bundle A — Many SPI sensors (N high, mid-speed)
- Topology: decoder or buffer tree for CS + optional MISO mux to prevent contention.
- Focus: glitch-free enable gating, per-branch Δt_budget, and “only-one-selected window”.
- Example parts: SN74HC138 / CD74HC138 (3→8 decoder, enable pins), SN74HC154 (4→16 decoder), SN74LVC244A (buffer/line driver), SN74LVC125A (tri-state buffer for SAFE/EN style gating with pull-ups), SN74CB3Q3257 / SN74CBTLV3257 (4:1 bus switch mux for MISO path).
Bundle B — Multi-flash / shared peripherals (high accidental-select risk)
- Topology: decoder + global SAFE/EN gate + strong default-safe bias for all CS outputs.
- Focus: power-up Hi-Z windows, brown-out split reset, and glitch capture on CS.
- Example parts: SN74HC138 / 74LVC138A (decoder with enables), SN74LVC1G125 (single tri-state buffer to gate CS; add pull-up to keep inactive when disabled), SN74LVC2G125 (dual tri-state gating), SN74LVC1G08 / SN74LVC1G32 (small-gate logic for enable conditioning as needed), SN74AXC1T45 / SN74AVC1T45 (level shifting for CS control lines across voltage domains).
Bundle C — Modular / backplane / hot-plug (default-safe + ghost-power control)
- Topology: SAFE/EN gating + physical disconnect for not-ready modules (switch/mux), then release selection after power-good.
- Focus: hot-plug transients, IO injection paths, and ensuring unpowered modules do not load MISO.
- Example parts: TMUX1574 (TI analog mux, use for controlled MISO selection where suitable), TS5A23157 / TS5A3159 (TI analog switches, SPDT class examples), ADG772 / ADG884 (Analog Devices mux/switch examples), ISO7741 / ISO7731 (TI digital isolator examples for SPI signal isolation; account delay/skew), ADuM1401 / ADuM1411 (Analog Devices isolator examples; account delay/skew).
Selection notes (must-check datasheet fields + quick validation)
Decoder (CS reduction) — examples: SN74HC138, CD74HC138, SN74HC154
- Enable pins: use as the master SAFE/EN gate; open only after address lines are stable.
- Default output state: confirm outputs stay “all inactive” at power-up/reset (or enforce with external gating).
- Propagation delay & channel skew: include in Δt_logic; worst-case matters more than typical.
- Input thresholds / hysteresis: reduce false toggles from noise/EMI on address lines.
- Quick validation: glitch-trigger capture while sweeping address lines; verify no unintended CS pulses when SAFE/EN is held OFF.
Mux / Switch (MISO gating or module disconnect) — examples: SN74CB3Q3257, SN74CBTLV3257, TMUX1574, ADG772
- Default disconnected: preferred for hot-plug and “bad-citizen” isolation.
- RON, bandwidth, and capacitance: ensure MISO path does not collapse sampling window (budget, then measure).
- Crosstalk / leakage: avoid “looks disconnected but still talks” failures.
- Enable timing: treat mux switching like CS switching; add a safe turnaround window.
- Quick validation: force only one MISO path enabled; confirm errors vanish if contention was the root cause.
Buffer / Level shifting (CS distribution across rails) — examples: SN74LVC244A, SN74LVC125A, SN74AXC1T45, SN74AXC8T245
- Drive + edge control: buffers can clean fanout but may worsen overshoot if uncontrolled (measure at the far end).
- tPD and skew: include in Δt_buffer; multi-channel parts can have channel-to-channel skew.
- OE/disable behavior: tri-state + pull-up can implement SAFE/EN behavior that defaults to inactive.
- Translator direction & defaults: avoid auto-direction parts for critical CS timing unless behavior is proven under all conditions.
- Quick validation: hold OE disabled during power-up; verify CS remains inactive and no pulses appear before enable release.
GPIO expander / shift register (CS-only angle) — examples: TCA9535, PCA9555, MCP23017, SN74HC595
- Default output state: power-up outputs can be undefined; enforce safe bias and initialization order.
- Update latency: writing CS through an expander adds command/queue latency; budget it as part of “selection window”.
- Failure modes: if the control bus stalls, CS can get stuck; define watchdog and recovery behavior.
- Quick validation: reset/boot tests must show “all CS inactive” before firmware config completes.
Link-out guidance: if failures depend on trace length, ringing, or reflections, link to the “Long-Trace SI” sibling page. If constraints are dominated by isolator delay/skew/CMTI, link to the “Isolation Strategy” sibling page.
Diagram · Decoder vs Mux/Switch vs Buffer (use boundaries, not marketing)
Recommended topics you might also need
Request a Quote
H2-13 · FAQs (10–12, fixed 4-line answers)
These FAQs are constrained to chip-select & fanout topics (decode/glitch, turnaround timing, contention, default-safe, Δt budget, daisy-chain latency). Each answer uses a fixed 4-line structure with measurable pass criteria (placeholders).
Two slaves respond to one CS — decode mistake or wiring?
Likely cause: CS net short/bridge, or decoder truth-table / enable wiring selects more than one output.
Quick check: Read a known signature (ID/version) under each CS; if two CS lines return the same signature, mapping/selection is wrong.
Fix: Verify CS→device mapping, decoder outputs polarity, and enable pins; enforce a global SAFE/EN gate that is OFF until address lines are stable.
Pass criteria: signature_unique_count = N_slaves; signature_duplicate_across_CS = 0; cs_overlap_count = 0 over N_tx = X.
MISO reads garbage only when switching slaves — turnaround too short?
Likely cause: MISO tri-state release/enable window not covered (tDIS/tEN worst-case), or a brief overlap occurs during CS switching.
Quick check: Increase inter-slave gap: deassert CS_A → wait X → assert CS_B → wait X → start SCLK; check if error rate drops sharply.
Fix: Budget turnaround using max(tDIS) + margin and include decode/buffer delay/skew; implement a minimum gap in firmware.
Pass criteria: turnaround_margin = (gap_applied − tDIS_max) / tDIS_max ≥ X%; read_error_rate ≤ X ppm over N_reads = X.
MISO contention suspected — what’s the fastest proof on the scope?
Likely cause: One slave does not release MISO when CS is inactive, or two slaves drive during a CS overlap/glitch.
Quick check: Add/observe a small series resistor on MISO (or use an existing one) and probe both sides during slave switching; contention shows as abnormal voltage steps/current spikes and edge “flattening”.
Fix: Enforce “only one MISO path enabled” using a mux/switch, or replace/reconfigure the non-Hi-Z slave; keep CS switching glitch-free and add turnaround.
Pass criteria: miso_contention_event = 0 over N_switches = X; delta_I_peak ≤ X mA (if monitored); signature_pass_rate ≥ X%.
Adding a decoder increased errors — timing margin or glitch?
Likely cause: decoder propagation/skew reduced CS→SCLK margin, or address-line transitions create decode glitches.
Quick check: Hold decoder enable (SAFE/EN) forced OFF while toggling address lines; if any CS pulse appears, it is glitch-driven. Then, sweep CS-to-SCLK delay to see margin sensitivity.
Fix: Use enable-gated decoding (address stable → open EN), add address line filtering/hysteresis where needed, and include tPD/skew in the budget.
Pass criteria: cs_glitch_count = 0 with SAFE/EN=OFF; cs_sclk_margin ≥ X%; error_rate ≤ X ppm at target SCLK.
Works at low speed, fails at high speed with many slaves — fanout loading?
Likely cause: CS distribution edges degrade with fanout, or CS/SCLK skew tightens the sampling window at higher speed.
Quick check: Keep SCLK constant and vary “number of connected slaves” (disconnect or disable modules) to see if failure probability scales with fanout.
Fix: Use a buffer tree for CS fanout, re-budget Δt including buffer skew, and re-verify turnaround; consider MISO gating if contention appears with switching.
Pass criteria: error_rate vs N_slaves is flat (slope ≤ X); cs_edge_slew within spec at farthest node; cs_sclk_margin ≥ X%.
Occasional wrong-device ID read — CS glitch or address line EMI?
Likely cause: narrow CS glitch selects the wrong device briefly, or address lines toggle due to EMI during enable opening.
Quick check: Trigger on short CS pulses (glitch trigger if available) and correlate with wrong-ID events; log wrong_id_count per CS.
Fix: Keep SAFE/EN closed until address lines stable; add biasing to enforce default-safe; reduce address susceptibility (shorten, add series-R, or use logic with hysteresis).
Pass criteria: wrong_id_count = 0 over N_reads = X; cs_glitch_count = 0; signature_pass_rate ≥ X%.
One “bad” slave bricks the whole bus — how to isolate?
Likely cause: the device drives MISO when unselected, or clamps the bus through ESD structures during partial power.
Quick check: Force single-CS mode and verify each slave independently; then physically disable the suspect slave (disconnect CS or MISO path) and see if the bus recovers.
Fix: Add a MISO mux/switch so only one return path is enabled; enforce default-safe and prevent ghost powering; replace/reconfigure non-Hi-Z devices.
Pass criteria: isolatable_fault = 1 (bus recovers when path disabled); miso_contention_event = 0 in normal operation; recovery_success_rate ≥ X%.
After brown-out, one slave never responds — stuck selected?
Likely cause: partial reset leaves device state machine out-of-sync, or CS is not guaranteed inactive during brown-out recovery.
Quick check: During a controlled brown-out dip, capture CS levels; verify all CS stay inactive until a defined SAFE/EN release point.
Fix: Add/strengthen CS bias and SAFE/EN gating; implement a recovery sequence: all CS inactive → peripheral reset → re-init → signature verify.
Pass criteria: first_tx_fail_count after brown-out = 0; brownout_recovery_success_rate ≥ X%; cs_active_before_safe_release = 0 events.
Daisy-chain works on bench but fails in system — latency/bit-count mismatch?
Likely cause: total shifted bits Σbits_i does not match firmware framing, or refresh/latency budget is violated under system timing.
Quick check: Measure and log total frame length in bits and compare against expected Σbits_i; sweep frame length by ±X bits to see if alignment “snaps” into place.
Fix: Make Σbits_i explicit in firmware; budget end-to-end update latency; add chain health checks and a bypass/isolation plan for failed nodes.
Pass criteria: bit_count_mismatch = 0; daisychain_update_latency ≤ X ms; chain_health_pass_rate ≥ X% over N_cycles.
CS length matched but still unstable — decode/buffer skew?
Likely cause: routing length is matched but Δt_logic/Δt_buffer (prop delay and channel skew) dominates; the budget missed non-route components.
Quick check: Compare measured CS arrival times at the slave pins across channels; if Δt_measured ≫ Δt_route, logic/buffer skew is the culprit.
Fix: Rebuild Δt_total = Δt_logic + Δt_route + Δt_buffer (+ Δt_isolation) and re-apply the CS→SCLK and turnaround rules using worst-case skew.
Pass criteria: delta_t_measured ≤ X ns (or ≤ X% of window); cs_sclk_margin ≥ X%; failure_rate ≤ X ppm.
Hot-plug causes phantom writes — how to guarantee CS default safe?
Likely cause: CS floats or glitches during connect/disconnect, or IO injection partially powers a device causing unintended state transitions.
Quick check: Capture CS during hot-plug; count cs_active_events_before_ready and cs_glitch_count while SAFE/EN is expected to be OFF.
Fix: Add strong default-safe bias, keep SAFE/EN gate OFF until power-good is valid, and physically disconnect MISO/CS paths for not-ready modules using a switch/mux.
Pass criteria: cs_active_events_before_ready = 0; cs_glitch_count = 0; write_protect_violation_count = 0 over N_plugs = X.
Same firmware, different board revision breaks — CS tree propagation change?
Likely cause: BOM swap changed buffer/decoder family or added translators/isolators, shifting tPD/skew and collapsing margin.
Quick check: Compare CS arrival and CS→SCLK timing at the slave pins between revisions; compute Δt_diff and correlate with failures.
Fix: Update the Δt budget with the new parts’ worst-case tPD/skew; adjust firmware delays (CS lead/lag and turnaround) and re-validate glitch-free gating.
Pass criteria: cs_sclk_margin ≥ X% on both revisions; error_rate ≤ X ppm; delta_t_diff accounted in budget = 100%.