Skip to content

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

  1. Place the part and an MCU in Playground, or add it to a system YAML:
    external_devices:
      - id: "bmm150"
        type: "bmm150"
        connection: "i2c1"
    
  2. Agent: labwired_list → labwired_describe id=bmm150 → wire → labwired_validate → labwired_run / labwired_verify.
  3. 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_register sweeps 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.