Circuit review & bench-test guide
AXS-008 — BMP280 barometric-pressure PMOD module
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#
- This is a 3.3 V logic-only module. Power it only from a PMOD host or a current-limited bench supply set to 3.30 V. The BMP280 absolute maximum on any supply pin is 4.25 V and on any interface pin VDDIO + 0.3 V; there is no on-board protection, regulator, or reverse-polarity guard.
- Set the bench-supply current limit low (≈20 mA) for first power-on. The sensor itself should draw microamps; anything near the limit indicates a fault.
- The LGA-8 metal-lid package is moisture/ESD sensitive (HBM ±2 kV). Use ESD precautions; do not probe the LGA pads with sharp tips harder than needed.
- Do not blow compressed air, solvents, or conformal coating into the sensor vent hole; do not exceed the 0–20000 hPa absolute-maximum pressure.
- A working I2C conversation is not a calibration statement. Accuracy claims (±1 hPa absolute, ±0.12 hPa relative) are datasheet figures for correctly reflowed production parts, and this prototype has never been through assembly or bench verification.
3. Power and control sequence#
- 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/#FLG02are ERC-only power-flag artifacts marking the host as the rail source — they place no physical part. - 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.
- 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). - 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.
- 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 pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | NC | NC | SCL | SDA | GND | 3V3 | NC | NC | SCL | SDA | GND | 3V3 |
Solder jumpers#
| Ref. | Function | Default | Alternative |
|---|---|---|---|
| JP1 | Connects R1 (4.7 kΩ) to SDA | Bridged (pull-up fitted) | Cut when another chained module provides the SDA pull-up |
| JP2 | Connects R2 (4.7 kΩ) to SCL | Bridged (pull-up fitted) | Cut when another chained module provides the SCL pull-up |
| JP3 | 3-pad SDO address select | 1-2: SDO = GND → 0x76 | 2-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 facts | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J1 | 12-pin PMOD plug, 2×6 | Sole power and I2C interface; bus repeated on pins 9/10 for chaining | No power/communication; an open pin 6 or 12 only (redundant rail pins) may still work and mask a solder defect | Swapped 3V3/GND destroys U1 (abs max 4.25 V is not the issue — reverse polarity is); SCL/SDA swap means no ACKs |
| U1 | Bosch 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 0x58 | The sensor itself: piezo-resistive pressure element + ASIC, factory calibration in NVM | No sensor — the board is inert; address scan finds nothing | Wrong 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 |
| C1 | 100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D) | U1 VDD decoupling for the 720 µA measurement current peaks | Supply bounce during conversions; possible resets or noisy readings | A shorted C1 is a 3V3–GND short: rail collapses, supply current hits the bench limit |
| C2 | 100 nF 16 V X7R 0603 (Murata GRM188R71C104KA01D) | U1 VDDIO decoupling for I2C pad switching | More interface noise sensitivity; marginal at long cable/chain lengths | Same as C1 — hard rail short |
| R1 | 4.7 kΩ 0603 1% (Yageo RC0603FR-074K7L) | SDA pull-up (via JP1); sets bus idle high, ~0.7 mA sink when a device drives low | With JP1 bridged but R1 open, SDA floats (unless the host has pull-ups): bus hangs, no ACKs | Too small a value exceeds pad sink capability; a short from 3V3 to SDA prevents any device from pulling the line low — bus stuck high |
| R2 | 4.7 kΩ 0603 1% (Yageo RC0603FR-074K7L) | SCL pull-up (via JP2) | SCL floats: no clock edges seen by U1 | Same failure class as R1 on the clock line |
| JP1 | 2-pad solder jumper, factory-bridged | Lets the SDA pull-up be removed for chained stacks with one shared pull-up set | Cut on a single-module setup with a host that has no pull-ups: SDA floats | Re-bridged with a solder blob touching adjacent copper can short SDA to 3V3 or GND |
| JP2 | 2-pad solder jumper, factory-bridged | Same, for SCL | Same as JP1, on SCL | Same as JP1 |
| JP3 | 3-pad solder jumper, 1-2 bridged | Drives SDO: the I2C address LSB (datasheet: SDO=GND → 0x76, SDO=VDDIO → 0x77; floating SDO = undefined address) | SDO floats — address undefined, intermittent or no ACK | Bridging 1-2 and 2-3 shorts 3V3 to GND through the jumper: rail collapse |
| #FLG01, #FLG02 | KiCad PWR_FLAG symbols on 3V3 and GND | ERC-only artifacts declaring the PMOD host as the power source | Not physical parts. Nothing to assemble; they must simply exist in the schematic so ERC passes | n/a |
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts used here | Board-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 stretching | The 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 passives | Generic 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.
| Quantity | Target / calculated | Source |
|---|---|---|
| Rail | 3.30 V ±5% at C1/C2 pads | PMOD spec / bench supply |
| Board idle current (sensor in sleep, bus idle) | ~0.1–0.5 µA + meter floor; anything over ~1 mA is a fault | datasheet IDDSL 0.1 µA typ, 0.3 µA max |
| Current during a measurement | brief peaks ≤1.12 mA | datasheet Ipeak 720 µA typ, 1120 µA max |
| SDA, SCL idle | 3.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-up | I2C VOL convention |
| 7-bit address ACK | 0x76 only (JP3 1-2); 0x77 only (JP3 2-3) | datasheet §5.2 |
| Chip ID, register 0xD0 | 0x58 | datasheet §4.3.1 |
| Reset register 0xE0 readback | always 0x00 | datasheet §4.3.2 |
| press_msb 0xF7 / temp_msb 0xFA before any measurement | 0x80 / 0x80 (reset state) | datasheet Table 18 |
| Calibration block 0x88–0x9F | 12 nonzero 16-bit words, LSB first; not all-0x00, not all-0xFF | datasheet §3.11.2 |
| dig_T1 (unsigned) | same order as the datasheet worked example (27504); tens of thousands | datasheet §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 hPa | plausibility bound |
| SDA/SCL-to-3V3 resistance, unpowered, JP1/JP2 bridged | ≈4.7 kΩ each | R1/R2 |
| SDA/SCL-to-3V3 resistance, JP1/JP2 cut | open (>1 MΩ) | jumper function |
8. Manual schematic and assembly review checklist#
- Confirm U1 orientation against the clockwise-numbered LGA-8 footprint (
Bosch_LGA-8_2x2.5mm_P0.65mm_ClockwisePinNumbering); pin 1 marking on silk must match the package dot. A rotated LGA is the most likely destructive assembly error on this board. - Verify the netlist mapping recorded in
generate_design.py: pin 2 CSB → 3V3, pin 3 SDI → SDA, pin 4 SCK → SCL, pin 5 SDO → JP3 common, pins 6/8 VDDIO/VDD → 3V3, pins 1/7 → GND. - Confirm JP3 is bridged 1-2 only, and JP1/JP2 are bridged, before power.
- Buzz J1: pins 5/11 to GND, 6/12 to 3V3, 3–9 and 4–10 continuity (chained bus), pins 1/2/7/8 isolated.
- Measure 3V3-to-GND resistance in both meter polarities; investigate any hard short before power (suspect C1/C2 or a JP3 double bridge).
- Check that no solder has wicked into the U1 vent-hole area and that flux was not trapped under the metal lid.
- Confirm the PCB (once laid out) keeps the vent hole exposed and puts C1/C2 within a few millimetres of U1's supply pins. This review item cannot be closed until layout exists.
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#
- Complete the section 8 checklist under magnification.
- Meter, unpowered: 3V3-to-GND in both polarities — no hard short.
- SDA-to-3V3 ≈ 4.7 kΩ, SCL-to-3V3 ≈ 4.7 kΩ (through R1/JP1 and R2/JP2).
- JP3 common (U1 SDO) to GND ≈ 0 Ω; JP3 common to 3V3 open.
- SDA-to-SCL: open (no bridge between bus lines).
B. First power-on#
- Bench supply 3.30 V, current limit ~20 mA. Power the board with no I2C master attached.
- Supply current: expect the meter floor (sub-µA device draw). More than ~1 mA means a short or damaged part — power off and investigate.
- Probe SDA and SCL: both at 3.3 V (bus idle high through the pull-ups).
- Probe JP3 common: 0 V (SDO low, address 0x76).
C. Bus idle and address-ACK scan#
- Attach the I2C master (100 kHz for bring-up). Confirm idle levels remain 3.3 V on both lines.
- Run a full 7-bit address scan (0x08–0x77). Expected: exactly one ACK, at 0x76 (write byte on the wire: 0xEC).
- 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.
- Any extra ACKs mean a solder bridge on SDA/SCL or a misbehaving master.
D. Chip-ID read and soft reset#
- 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.)
- 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#
- 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).
- Reject a read of all 0x00 or all 0xFF — that indicates a bus or NVM problem, not real trim data.
- 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):
- dig_T1, dig_P1 (unsigned) in the tens of thousands, neither 0 nor 65535;
- dig_T2 positive and of order 20000–30000;
- the signed words within roughly ±3× the example magnitudes.
- Re-read the block twice; both reads must be identical (NVM is static).
F. First measurement and compensation-math sanity check#
- 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.
- 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). - 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.
- 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.
- 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).
- 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)#
- Unpowered, JP1/JP2 bridged (default): ohmmeter SDA-to-3V3 ≈ 4.7 kΩ, SCL-to-3V3 ≈ 4.7 kΩ.
- 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).
- 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).
- Add external 4.7 kΩ pull-ups (or a partner module with its jumpers bridged) and re-run sections C–F: identical results expected.
- 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)#
- Chain a second module on pins 9/10. Exactly one module in the chain may keep JP1/JP2 bridged.
- 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#
| Symptom | First measurements | Likely areas |
|---|---|---|
| Supply current at bench limit | 3V3-to-GND ohms, C1/C2, JP3 pads | shorted decoupler, JP3 double-bridged, reversed U1 |
| SDA or SCL not at 3.3 V idle | jumper continuity, R1/R2 values | JP1/JP2 cut or unsoldered, wrong resistor, bus short to GND |
| No ACK at any address | SCL edges at U1 pin 4, SDO level | SDA/SCL swapped at J1, U1 not powered, U1 dead or rotated |
| ACK at wrong address | JP3 common voltage | JP3 in the other position, JP3 open (floating SDO = undefined) |
| Chip ID not 0x58 | raw wire capture | 0x60 = BME280 fitted; 0x00/0xFF = read logic bug or bus stuck |
| Calibration reads all 0x00/0xFF | repeat at 100 kHz, check ACK bits | burst-read implementation, bus integrity |
| Data registers stuck at 0x80000 | 0xF4 readback | ctrl_meas never written (osrs=000 = skipped), write path broken |
| Compensated result implausible | rerun math on datasheet example | endianness of calibration words, signed/unsigned mix-up, t_fine bug |
| Pressure plausible but temperature absurd (or vice versa) | dig_T vs dig_P word boundaries | off-by-one in the 0x88 burst offset |
| Works at 0x76, dead at 0x77 | JP3 2-3 bridge quality | JP3 solder, or another device already at 0x77 on the chain |
11. Bench record template#
| Field | Record |
|---|---|
| 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.