← AXS-008

Circuit review & bench-test guide

AXS-008 — BMP280 barometric-pressure PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axs-008-bmp280 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), the module README, and the Bosch BMP280 datasheet.

The board is a schematic-only prototype: ERC is clean (0/0), but no PCB has been laid out and no board has ever been fabricated or powered. There are no recorded bench results of any kind. Every numeric value in this guide — voltages, currents, register contents, timings, compensation results — is a verification target taken from the schematic and the manufacturer datasheet, not a measured result. Do not treat anything below as proof that an assembled board works or is safe.

1. What the board does#

The board puts a Bosch BMP280 absolute barometric-pressure and temperature sensor on the AruviX PMOD template (Type 6 extended, I2C). The PMOD host supplies the single 3.3 V rail. CSB is hard-wired to 3V3 so the part latches into I2C mode from power-on; SDO is the I2C address bit and is driven by solder jumper JP3 (default 1-2 = GND = address 0x76; 2-3 = 3V3 = 0x77). The 4.7 kΩ bus pull-ups R1/R2 connect to the bus through solder jumpers JP1/JP2 (bridged by default) so they can be removed when another chained module provides the pull-ups. Pins 9/10 repeat SCL/SDA for daisy-chaining. The BMP280 has no interrupt pin, so PMOD pins 1/2/7/8 are NC.

The lesson content is the I2C master FSM plus the BMP280's burst register reads, one-time calibration-block readout, and 32/64-bit fixed-point compensation arithmetic.

Functional block diagram#

PMOD host (3.3 V)                 axs-008-bmp280
┌──────────────┐      J1
│ 3V3 ─────────┼── 6/12 ──┬───────────────┬───────────────┐
│ GND ─────────┼── 5/11 ──┼───────┐       │               │
│              │          │       │      C1,C2         JP3 2-3 (0x77)
│ SCL ─────────┼── 3/9 ───┼──┬────┼──── U1 BMP280         │
│ SDA ─────────┼── 4/10 ──┼──┼─┬──┼──── (CSB=3V3, I2C)    │
└──────────────┘          │  │ │  │       │ SDO ── JP3 ── GND (1-2, 0x76)
                          │  │ │  GND
              R2 4.7k ── JP2 │ │
              (3V3→SCL_PU)   │ R1 4.7k ── JP1
                             │ (3V3→SDA_PU)
                             └── bus repeated on J1 pins 9/10 for chaining

2. Safety and scope boundaries#

3. Power and control sequence#

  1. The PMOD host (or bench supply) applies 3V3 and GND on J1 pins 6/12 and 5/11. Both VDD and VDDIO of U1 are on this single rail; C1/C2 provide local decoupling. #FLG01/#FLG02 are ERC-only power-flag artifacts marking the host as the rail source — they place no physical part.
  2. CSB is tied to 3V3, so at power-on-reset the part selects I2C mode and (per datasheet section 5.1) cannot fall into SPI mode from a bus glitch. SDO is held at GND (JP3 1-2 default) → address 0x76.
  3. Datasheet start-up time is ≤2 ms to first communication (after VDD > 1.58 V and VDDIO > 0.65 V). During POR the NVM calibration words are copied to the register image (status 0xF3 bit 0 im_update).
  4. The device wakes in sleep mode (mode[1:0] = 00, ctrl_meas 0xF4 = 0x00); sleep current is 0.1 µA typical. The bus idles with SDA and SCL pulled to 3.3 V through R1/JP1 and R2/JP2.
  5. The host configures oversampling and mode via 0xF4 (and optionally 0xF5), polls status 0xF3 or waits out the measurement time, then burst-reads 0xF7–0xFC and applies the calibration compensation math.

4. Interfaces: PMOD pin map, jumpers, test points#

PMOD plug J1 (Type 6 extended)#

PMOD pin123456789101112
NetNCNCSCLSDAGND3V3NCNCSCLSDAGND3V3

Solder jumpers#

Ref.FunctionDefaultAlternative
JP1Connects R1 (4.7 kΩ) to SDABridged (pull-up fitted)Cut when another chained module provides the SDA pull-up
JP2Connects R2 (4.7 kΩ) to SCLBridged (pull-up fitted)Cut when another chained module provides the SCL pull-up
JP33-pad SDO address select1-2: SDO = GND → 0x762-3: SDO = 3V3 → 0x77. Never leave SDO floating — the address is undefined

Test points#

There are no dedicated test points on this design. Probe at the J1 pins, the jumper pads (JP1/JP2 for the bus, JP3 centre pad for SDO), and the C1/C2 pads for the rail. Add test points at PCB layout time if bench work shows they are needed.

5. Component-by-component review#

Every reference designator in generate_design.py is covered.

Ref.Part / key datasheet factsFunction and why neededIf absent/openIf shorted, wrong, or misassembled
J112-pin PMOD plug, 2×6Sole power and I2C interface; bus repeated on pins 9/10 for chainingNo power/communication; an open pin 6 or 12 only (redundant rail pins) may still work and mask a solder defectSwapped 3V3/GND destroys U1 (abs max 4.25 V is not the issue — reverse polarity is); SCL/SDA swap means no ACKs
U1Bosch BMP280, LGA-8 2.0×2.5 mm. VDD 1.71–3.6 V, VDDIO 1.2–3.6 V; abs max 4.25 V; 300–1100 hPa; −40…+85 °C; I2C to 3.4 MHz; sleep 0.1 µA typ, 2.8 µA @1 Hz forced, peak 720 µA (1120 µA max) during pressure measurement; start-up ≤2 ms; chip ID 0x58The sensor itself: piezo-resistive pressure element + ASIC, factory calibration in NVMNo sensor — the board is inert; address scan finds nothingWrong orientation on the clockwise-numbered LGA-8 puts 3V3 on GND pins (destructive); poor lid soldering shifts pressure (solder drift −0.5…+2 hPa is a datasheet parameter); a blocked vent hole reads wrong pressure forever
C1100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D)U1 VDD decoupling for the 720 µA measurement current peaksSupply bounce during conversions; possible resets or noisy readingsA shorted C1 is a 3V3–GND short: rail collapses, supply current hits the bench limit
C2100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D)U1 VDDIO decoupling for I2C pad switchingMore interface noise sensitivity; marginal at long cable/chain lengthsSame as C1 — hard rail short
R14.7 kΩ 0603 1% (Yageo RC0603FR-074K7L)SDA pull-up (via JP1); sets bus idle high, ~0.7 mA sink when a device drives lowWith JP1 bridged but R1 open, SDA floats (unless the host has pull-ups): bus hangs, no ACKsToo small a value exceeds pad sink capability; a short from 3V3 to SDA prevents any device from pulling the line low — bus stuck high
R24.7 kΩ 0603 1% (Yageo RC0603FR-074K7L)SCL pull-up (via JP2)SCL floats: no clock edges seen by U1Same failure class as R1 on the clock line
JP12-pad solder jumper, factory-bridgedLets the SDA pull-up be removed for chained stacks with one shared pull-up setCut on a single-module setup with a host that has no pull-ups: SDA floatsRe-bridged with a solder blob touching adjacent copper can short SDA to 3V3 or GND
JP22-pad solder jumper, factory-bridgedSame, for SCLSame as JP1, on SCLSame as JP1
JP33-pad solder jumper, 1-2 bridgedDrives SDO: the I2C address LSB (datasheet: SDO=GND → 0x76, SDO=VDDIO → 0x77; floating SDO = undefined address)SDO floats — address undefined, intermittent or no ACKBridging 1-2 and 2-3 shorts 3V3 to GND through the jumper: rail collapse
#FLG01, #FLG02KiCad PWR_FLAG symbols on 3V3 and GNDERC-only artifacts declaring the PMOD host as the power sourceNot physical parts. Nothing to assemble; they must simply exist in the schematic so ERC passesn/a

6. Datasheet summary and design interpretation#

DeviceKey manufacturer facts used hereBoard-specific interpretation
BMP280 (datasheet rev 1.26, Oct 2021)VDD 1.71–3.6 V, VDDIO 1.2–3.6 V, one-rail operation allowed; I2C address 111011x with SDO the LSB; chip ID register 0xD0 = 0x58; soft reset 0xE0 ← 0xB6; calibration words 0x88–0xA1 (dig_T1…dig_P9, 0xA0/0xA1 reserved); ctrl_meas 0xF4, config 0xF5, status 0xF3, data 0xF7–0xFC; start-up ≤2 ms; sleep 0.1 µA; SDA/SCL contain ESD diodes to VDDIO and GND, no clock stretchingThe single 3.3 V PMOD rail sits comfortably inside both supply ranges. CSB tied high enforces I2C mode permanently (once CSB is ever pulled low the part locks into SPI until POR — tying it high removes that hazard). SDO must never float, hence JP3's default bridge to GND. 4.7 kΩ pull-ups at 3.3 V give ~0.7 mA low-side sink, fine for 100–400 kHz bring-up
Yageo RC0603 / Murata GRM188 passivesGeneric thick-film chip resistors and X7R MLCCs (Yageo RC series)Values are non-critical: pull-ups ±1%, decouplers ±10% all acceptable. Verify orderable MPNs at BOM time — this board has not had an availability check

Official references: BMP280 datasheet (BST-BMP280-DS001) and the Bosch Sensortec BMP280 product page. Check the latest datasheet revision before procurement.

7. Expected values before bench testing#

All of these are design targets, not measurements.

QuantityTarget / calculatedSource
Rail3.30 V ±5% at C1/C2 padsPMOD spec / bench supply
Board idle current (sensor in sleep, bus idle)~0.1–0.5 µA + meter floor; anything over ~1 mA is a faultdatasheet IDDSL 0.1 µA typ, 0.3 µA max
Current during a measurementbrief peaks ≤1.12 mAdatasheet Ipeak 720 µA typ, 1120 µA max
SDA, SCL idle3.3 V (pull-ups through JP1/JP2)R1/R2 design
SDA or SCL driven low< 0.4 V, ~0.7 mA through the 4.7 kΩ pull-upI2C VOL convention
7-bit address ACK0x76 only (JP3 1-2); 0x77 only (JP3 2-3)datasheet §5.2
Chip ID, register 0xD00x58datasheet §4.3.1
Reset register 0xE0 readbackalways 0x00datasheet §4.3.2
press_msb 0xF7 / temp_msb 0xFA before any measurement0x80 / 0x80 (reset state)datasheet Table 18
Calibration block 0x88–0x9F12 nonzero 16-bit words, LSB first; not all-0x00, not all-0xFFdatasheet §3.11.2
dig_T1 (unsigned)same order as the datasheet worked example (27504); tens of thousandsdatasheet §3.12 example
dig_P1 (unsigned)same order as example (36477)datasheet §3.12 example
Compensated temperature, board on a bench indoors~15–35 °C (self-heating puts it slightly above ambient)plausibility bound
Compensated pressure at low altitude~950–1050 hPaplausibility bound
SDA/SCL-to-3V3 resistance, unpowered, JP1/JP2 bridged≈4.7 kΩ eachR1/R2
SDA/SCL-to-3V3 resistance, JP1/JP2 cutopen (>1 MΩ)jumper function

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Assumed setup: a PMOD host FPGA board or a current-limited 3.3 V bench supply wired to J1 pins 6/12 (3V3) and 5/11 (GND), plus any I2C master (FPGA core under test, USB-I2C adapter, or MCU dev board) on pins 3/4. Stop at the first abnormal result and record everything with board serial, equipment IDs, and ambient conditions.

A. Unpowered inspection and resistance tests#

  1. Complete the section 8 checklist under magnification.
  2. Meter, unpowered: 3V3-to-GND in both polarities — no hard short.
  3. SDA-to-3V3 ≈ 4.7 kΩ, SCL-to-3V3 ≈ 4.7 kΩ (through R1/JP1 and R2/JP2).
  4. JP3 common (U1 SDO) to GND ≈ 0 Ω; JP3 common to 3V3 open.
  5. SDA-to-SCL: open (no bridge between bus lines).

B. First power-on#

  1. Bench supply 3.30 V, current limit ~20 mA. Power the board with no I2C master attached.
  2. Supply current: expect the meter floor (sub-µA device draw). More than ~1 mA means a short or damaged part — power off and investigate.
  3. Probe SDA and SCL: both at 3.3 V (bus idle high through the pull-ups).
  4. Probe JP3 common: 0 V (SDO low, address 0x76).

C. Bus idle and address-ACK scan#

  1. Attach the I2C master (100 kHz for bring-up). Confirm idle levels remain 3.3 V on both lines.
  2. Run a full 7-bit address scan (0x08–0x77). Expected: exactly one ACK, at 0x76 (write byte on the wire: 0xEC).
  3. Move JP3 to 2-3 (or hold the SDO pad high through a 10 kΩ test resistor) and rescan: exactly one ACK at 0x77 (wire byte 0xEE). The datasheet allows the address to change live — no power cycle needed — but restore JP3 to 1-2 afterwards and rescan to confirm 0x76.
  4. Any extra ACKs mean a solder bridge on SDA/SCL or a misbehaving master.

D. Chip-ID read and soft reset#

  1. Read register 0xD0. On the wire: S 0xEC A 0xD0 A Sr 0xED A 0x58 N P. Expected data byte 0x58 exactly. (Bosch samples returned 0x56/0x57; mass-production BMP280 is 0x58 — a BME280 fitted by mistake returns 0x60.)
  2. Write 0xB6 to 0xE0 (soft reset), wait ≥2 ms, re-read 0xD0 → 0x58 again; read 0xF4 → 0x00 (sleep mode after POR); read 0xF7 → 0x80 and 0xFA → 0x80 (data registers at reset state, no measurement yet).

E. Calibration-block burst read and plausibility check#

  1. Burst-read 24 bytes starting at 0x88 (auto-increment): S 0xEC A 0x88 A Sr 0xED A d0…d23 N P. These are dig_T1…dig_P9, LSB first per word (0x88/0x89 = dig_T1 low/high … 0x9E/0x9F = dig_P9; 0xA0/0xA1 are reserved).
  2. Reject a read of all 0x00 or all 0xFF — that indicates a bus or NVM problem, not real trim data.
  3. Plausibility bounds (each production part differs; the datasheet worked example is dig_T1=27504, dig_T2=26435, dig_T3=−1000, dig_P1=36477, dig_P2=−10685, dig_P3=3024, dig_P4=2855, dig_P5=140, dig_P6=−7, dig_P7=15500, dig_P8=−14600, dig_P9=6000):
  1. Re-read the block twice; both reads must be identical (NVM is static).

F. First measurement and compensation-math sanity check#

  1. Write ctrl_meas 0xF4 = 0x27 (osrs_t=×1, osrs_p=×1, mode=normal) and config 0xF5 = 0x00 (filter off, minimum standby). Alternatively use forced mode 0xF4 = 0x25 per conversion.
  2. Poll status 0xF3 until bit 3 (measuring) is 0, or wait ~10 ms (exact max conversion time at ×1/×1 oversampling: verify against datasheet chapter 3.8 — this guide did not extract Table 13).
  3. Burst-read 6 bytes from 0xF7: press_msb/lsb/xlsb, temp_msb/lsb/xlsb. Assemble the 20-bit raw values: adc = (msb<<12) | (lsb<<4) | (xlsb>>4). Neither may still be 0x80000 (the "skipped" marker) or stuck at the 0x80/0x00/0x00 reset pattern.
  4. Run the datasheet compensation code (§3.11.3/§8) with the calibration words from step E. Cross-check the implementation first with the datasheet worked example: adc_T=519888, adc_P=415148 with the example trim set must produce T = 25.08 °C (t_fine=128422) and P = 100653.27 Pa. If your fixed-point pipeline reproduces those numbers, it is correct.
  5. Plausibility of the live reading: temperature ~15–35 °C on an indoor bench (expect it slightly above room ambient from self-heating); pressure ~950–1050 hPa at typical altitudes (at ~1500 m elevation expect ~850 hPa — adjust the bound to the lab's altitude).
  6. Stimulus checks: rest a fingertip near (not on) the vent — temperature must rise over tens of seconds. Move the board vertically by ~1 m or gently press the module in a small closed box — pressure must respond in the expected direction (~0.12 hPa per metre of altitude).

G. JP1/JP2 pull-up jumper verification (chaining)#

  1. Unpowered, JP1/JP2 bridged (default): ohmmeter SDA-to-3V3 ≈ 4.7 kΩ, SCL-to-3V3 ≈ 4.7 kΩ.
  2. Cut JP1 and JP2 (knife through the bridge, verify under magnification): SDA-to-3V3 and SCL-to-3V3 now read open (>1 MΩ; a slow-settling reading through the meter is the U1 pad ESD structure, not a resistor).
  3. Powered with pull-ups cut and no external pull-ups: the bus floats — confirm the scan now fails (this is the expected failure signature of a chained module whose partner is missing).
  4. Add external 4.7 kΩ pull-ups (or a partner module with its jumpers bridged) and re-run sections C–F: identical results expected.
  5. To restore single-module operation, re-bridge JP1/JP2 with solder and re-verify step 1.

H. Multi-module chain (optional, needs a second I2C PMOD)#

  1. Chain a second module on pins 9/10. Exactly one module in the chain may keep JP1/JP2 bridged.
  2. If the second device is another BMP280/BME280 board, set its JP3 to 2-3 so the addresses are 0x76 and 0x77; scan must show both, and chip-ID reads must return 0x58/0x60 respectively.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
Supply current at bench limit3V3-to-GND ohms, C1/C2, JP3 padsshorted decoupler, JP3 double-bridged, reversed U1
SDA or SCL not at 3.3 V idlejumper continuity, R1/R2 valuesJP1/JP2 cut or unsoldered, wrong resistor, bus short to GND
No ACK at any addressSCL edges at U1 pin 4, SDO levelSDA/SCL swapped at J1, U1 not powered, U1 dead or rotated
ACK at wrong addressJP3 common voltageJP3 in the other position, JP3 open (floating SDO = undefined)
Chip ID not 0x58raw wire capture0x60 = BME280 fitted; 0x00/0xFF = read logic bug or bus stuck
Calibration reads all 0x00/0xFFrepeat at 100 kHz, check ACK bitsburst-read implementation, bus integrity
Data registers stuck at 0x800000xF4 readbackctrl_meas never written (osrs=000 = skipped), write path broken
Compensated result implausiblererun math on datasheet exampleendianness of calibration words, signed/unsigned mix-up, t_fine bug
Pressure plausible but temperature absurd (or vice versa)dig_T vs dig_P word boundariesoff-by-one in the 0x88 burst offset
Works at 0x76, dead at 0x77JP3 2-3 bridge qualityJP3 solder, or another device already at 0x77 on the chain

11. Bench record template#

FieldRecord
Board revision / serial
JP1/JP2/JP3 state as tested
Host / supply, current limit, equipment IDs and calibration dates
Ambient temperature, pressure reference (if any), altitude
Unpowered resistance results (3V3-GND, SDA/SCL-3V3)
Idle current / measurement current
Address-scan result (both JP3 positions)
Chip-ID value
Calibration block dump (26 bytes) and decoded dig_ words
Worked-example cross-check pass/fail
Raw adc_T/adc_P and compensated T/P
Stimulus (touch / altitude) response
Pull-up cut/restore verification
Deviations, photos, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The schematic is a minimal, coherent I2C sensor module: single-rail BMP280 with both supplies decoupled, CSB hard-tied high so the interface mode can never be glitched into SPI, SDO firmly defined by JP3 (never floating), and removable pull-ups for chained operation. The design intentionally has no level shifting, protection, or regulation — the PMOD host owns the rail, and that boundary must be respected on the bench.

Principal open risks: the board exists only as a schematic (no layout, no DRC, no fab outputs); the LGA-8 orientation and vent-hole handling are assembly risks that cannot be reviewed until layout; there is no bench evidence for any number in this guide; and the compensation-math pipeline in fabric is unwritten — validate it against the datasheet worked example before trusting any live reading.