BMI270_Bosch_v1
Public Made by Adomby adom
16×16 mm breakout for the Bosch BMI270 6-axis IMU. Exposes main + auxiliary I²C, CSB / SDO straps. CRITICAL: default strap is 0x69 — bridge MC1↔MC10 for 0x68.
BMI270 Molecule — Hardware Reference
~16×16 mm breakout for the Bosch BMI270 low-power 6-axis IMU (accelerometer + gyroscope). Brings out the full interface including the BMI270's auxiliary I²C master bus for slaving an external magnetometer.
- Source: adom-inc/bosch-molecules/Moecule_BMI270_Bosch_V1 — imported 2026-04-17 (folder name misspelled
Moeculeupstream; we preserve that on disk) - KiCad project:
Moecule_BMI270_Bosch_V1.kicad_pro - Wiki page: molecules/bmi270-bosch-v1-666000
- Board: 17 contacts arranged as two rows at X=82 mm (west edge) and X=90 mm (east edge), single-sided, silk revision
V1: 2025-09-04 - IC: BMI270 (Bosch LGA-14, U1)
Component summary
| Ref | Part | Function |
|---|---|---|
| U1 | BMI270 | 6-axis IMU (accel + gyro), LGA-14 |
| C1 | 100 nF 0402 | VDDIO decoupling |
| C2 | 100 nF 0402 | VDD decoupling |
| R1 | 10 kΩ 0402 | Default pull-up on the I2C / 0x69 strap net → +VDDIO |
| Logo1 | Adom logo | silkscreen only |
External contact map
Positions in mm on the front copper. Two columns: west edge (X=82, silk labels on the left side) and east edge (X=90, silk labels on the right side).
West edge (primary interface column)
| Ref | Silk | Net | Role |
|---|---|---|---|
| MP2 | VDD |
+VDD |
Main rail — 1.71–3.6 V |
| MC13 | VDD |
+VDD |
(duplicate — a second VDD tap) |
| MC11 | VIO |
+VDDIO |
Logic rail — 1.2–3.6 V (typically tied to VDD) |
| MC3 | CSB |
CSB |
Interface select: tie high for I²C (default via R1), tie low for SPI |
| MC12 | I2C |
/0x69/I2C |
I²C/SPI mode strap (see below) |
| MC1 | SDO |
SDO/0x68/0x69 |
I²C address strap (see below) |
| MC2 | 0x69 |
/0x69/I2C |
Strap option: bridge to MC1 for 0x69 |
| MC10 | 0x68 |
GND |
Strap option: bridge to MC1 for 0x68 |
| MP1 | GND |
GND |
Ground |
East edge (aux bus + interrupts + SPI lines)
| Ref | Silk | Net | Role |
|---|---|---|---|
| MP3 | SDX |
SDX |
BMI270 primary serial data (I²C = SDA, SPI = MOSI) |
| MC6 | INT1 |
INT1 |
Interrupt / data-ready output 1 |
| MC5 | (no silk) | ASCX |
Aux I²C SCL (BMI270 as I²C master to external mag) |
| MC4 | ASDX |
ASDX |
Aux I²C SDA (BMI270 as I²C master to external mag) |
| MC7 | ASDX (silk overlap) |
OSCB |
OSCB — SPI aux-bus clock for 4-wire internal slave-SPI debug |
| MC9 | OSCB (silk overlap) |
OSDO |
OSDO — SPI aux-bus data out |
| MC8 | INT2 |
INT2 |
Interrupt / data-ready output 2 |
| MP4 | SCX |
SCX |
BMI270 primary serial clock (I²C = SCL, SPI = SCK) |
Reading the silk
The silk is cramped on the east edge and labels overlap. Use the netlist (above) as ground truth; the .kicad_pcb coordinates give the true ordering top-to-bottom (Y=60 → Y=76) on that side:
Y=60 MP3 SDX (primary MOSI / SDA)
Y=62 MC6 INT1
Y=64 MC5 ASCX (aux I²C SCL)
Y=66 MC4 ASDX (aux I²C SDA)
Y=70 MC7 OSCB
Y=72 MC9 OSDO
Y=74 MC8 INT2
Y=76 MP4 SCX (primary SCK / SCL)
Interface strap (CSB — I²C vs SPI)
| CSB net state | Mode |
|---|---|
| Pulled high (default) | I²C |
| Pulled low (bridge MC3 to GND) | 4-wire SPI |
Schematic text annotation: "CSB shares SDO pullup when high." In practice: leave MC3 floating and the default R1 pull-up holds the chip in I²C mode.
I²C address strap
BMI270 I²C slave address is set by the SDO pin at power-up. On this molecule, SDO is brought out as a 3-way strap:
| Strap | SDO tied to | I²C address |
|---|---|---|
Bridge MC1 ↔ MC10 (silk 0x68) |
GND | 0x68 (demo firmware target ✓, Bosch default) |
Bridge MC1 ↔ MC2 (silk 0x69) |
I2C/0x69 net (pulled up via R1) |
0x69 |
Schematic text: "Jumper to GND (LOW): 0x68 (Default). Jumper to VDDIO (HIGH): 0x69."
CRITICAL for bring-up: the default with MC1 floating is undefined — SDO is weakly coupled through R1 (10 kΩ pull-up) to the I2C/0x69 net, which would resolve to 0x69 if the user hasn't bridged anything. The firmware expects 0x68, so MC1 must be solder-bridged to MC10 (the GND strap silk'd 0x68). Verify this physically on the board before flashing.
Aux I²C bus (for standalone BMM350 fusion)
The BMI270 can act as an I²C master to a single external sensor via its aux bus (ASCX / ASDX). On this molecule the aux pads are brought out to external contacts (MC4 / MC5) — they are NOT auto-wired to anything on the PCB. If you want the BMI270 to fuse with an external BMM350, you have to wire MC4/MC5 off-board to the BMM350 breakout's SDA/SCK pins.
For our demo firmware, the arm-side magnetometer fusion is handled by the BHI360/BHI385 combo molecules (which have the BMM350 on their own internal aux bus). The standalone BMI270 therefore runs in 6-DOF mode only; MC4/MC5 can be left unconnected.
Power
| Rail | Voltage | Source |
|---|---|---|
| VDD | 1.71–3.6 V | Host via MP2 (or MC13 as alternate tap) |
| VDDIO | 1.2–3.6 V | Host via MC11 |
Datasheet annotation: "VDD/IO: 1.8 to 3.3. Typ: 685 µA." Typical active current is 685 µA with accelerometer + gyroscope in normal mode. For the demo: tie both VDD and VDDIO to +3.3 V.
Interrupts
INT1 (MC6) and INT2 (MC8) are push-pull active-low by default. Programmable for FIFO watermark, data-ready, any-motion, orientation, and the 8 kB feature engine (wrist-tilt, pickup, step counter). If unused → "If INT1,2 unused: DNC" (schematic note). Leave floating.
Wiring to the Arm RM2 I²C bus
BMI270 MP2 (VDD) ──── RM2 +3V3
BMI270 MC11 (VIO) ──── RM2 +3V3 (tie VDDIO = VDD)
BMI270 MP1 (GND) ──── RM2 GND
BMI270 MP3 (SDX) ──── RM2 GPIO4 (I²C0 SDA, shared bus)
BMI270 MP4 (SCX) ──── RM2 GPIO5 (I²C0 SCL, shared bus)
BMI270 MC6 (INT1) ──── (optional)
BMI270 MC8 (INT2) ──── (optional)
BMI270 MC4/MC5 ──── (unused — aux bus)
BMI270 MC7/MC9 ──── (unused — slave-SPI debug)
Bridge MC1 ↔ MC10 (solder blob or 0 Ω) to force SDO → GND → address 0x68.
Gotchas for firmware bring-up
- SDO strap is not GND by default — on the bare v1 board, the default (unbridged) state is 0x69 via R1. Bridge MC1↔MC10 before powering up or the firmware will miss the 0x68 probe.
- CSB must be high for I²C mode. The R1 pull-up handles this; just don't accidentally ground MC3.
- BMI270 needs a config blob upload at boot (~8 KB) before accel/gyro work — already handled in
firmware/sensors/bmi270.c, but it means a cold-boot read of raw registers before config upload returns garbage. - VDDIO must come up before or with VDD, otherwise the chip can latch up. Sequencing is fine if both rails are tied together on the carrier.
- Silk is cramped on the east edge — when in doubt, trust the netlist above or probe with a multimeter.
- Aux bus (ASCX/ASDX) is NOT connected on-board to any slave sensor on this molecule. If you expect magnetometer data, you need the BHI combo molecule instead (or wire an external BMM350 manually to MC4/MC5).
# BMI270 Molecule — Hardware Reference
~16×16 mm breakout for the Bosch BMI270 low-power 6-axis IMU (accelerometer + gyroscope). Brings out the full interface including the BMI270's **auxiliary I²C master bus** for slaving an external magnetometer.
- **Source:** [adom-inc/bosch-molecules/Moecule_BMI270_Bosch_V1](https://github.com/adom-inc/bosch-molecules/tree/main/Moecule_BMI270_Bosch_V1) — imported 2026-04-17 (folder name misspelled `Moecule` upstream; we preserve that on disk)
- **KiCad project:** `Moecule_BMI270_Bosch_V1.kicad_pro`
- **Wiki page:** [molecules/bmi270-bosch-v1-666000](https://wiki-ufypy5dpx93o.adom.cloud/wiki/molecules/bmi270-bosch-v1-666000)
- **Board:** 17 contacts arranged as two rows at X=82 mm (west edge) and X=90 mm (east edge), single-sided, silk revision `V1: 2025-09-04`
- **IC:** BMI270 (Bosch LGA-14, U1)
## Component summary
| Ref | Part | Function |
|---|---|---|
| U1 | BMI270 | 6-axis IMU (accel + gyro), LGA-14 |
| C1 | 100 nF 0402 | VDDIO decoupling |
| C2 | 100 nF 0402 | VDD decoupling |
| R1 | 10 kΩ 0402 | Default pull-up on the `I2C / 0x69` strap net → +VDDIO |
| Logo1 | Adom logo | silkscreen only |
## External contact map
Positions in mm on the front copper. **Two columns:** west edge (X=82, silk labels on the left side) and east edge (X=90, silk labels on the right side).
### West edge (primary interface column)
| Ref | Silk | Net | Role |
|---|---|---|---|
| MP2 | `VDD` | `+VDD` | Main rail — 1.71–3.6 V |
| MC13 | `VDD` | `+VDD` | (duplicate — a second VDD tap) |
| MC11 | `VIO` | `+VDDIO` | Logic rail — 1.2–3.6 V (typically tied to VDD) |
| MC3 | `CSB` | `CSB` | **Interface select:** tie high for I²C (default via R1), tie low for SPI |
| MC12 | `I2C` | `/0x69/I2C` | I²C/SPI mode strap (see below) |
| MC1 | `SDO` | `SDO/0x68/0x69` | I²C address strap (see below) |
| MC2 | `0x69` | `/0x69/I2C` | Strap option: bridge to MC1 for 0x69 |
| MC10 | `0x68` | `GND` | Strap option: bridge to MC1 for 0x68 |
| MP1 | `GND` | `GND` | Ground |
### East edge (aux bus + interrupts + SPI lines)
| Ref | Silk | Net | Role |
|---|---|---|---|
| MP3 | `SDX` | `SDX` | BMI270 primary serial data (I²C = SDA, SPI = MOSI) |
| MC6 | `INT1` | `INT1` | Interrupt / data-ready output 1 |
| MC5 | *(no silk)* | `ASCX` | **Aux I²C SCL** (BMI270 as I²C master to external mag) |
| MC4 | `ASDX` | `ASDX` | **Aux I²C SDA** (BMI270 as I²C master to external mag) |
| MC7 | `ASDX` *(silk overlap)* | `OSCB` | OSCB — SPI aux-bus clock for 4-wire internal slave-SPI debug |
| MC9 | `OSCB` *(silk overlap)* | `OSDO` | OSDO — SPI aux-bus data out |
| MC8 | `INT2` | `INT2` | Interrupt / data-ready output 2 |
| MP4 | `SCX` | `SCX` | BMI270 primary serial clock (I²C = SCL, SPI = SCK) |
### Reading the silk
The silk is cramped on the east edge and labels overlap. Use the netlist (above) as ground truth; the `.kicad_pcb` coordinates give the true ordering top-to-bottom (Y=60 → Y=76) on that side:
```
Y=60 MP3 SDX (primary MOSI / SDA)
Y=62 MC6 INT1
Y=64 MC5 ASCX (aux I²C SCL)
Y=66 MC4 ASDX (aux I²C SDA)
Y=70 MC7 OSCB
Y=72 MC9 OSDO
Y=74 MC8 INT2
Y=76 MP4 SCX (primary SCK / SCL)
```
## Interface strap (CSB — I²C vs SPI)
| CSB net state | Mode |
|---|---|
| Pulled high (default) | I²C |
| Pulled low (bridge MC3 to GND) | 4-wire SPI |
Schematic text annotation: *"CSB shares SDO pullup when high."* In practice: leave MC3 floating and the default R1 pull-up holds the chip in I²C mode.
## I²C address strap
BMI270 I²C slave address is set by the SDO pin at power-up. On this molecule, SDO is brought out as a 3-way strap:
| Strap | SDO tied to | I²C address |
|---|---|---|
| **Bridge MC1 ↔ MC10 (silk `0x68`)** | GND | **0x68** (demo firmware target ✓, Bosch default) |
| Bridge MC1 ↔ MC2 (silk `0x69`) | `I2C/0x69` net (pulled up via R1) | 0x69 |
Schematic text: *"Jumper to GND (LOW): 0x68 (Default). Jumper to VDDIO (HIGH): 0x69."*
**CRITICAL for bring-up:** the default with MC1 floating is **undefined** — SDO is weakly coupled through R1 (10 kΩ pull-up) to the `I2C/0x69` net, which would resolve to 0x69 if the user hasn't bridged anything. The firmware expects **0x68**, so MC1 **must** be solder-bridged to MC10 (the GND strap silk'd `0x68`). Verify this physically on the board before flashing.
## Aux I²C bus (for standalone BMM350 fusion)
The BMI270 can act as an I²C master to a single external sensor via its aux bus (ASCX / ASDX). **On this molecule the aux pads are brought out to external contacts (MC4 / MC5)** — they are NOT auto-wired to anything on the PCB. If you want the BMI270 to fuse with an external BMM350, you have to wire MC4/MC5 off-board to the BMM350 breakout's SDA/SCK pins.
For our demo firmware, the arm-side magnetometer fusion is handled by the BHI360/BHI385 combo molecules (which have the BMM350 on their own internal aux bus). The standalone BMI270 therefore runs in 6-DOF mode only; MC4/MC5 can be left unconnected.
## Power
| Rail | Voltage | Source |
|---|---|---|
| VDD | 1.71–3.6 V | Host via MP2 (or MC13 as alternate tap) |
| VDDIO | 1.2–3.6 V | Host via MC11 |
Datasheet annotation: *"VDD/IO: 1.8 to 3.3. Typ: 685 µA."* Typical active current is 685 µA with accelerometer + gyroscope in normal mode. For the demo: tie both VDD and VDDIO to +3.3 V.
## Interrupts
INT1 (MC6) and INT2 (MC8) are push-pull active-low by default. Programmable for FIFO watermark, data-ready, any-motion, orientation, and the 8 kB feature engine (wrist-tilt, pickup, step counter). If unused → *"If INT1,2 unused: DNC"* (schematic note). Leave floating.
## Wiring to the Arm RM2 I²C bus
```
BMI270 MP2 (VDD) ──── RM2 +3V3
BMI270 MC11 (VIO) ──── RM2 +3V3 (tie VDDIO = VDD)
BMI270 MP1 (GND) ──── RM2 GND
BMI270 MP3 (SDX) ──── RM2 GPIO4 (I²C0 SDA, shared bus)
BMI270 MP4 (SCX) ──── RM2 GPIO5 (I²C0 SCL, shared bus)
BMI270 MC6 (INT1) ──── (optional)
BMI270 MC8 (INT2) ──── (optional)
BMI270 MC4/MC5 ──── (unused — aux bus)
BMI270 MC7/MC9 ──── (unused — slave-SPI debug)
```
**Bridge MC1 ↔ MC10** (solder blob or 0 Ω) to force SDO → GND → address 0x68.
## Gotchas for firmware bring-up
- **SDO strap is not GND by default** — on the bare v1 board, the default (unbridged) state is 0x69 via R1. Bridge MC1↔MC10 before powering up or the firmware will miss the 0x68 probe.
- **CSB must be high** for I²C mode. The R1 pull-up handles this; just don't accidentally ground MC3.
- **BMI270 needs a config blob upload at boot** (~8 KB) before accel/gyro work — already handled in `firmware/sensors/bmi270.c`, but it means a cold-boot read of raw registers before config upload returns garbage.
- **VDDIO must come up before or with VDD**, otherwise the chip can latch up. Sequencing is fine if both rails are tied together on the carrier.
- **Silk is cramped** on the east edge — when in doubt, trust the netlist above or probe with a multimeter.
- **Aux bus (ASCX/ASDX) is NOT connected on-board** to any slave sensor on this molecule. If you expect magnetometer data, you need the BHI combo molecule instead (or wire an external BMM350 manually to MC4/MC5).