BMM350 Molecule — Hardware Reference
Compact 9-contact breakout for the Bosch BMM350 3-axis magnetometer (WLCSP). Brings out separate VDD and VDDIO rails (the BMM350 has a stricter VDD range than most Bosch parts).
- Source: adom-inc/bosch-molecules/Moecule_BMM350_Bosch_V1 — imported 2026-04-17 (folder name misspelled
Moeculeupstream; we preserve that on disk) - KiCad project:
Moecule_BMM350_Bosch_V1.kicad_pro - Wiki page: molecules/bmm350-bosch-v1-075000
- Board: 9 contacts — 4 corner mount-pins carry I²C + VDDIO, 3 side contacts carry VDD / INT / address strap, silk revision
V1: 2025-09-03 - IC: BMM350 (Bosch BGA-9, 1.28 × 1.28 × 0.5 mm WLCSP, U1)
Component summary
| Ref | Part | Function |
|---|---|---|
| U1 | BMM350 | 3-axis magnetometer |
| C1 | 2.2 µF 0805 X7R | CRST reset / reservoir cap (schematic note: "CRST 2.2uF Recommended, X7R") |
| C2 | 100 nF 0402 | VDDIO decoupling |
| C3 | 100 nF 0402 | VDD decoupling |
| R5 | 10 kΩ 0402 | Default pull-up from +VDDIO → /0x15 strap net (→ default address 0x15) |
External contact map
Positions in mm on the front copper. Two columns: west (X=139.8) and east (X=147.8).
West edge
| Ref | Silk | Net | Role |
|---|---|---|---|
| MP2 | VDDIO | +VDDIO | Logic rail — 1.72–3.6 V |
| MC6 | VDD (silk y) | +VDD | Analog rail — 1.72–1.98 V only (tight tolerance!) |
| MC4 | INT | BMM_INT | Interrupt (push-pull or open-drain, pull-up at host if OD) |
| MP1 | GND | GND | Ground |
East edge
| Ref | Silk | Net | Role |
|---|---|---|---|
| MP3 | SDA (silk BMM350) | BMM_SDA | I²C SDA |
| MC12 | BMM350 | /0x15 | Strap test-point (pulled to +VDDIO via R5) |
| MC3 | ADSEL | BMM_ADSEL/0x14/0x15 | I²C address select — routed to U1 pin B2 |
| MC10 | 0x14 | GND | Strap option: bridge MC3 ↔ MC10 for 0x14 |
| MP4 | SCK | BMM_SCK | I²C SCL |
I²C address strap
BMM350 I²C slave address is set by ADSEL at power-up:
| ADSEL tied to | I²C address |
|---|---|
GND (bridge MC3 ↔ MC10, silk 0x14) | 0x14 |
+VDDIO (default — R5 pull-up to /0x15 net) | 0x15 (demo firmware target ✓) |
Schematic text: "ADSEL (Legacy I2C, LSB): GND = 0x14, VDDIO = 0x15."
Default is 0x15 — matches the firmware. Unless you intend to run it at 0x14, leave MC3 / MC10 unbridged.
Address conflict check on the arm bus
The arm I²C bus has: BMI270 @ 0x68, BMA400 @ 0x14, BMA580 @ 0x18, BMM350 @ 0x15 (this molecule), BHI360 @ 0x28, BHI385 @ 0x29.
If you accidentally strap BMM350 to 0x14 it will collide with the BMA400 on the same bus.
Power
| Rail | Voltage | Source |
|---|---|---|
| VDD (analog) | 1.72–1.98 V | 1.8 V supply required — cannot run at 3.3 V |
| VDDIO | 1.72–3.6 V | Host via MP2 (3.3 V in demo) |
This is the one molecule in the arm bus that needs a 1.8 V rail. The HARDWARE_CONFIG.md power plan uses the 1.8 V LDO (fed from 3.3 V) for BMV080 core + BHI360 VDD + BHI385 VDD + BMM350 VDD. Do not accidentally tie MC6 (silk y = VDD) to 3.3 V — that exceeds the BMM350 absolute maximum.
Also from schematic: "VDDIO is 300 mV max when VDD = 0 V." If you shut off VDD during operation, VDDIO must drop too or the chip sustains stress. Not an issue if both rails come up together and stay up.
Typical active current: 200 µA.
Interrupt
INT (MC4) is software-configurable for data-ready, FIFO watermark, or threshold events. Output can be push-pull or open-drain; if open-drain, supply an external pull-up on the host (not present on this molecule).
Magnetic field range
Schematic annotation: "Max ±2000 µT: (Bx, By, Bz < 0.75 × 2400 µT)." The BMM350's full-scale is ±2400 µT on each axis, and for linear behavior Bosch recommends staying under 2000 µT. Keep magnets / motors / ferrous tooling away from the mounted sensor.
Wiring to the Arm RM2 I²C bus
BMM350 MP2 (VDDIO) ──── RM2 +3V3
BMM350 MC6 (VDD) ──── +1.8 V rail (NOT +3V3!)
BMM350 MP1 (GND) ──── RM2 GND
BMM350 MP3 (SDA) ──── RM2 GPIO4 (I²C0 SDA, shared bus)
BMM350 MP4 (SCK) ──── RM2 GPIO5 (I²C0 SCL, shared bus)
BMM350 MC4 (INT) ──── (optional; if open-drain, needs external pull-up)
BMM350 MC3 (ADSEL) ──── (leave floating — default 0x15 via R5 pull-up)
Gotchas for firmware bring-up
- VDD is 1.8 V only. Do not feed 3.3 V into MC6 — the BMM350 will be damaged. This is the most common wiring mistake on the arm bus.
- Default address is 0x15 (matches firmware). Only bridge MC3↔MC10 if you explicitly want 0x14.
- CRST cap (C1, 2.2 µF X7R) is on-board — no external reset circuitry needed. But if you see the sensor NACKing after a brown-out, verify C1 is charging properly and the supply is stable.
- BMM350 OTP trim + self-test must run at init before the first measurement — already handled in
firmware/sensors/bmm350.c. - No 4.7 kΩ I²C pull-ups on this board — provided by the RM2 carrier / main arm bus.

