BMM150
Bosch BMM150 3-axis geomagnetic sensor over I²C, with the suspend-mode Chip ID trap and a trim block.
Live catalog
Prefer labwired_describe with the catalog id over guessing pins or addresses.
Status at a glance
| Aspect | Status |
|---|---|
| Catalog id | bmm150 |
| Bus | I²C |
| Address | 0x10 (CSB, SDO low); 0x11 / 0x12 / 0x13 |
| Datasheet | Bosch BMM150 BST-BMM150-DS001-05 rev 1.4: §4.2 power modes, §5.2 register map, §5.3 Chip ID, §5.6 Table 15, §6.2 Table 30 |
| Source | configs/devices/bmm150.yaml (declarative, no Rust model) |
| Tier | smoke-proven (register-level tests: crates/core/tests/parts_batch5.rs) |
Pins / attachment
| Pin / net | Role |
|---|---|
| SDA / SCL | I²C |
| CSB / SDO | Address select |
| DRDY / INT | Not modelled |
| VDD/VDDIO/GND | Power (digital twin) |
Support matrix
| Behavior | Status | Notes |
|---|---|---|
| Suspend: Chip ID (and everything but 0x4B) reads 0x00 | ✅ | As the datasheet warns |
| Chip ID 0x32 once Power Control = 1 | ✅ | |
| DATA X/Y (13-bit), Z (15-bit), RHALL + Data Ready | ✅ | Through a reference trim unit |
| Trim block 0x5D..0x71 | ⚠️ | One reference unit (datasheet prints N/A); Bosch compensation reduces to a fixed gain |
| Soft reset (0x4B bits 7+1) | ✅ | |
| Opmode timing, interrupts, self-test, temperature drift, SPI | ❌ |
Stimulus
Host inputs: mag_x, mag_y, mag_z (µT).
How to run
- Place the part and an MCU in Playground, or add it to a system YAML:
- Agent:
labwired_list→labwired_describe id=bmm150→ wire →labwired_validate→labwired_run/labwired_verify. - Register-level smoke:
cargo test -p labwired-core --test parts_batch5— Chip ID 0x00 in suspend and 0x32 after power-up, the defaults, and the Bosch integer compensation (Zephyr's) recovering 20 / −5 / 40 µT;bmm150_tracks_the_field_and_suspend_hides_every_registersweeps the field and covers soft reset. The same file's negative control proves the check fails against a stand-in that answers only 0x00 or only 0xFF.
Limitations
- Trim values are a chosen reference unit, not a real part's NVM — the datasheet publishes none.
- Resolution is 0.3125 µT on X/Y and 0.5 µT on Z under that unit's trim.
See the YAML header for the full datasheet trace and every named approximation.