← AXS-007

Circuit review & bench-test guide

AXS-007 — SHT31 temperature/humidity PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axs-007-sht31 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, generate_pcb.py, README.md, and the layout review artifacts in reports/review/.

This board has never been fabricated or assembled. The schematic is ERC clean (0/0) and the PCB layout is routed and DRC clean (0 electrical, 0 unconnected, 0 parity, one waived lib_footprint_mismatch for J1 silk moved to F.Fab), but no physical board exists and there is no first-article bench result of any kind. Every number in this guide is a design target or a datasheet expectation to verify, not a proven result.

1. What the board does#

AXS-007 is a PMOD Type 6 (extended) I2C peripheral carrying a Sensirion SHT31-DIS-B digital temperature and relative-humidity sensor. The host FPGA or MCU supplies 3.3 V through the PMOD plug and talks I2C at address 0x44 (default) or 0x45 (JP3 restrapped). On-board 4.7 kΩ pull-ups on SCL/SDA can be disconnected by cutting solder jumpers JP1/JP2 when the module is chained behind another module that already provides pull-ups. The sensor's ALERT output and active-low reset are brought to PMOD pins 1 and 2; the I2C bus is repeated on the bottom row (pins 9/10) for daisy-chain experiments.

It contains no regulator, no level shifting, and no protection beyond a 100 Ω series resistor on the sensor-driven ALERT line. It is a 3.3 V-only module; the host defines the rail.

Functional block diagram#

PMOD plug J1 (2x6, right-angle)
  6/12: 3V3 ────┬──────────────┬───────────────────┐
                │              │                   │
              C2 1uF        C1 100nF          R1/R2 4.7k     R3 10k
              (bulk)        (at U1 VDD)       (pull-ups)     (pull-up)
                                               │    │           │
  3: SCL ──────────────────────────────┬── JP2 ┘    │           │
  4: SDA ──────────────────────────┬───│── JP1 ─────┘           │
  9: SCL (chain) ──────────────────│───┤                        │
 10: SDA (chain) ──────────────────┤   │                        │
                                   v   v                        │
  2: ~RESET ──────────────────> U1 SHT31-DIS-B <── RESET_N ─────┘
                                   │        ADDR <── JP3 (1-2 GND = 0x44,
  1: ALERT <───── R4 100R ── SHT_ALERT            2-3 3V3 = 0x45)
  5/11: GND ── GND pours both layers ── U1 VSS, pin 7 (R), die pad

2. Safety and scope boundaries#

3. Power and signal sequence#

  1. The host (or bench supply) applies 3.3 V to pins 6/12 with GND on 5/11. C2 (1 µF) and C1 (100 nF) charge; there is no inrush concern.
  2. U1 powers up once VDD crosses V_POR (1.8–2.15 V). Sensirion specifies a maximum VDD slew of 20 V/ms — a bench supply or PMOD hot-plug is fine; an extremely fast solid-state switch could in principle violate this.
  3. After t_PU (0.5 ms typical, 1 ms max), U1 is in idle state and accepts commands. R3 (10 kΩ) holds ~RESET high so an unconfigured FPGA pin cannot float the sensor into reset; U1 also has an internal ~50 kΩ pull-up on nRESET.
  4. JP3 straps ADDR: default bridge 1-2 ties ADDR to GND → I2C address 0x44; bridge 2-3 instead ties ADDR to 3V3 → 0x45. ADDR must never float.
  5. SCL/SDA idle high through R1/R2 (4.7 kΩ, via JP1/JP2). The host issues I2C commands; U1 is a slave only.
  6. On alert conditions (programmable RH/T limits), U1 drives ALERT high; the signal reaches PMOD pin 1 through R4 (100 Ω series, sensor-driven-line miswire-tolerance rule).

4. Interfaces#

PMOD pin123456789101112
NetALERT~RESETSCLSDAGND3V3NCNCSCLSDAGND3V3

Note the 2×6 header zigzag-vs-PMOD-row numbering translation: on the physical J1 header, PMOD pins 1–6 map to odd header pads 1/3/5/7/9/11 and PMOD 7–12 to even pads 2/4/6/8/10/12 (see PMOD_TO_HEADER in the common library and the pcb.connect table in generate_pcb.py). Buzz this out before first power.

JumperDefaultMeaning
JP1bridgedSDA pull-up R1 connected; cut when chained behind a module with pull-ups
JP2bridgedSCL pull-up R2 connected; cut when chained
JP31-2 bridgedADDR low → I2C 0x44; re-bridge 2-3 for ADDR high → 0x45

There are no test points; probe the J1 pins, the jumper pads, and the passive pads directly.

5. Component-by-component review#

5.1 Sensor and connector#

Ref.PartFunction and why neededIf absent/openIf shorted, wrong, or misassembled
U1Sensirion SHT31-DIS-B2.5KS, DFN-8 T/RH sensor, ±0.2 °C / ±2 %RHThe entire point of the module: calibrated, linearized 16-bit T and RH over I2C, plus ALERT limit engine and heaterNo function at all; an unsoldered SDA/SCL pad means no ACK at any addressRotated DFN or bridged pins can short 3V3–GND (µA rail makes this obvious); overheated reflow degrades RH accuracy; a floating ADDR pad gives an unstable address
J1Generic 2×6 right-angle 2.54 mm header (PMOD plug)Host connection: power, I2C, ALERT, ~RESET; body flush to the board edge per the layoutNo host connectionPin-1 orientation error swaps 3V3/GND onto signal pins — the layout was checked against Digilent PMOD spec 1.2.0 Figure 2, but verify the physical part against a host socket before first mating

5.2 Decoupling#

Ref.Value / partPurposeIf omitted or wrong
C1100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D)U1 VDD decoupling, the capacitor Sensirion's application circuit requires "as close to the sensor as possible"Measurement-burst current (600 µA typ, 1.5 mA max) is served through trace inductance; risk of resets or noisy readings
C21 µF 10 V X7R 0603 (Murata GRM188R71A105KA61D)Module bulk decoupling at the PMOD plugMore rail bounce on hot-plug and during measurement bursts; module still likely functional — verify, don't assume

5.3 Pull-ups, series protection, and straps#

Ref.ValueFunctionIf omitted or wrong
R14.7 kΩ (Yageo RC0603FR-074K7L)SDA pull-up through JP1; SHT31 SDA is open-drain and requires an external pull-upOpen (or JP1 cut with no host pull-up): SDA floats, bus dead or erratic; too small (<1 kΩ): exceeds the 3 mA V_OL test condition and low levels rise above 0.4 V
R24.7 kΩSCL pull-up through JP2; SCL must also be pulled up (the sensor can stretch the clock in 0x2Cxx modes)Same failure modes as R1, on SCL
R310 kΩ~RESET idle pull-up so an unconfigured host FPGA pin cannot float the sensor into reset; parallels U1's internal ~50 kΩ, giving ~8.3 kΩ effectiveSensor may randomly reset while the host pin is tristated; Sensirion allows nRESET floating or tied to VDD via R ≥ 2 kΩ, so 10 kΩ is compliant
R4100 ΩSeries protection on the sensor-driven ALERT line (line-wide miswire-tolerance rule): limits current if the host mistakenly drives pin 1Open: ALERT never reaches the host (reads floating); shorted: loses miswire protection but works; wrong high value forms an RC with host input capacitance — negligible at these speeds
JP1/JP22-pad solder jumpers, bridged by defaultDisconnect the on-board pull-ups when this module is chained behind another that provides them (two sets of 4.7 kΩ in parallel = 2.35 kΩ, still legal but ~1.4 mA sink per line)Cut when they should be bridged: bus floats standalone; bridged when they should be cut: parallel pull-ups (usually tolerable, verify V_OL)
JP33-pad solder jumper, 1-2 bridgedADDR strap: 1-2 = GND = 0x44 (default); 2-3 = 3V3 = 0x45. ADDR must not float (datasheet section 3.4)Neither side bridged: address undefined/unstable; both sides bridged: hard 3V3–GND short — the current-limited supply test in phase B catches this

Every reference designator on the board is listed above (U1, J1, C1, C2, R1–R4, JP1–JP3). There are no other components.

6. Datasheet summary and design interpretation#

Primary reference: Sensirion SHT3x-DIS datasheet, Version 7, December 2022 (also linked from the SHT31 product page). Check for a newer revision before procurement.

Datasheet factValueBoard-specific interpretation
Supply range2.15–5.5 V; abs max −0.3 to +6 V3.3 V sits mid-range; the module (not the sensor) is what forbids 5 V hosts
Pin abs max−0.3 to VDD+0.3 V on SDA/ADDR/ALERT/SCL/nRESET; ±100 mA any pinNever drive the PMOD signals when the module is unpowered
POR / power-upV_POR 1.8–2.15 V; t_PU 0.5 ms typ, 1 ms max; VDD slew ≤ 20 V/msWait ≥1 ms after power before the first command
Supply currentIdle (single-shot) 0.2 µA typ / 2 µA max at 25 °C; measuring 600 µA typ / 1.5 mA max; periodic-mode idle 45 µA typWhole-module idle current should be single-digit µA — a sensitive assembly-fault detector
I2C0–1000 kHz SCL; fast-mode compliant; V_OL ≤ 0.4 V at 3 mA; V_IH ≥ 0.7·VDD; ≤400 pF bus4.7 kΩ at 3.3 V sinks ~0.7 mA when low — well inside spec
Addresses0x44 (ADDR low, default), 0x45 (ADDR high); ADDR must not float; can even be switched dynamicallyJP3 implements exactly this strap
Single-shot commands0x2400/0x240B/0x2416 = high/med/low repeatability, clock stretching disabled; 0x2C06/0x2C0D/0x2C10 = with clock stretchingThe HDL exercise targets 0x2400 (no stretching); the sensor NACKs the read header until data is ready
Measurement durationHigh repeatability 12.5 ms typ, 15 ms max (≥2.4 V)Poll the read header every ~1 ms or wait 15 ms after 0x2400
Data frameTemp MSB, Temp LSB, CRC, RH MSB, RH LSB, CRC (6 bytes)Temperature always first; master may NACK-abort early
CRCCRC-8, polynomial 0x31 (x⁸+x⁵+x⁴+1), init 0xFF, no reflection, final XOR 0x00; CRC(0xBE 0xEF) = 0x92Worked examples in section 7
ConversionT[°C] = −45 + 175·S_T/(2¹⁶−1); RH[%] = 100·S_RH/(2¹⁶−1)Raw values are unsigned 16-bit, already linearized and compensated
Soft resetCommand 0x30A2, t_SR 0.5 ms typ / 1.5 ms max; also general-call 0x00 0x06; interface reset = SCL toggled ≥9× with SDA highUse 0x30A2 in bring-up to prove write-path integrity
Status registerRead with 0xF32D (2 bytes + CRC); bit 15 alert pending, bit 13 heater on, bit 4 reset detected, bit 1 command status, bit 0 write CRC status; clear with 0x3041Fresh power-up reads 0x8010 (alert-pending and reset-detected default to '1')
nRESETActive low, ≥1 µs pulse, internal ~50 kΩ pull-up, may float or tie to VDD via R ≥ 2 kΩR3 = 10 kΩ complies; a host can still yank it low through the 10 kΩ (it only fights ~0.33 mA)
ALERTPush output, high when alert conditions met, leave floating if unused; self-heating possible at high load currentR4 limits any contention; ALERT idles per the alert engine, not necessarily low — check status bit 15
Accuracy (SHT31)±2 %RH typ (0–100 %RH), ±0.2 °C typ (0–90 °C); repeatability (high) 0.08 %RH / 0.04 °COnly valid for an undamaged sensor; reflow per JEDEC and Sensirion handling instructions

7. Expected values before bench testing#

None of these have ever been measured on this design — no board exists.

QuantityExpected (design/datasheet)How to measure
3V3-to-GND resistance, unpoweredHigh (≥100 kΩ scale after C2 charges; dominated by U1 leakage)DMM, both polarities
SDA-to-3V3 / SCL-to-3V3 resistance≈4.7 kΩ each (JP1/JP2 bridged)DMM at J1 pins 4/3 to pin 6
ADDR level0 V (JP3 1-2) or 3.3 V (JP3 2-3)DMM at JP3 center pad, powered
Idle supply current~1–5 µA (sensor idle ≤2 µA + leakage)µA-range meter in series, standalone supply
Current during measurement~0.6 mA pulses, ≤1.5 mA, for ≤15 msSupply monitor or shunt + scope
SCL/SDA idle level3.3 V (pulled up)DMM/scope at J1 pins 3/4
~RESET idle level3.3 V through R3DMM at J1 pin 2
I2C scanACK at 0x44 only (default strap); at 0x45 only after restrapping JP3Bus adapter address scan
First data frame6 bytes, both CRCs valid, plausible room T/RH0x2400 then read after ≥15 ms
Status register after power-up0x80100xF32D read
SCL V_OL when sensor stretches/ACKs, SDA V_OL≤0.4 VScope, low segments of waveform

CRC-8 worked example#

Polynomial 0x31, init 0xFF, MSB-first, no reflection, no final XOR. Over the datasheet example word 0xBE 0xEF the result is 0x92 (datasheet Table 20). For a temperature word of exactly 25.00 °C, S_T = 0x6666:

crc = 0xFF
crc ^= 0x66            -> 0x99
8x: shift left, XOR 0x31 when the bit shifted out was 1   -> 0xF1
crc ^= 0x66            -> 0x97
8x: same rule                                             -> 0x93

So the frame 0x66 0x66 0x93 is self-consistent. Similarly 0x7F 0xFF 0x8F is a valid 50.0 %RH humidity word. Conversions:

Use these vectors to check the host-side CRC and conversion code before ever touching hardware.

8. Manual schematic and assembly review checklist#

Layout evidence to inspect (no fabricated board exists; this is the routed design): reports/review/ contains axs-007-layout-review.html (the layout review report), top.svg and bottom.svg (copper/silk plots), and raytraced renders render-top.png/.jpg, render-bottom.png/.jpg, render-iso.png/.jpg. Open the HTML report and both SVGs and verify the points below.

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record board serial, jumper states, equipment, ambient T/RH, and operator for every phase. Two host contexts are covered: standalone (current-limited bench supply, phases B–C) and PMOD host (FPGA/MCU providing 3.3 V, phase D). Do standalone first — it risks only the module.

A. Unpowered inspection and resistance tests#

  1. Complete the section 8 checklist under magnification.
  2. DMM 3V3-to-GND at J1 pins 6→5, both polarities: no hard short.
  3. SDA→3V3 and SCL→3V3: ≈4.7 kΩ each. Cut-test rehearsal: this is also the jumper verification you will repeat whenever JP1/JP2 change state.
  4. ~RESET→3V3: ≈10 kΩ (R3; the sensor's internal 50 kΩ is not visible unpowered). ALERT→any rail: open (only R4 in series to U1's pin).
  5. JP3 center→GND: ≈0 Ω (default strap). JP3 center→3V3: open.

B. Standalone first power (current-limited bench supply)#

  1. Bench supply 3.3 V, current limit 20–50 mA, output off. Wire supply + to J1 PMOD pin 6 (or 12) and − to pin 5 (or 11). Double-check against the zigzag mapping — on the physical header these are pads 11 and 9.
  2. Power on. Expect no current-limit trip and, on a µA meter, an idle draw of a few µA once C1/C2 are charged. Tens of mA means a short or reversed connection: power off and investigate.
  3. Verify 3.3 V at U1's C1 pads, SCL/SDA idle at 3.3 V, ~RESET at 3.3 V, ADDR at 0 V.
  4. Momentarily short ~RESET (J1 pin 2) to GND (≥1 µs is enough) and release; supply current should stay in the µA range afterwards.

C. Standalone I2C bring-up (bus adapter, still on bench supply)#

Use any 3.3 V I2C master (FT232H/Bus Pirate/MCU devboard). Common ground with the bench supply; master pull-ups off first, since the module provides them.

  1. Pull-up source check: with the adapter attached and idle, SCL/SDA must read 3.3 V. Cut nothing yet. (If this module will later be chained, re-run this step after cutting JP1/JP2: the bus must still idle high — now through the host/other-module pull-ups — and an adapter with its pull-ups disabled must see the lines float, proving the cut is real.)
  2. Address scan: expect an ACK at 0x44 only. No ACK anywhere: check SDA/SCL swap, U1 soldering. ACK at 0x45: JP3 is strapped high or floating. ACK at both: two devices or a scan artifact — capture the waveform.
  3. Restrap check (once per design validation, not per board): move JP3 to 2-3, rescan: ACK at 0x45 only. Restore 1-2.
  4. Soft reset: write command 0x30A2 (bytes: address+W, 0x30, 0xA2, all ACKed). Wait ≥1.5 ms.
  5. Status register: write 0xF32D, read 3 bytes: expect 0x80 0x10 + valid CRC (0x8010 = alert-pending and reset-detected set after reset). Send clear-status 0x3041, re-read: bits 15/4 now clear.
  6. First measurement: write 0x2400 (single shot, high repeatability, clock stretching disabled). Because stretching is off, a read header issued too early is NACKed — verify that behavior once, deliberately. After ≥15 ms, read 6 bytes: T MSB, T LSB, CRC, RH MSB, RH LSB, CRC.
  7. CRC check: run both words through the section 7 CRC-8 (poly 0x31, init 0xFF). Both must match. Convert: T = −45 + 175·S_T/65535, RH = 100·S_RH/65535. Expect ambient within a couple of °C/%RH of a reference thermometer/hygrometer.
  8. Clock-stretching variant (optional): issue 0x2C06 and confirm the sensor stretches SCL until data is ready — useful later as an HDL corner case.
  9. Plausibility stimulus: breathe gently near (not on) the sensor: RH rises sharply, T slightly; both recover. This is a function check, not calibration.
  10. ALERT sanity (optional): program alert limits per Sensirion's alert application note, or at minimum confirm ALERT (J1 pin 1) is driven (not floating) and status bit 15 tracks it.

D. PMOD-host context (FPGA/MCU provides 3.3 V)#

  1. Verify the host PMOD socket really supplies 3.3 V (measure it) and that the host I/O bank is 3.3 V. Power the host, then plug the module in with host power off if hot-plug policy is unclear.
  2. With host I/O still unconfigured, measure SCL/SDA/~RESET on the module: all must idle at 3.3 V (R1/R2/R3 doing their job against floating host pins — this is exactly why R3 exists).
  3. Run the same sequence as phase C from the host (software I2C or the AruviX HDL I2C master when it exists): scan → 0x44 ACK, soft reset, status, 0x2400, CRC-checked conversion.
  4. If the host provides its own pull-ups (many FPGA boards do not; some MCU pins do), decide the pull-up ownership: for a single module keep JP1/JP2 bridged and host pull-ups off. Measure the SCL/SDA low level: ≤0.4 V.
  5. Daisy-chain experiment (design intent of pins 9/10): connect a second I2C device or module to the bottom-row bus. Exactly one set of pull-ups should remain; cut JP1/JP2 on the downstream module and re-verify idle levels and V_OL.
  6. Soak: log one measurement per second for 30+ minutes. Zero CRC failures and zero NACKs expected; log T/RH drift (sensor self-heating at 1 mps, lowest repeatability, is negligible per the datasheet average-current figures; high-rate periodic modes can self-heat).

E. Release-only tests#

Accuracy verification against a calibrated reference (or saturated-salt humidity fixtures), reflow-profile qualification of the sensor, long-term drift, and ESD are out of scope for the first bench pass and must be planned separately before any release claim.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
Supply current-limits at power-on3V3-to-GND resistanceSolder bridge (U1 DFN, JP3 double-bridged), reversed supply wiring
SCL or SDA does not idle highResistance line→3V3; JP1/JP2 stateJumper cut/never bridged, R1/R2 open, adapter driving the line
No ACK at any addressSDA/SCL swap at adapter; U1 pads; ADDR levelWiring, zigzag-map confusion (header pad vs PMOD pin), U1 unsoldered
ACK at 0x45 instead of 0x44JP3 strap and center-pad voltageJP3 bridged 2-3 or floating
ACKs but read data all 0xFF / NACK on readTiming since 0x2400; command bytesReading before measurement done (no clock stretching with 0x24xx)
CRC failuresScope SCL/SDA edges, V_OL, rise timeWrong CRC init/poly in host code first; then bus integrity, pull-up value
Nonsense T/RH valuesRaw hex vs formulas by handByte order (temp first, MSB first), formula error, decimal-vs-raw confusion
Sensor resets sporadically~RESET level and glitches; VDD rippleHost pin driving pin 2 low, R3 open, weak supply, C1 missing
ALERT stuck/floatingVoltage both sides of R4R4 open, alert engine unconfigured (expected until programmed)
Reads fine standalone, fails on hostHost rail voltage, pull-up ownership, V_OLHost bank not 3.3 V, doubled pull-ups, unconfigured host pins

11. Bench record template#

FieldRecord
Board revision / serial
JP1/JP2/JP3 states (photographed)
Host or supply, adapter, equipment + calibration
Ambient T / RH, reference instrument
Unpowered resistance results (A.2–A.5)
Idle current, measuring current
Address-scan result
Status register before/after clear
First frame raw hex + CRC pass/fail
Converted T / RH vs reference
Soak duration, error count, drift
Deviations, photos, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The circuit is a minimal, coherent implementation of Sensirion's application circuit plus AruviX line rules: mandatory 100 nF at VDD, bulk at the plug, jumpered pull-ups for chain topology, a defensive ~RESET pull-up, a series resistor on the one sensor-driven line, and a proper two-state ADDR strap. The routed PCB is DRC clean and the renders/report in reports/review/ allow a full desk review. The principal risks are unverified first-article behavior (nothing has ever been built), the J1 pin-1/zigzag orientation against a real host socket, DFN/exposed-pad solderability, thermal coupling through the unslotted GND pours limiting absolute temperature accuracy, and pull-up ownership mistakes in chained configurations. The I2C bring-up sequence in section 9 — scan, soft reset 0x30A2, status 0xF32D, measure 0x2400, CRC-8 verify, convert — is deliberately the same sequence the AruviX Verilog I2C master will have to reproduce.