component
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.
{
"schema_version": 1,
"type": "component",
"slug": "bmi270-bosch-v1-666000",
"title": "BMI270_Bosch_v1",
"brief": "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.",
"version": "1.0.0",
"tags": [],
"license": "MIT",
"component": {
"mpn": "BMI270_Bosch_v1",
"manufacturer": "",
"package": "",
"pin_count": null,
"category": "other",
"subcategory": "",
"body_size": null,
"parts": {},
"distributor_links": {},
"molecule_id": 9608338772991666000
},
"readme": "# BMI270 Molecule — Hardware Reference\n\n~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.\n\n- **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)\n- **KiCad project:** `Moecule_BMI270_Bosch_V1.kicad_pro`\n- **Wiki page:** [molecules/bmi270-bosch-v1-666000](https://wiki-ufypy5dpx93o.adom.cloud/wiki/molecules/bmi270-bosch-v1-666000)\n- **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`\n- **IC:** BMI270 (Bosch LGA-14, U1)\n\n## Component summary\n\n| Ref | Part | Function |\n|---|---|---|\n| U1 | BMI270 | 6-axis IMU (accel + gyro), LGA-14 |\n| C1 | 100 nF 0402 | VDDIO decoupling |\n| C2 | 100 nF 0402 | VDD decoupling |\n| R1 | 10 kΩ 0402 | Default pull-up on the `I2C / 0x69` strap net → +VDDIO |\n| Logo1 | Adom logo | silkscreen only |\n\n## External contact map\n\nPositions 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).\n\n### West edge (primary interface column)\n\n| Ref | Silk | Net | Role |\n|---|---|---|---|\n| MP2 | `VDD` | `+VDD` | Main rail — 1.71–3.6 V |\n| MC13 | `VDD` | `+VDD` | (duplicate — a second VDD tap) |\n| MC11 | `VIO` | `+VDDIO` | Logic rail — 1.2–3.6 V (typically tied to VDD) |\n| MC3 | `CSB` | `CSB` | **Interface select:** tie high for I²C (default via R1), tie low for SPI |\n| MC12 | `I2C` | `/0x69/I2C` | I²C/SPI mode strap (see below) |\n| MC1 | `SDO` | `SDO/0x68/0x69` | I²C address strap (see below) |\n| MC2 | `0x69` | `/0x69/I2C` | Strap option: bridge to MC1 for 0x69 |\n| MC10 | `0x68` | `GND` | Strap option: bridge to MC1 for 0x68 |\n| MP1 | `GND` | `GND` | Ground |\n\n### East edge (aux bus + interrupts + SPI lines)\n\n| Ref | Silk | Net | Role |\n|---|---|---|---|\n| MP3 | `SDX` | `SDX` | BMI270 primary serial data (I²C = SDA, SPI = MOSI) |\n| MC6 | `INT1` | `INT1` | Interrupt / data-ready output 1 |\n| MC5 | *(no silk)* | `ASCX` | **Aux I²C SCL** (BMI270 as I²C master to external mag) |\n| MC4 | `ASDX` | `ASDX` | **Aux I²C SDA** (BMI270 as I²C master to external mag) |\n| MC7 | `ASDX` *(silk overlap)* | `OSCB` | OSCB — SPI aux-bus clock for 4-wire internal slave-SPI debug |\n| MC9 | `OSCB` *(silk overlap)* | `OSDO` | OSDO — SPI aux-bus data out |\n| MC8 | `INT2` | `INT2` | Interrupt / data-ready output 2 |\n| MP4 | `SCX` | `SCX` | BMI270 primary serial clock (I²C = SCL, SPI = SCK) |\n\n### Reading the silk\n\nThe 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:\n\n```\nY=60 MP3 SDX (primary MOSI / SDA)\nY=62 MC6 INT1\nY=64 MC5 ASCX (aux I²C SCL)\nY=66 MC4 ASDX (aux I²C SDA)\nY=70 MC7 OSCB\nY=72 MC9 OSDO\nY=74 MC8 INT2\nY=76 MP4 SCX (primary SCK / SCL)\n```\n\n## Interface strap (CSB — I²C vs SPI)\n\n| CSB net state | Mode |\n|---|---|\n| Pulled high (default) | I²C |\n| Pulled low (bridge MC3 to GND) | 4-wire SPI |\n\nSchematic 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.\n\n## I²C address strap\n\nBMI270 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:\n\n| Strap | SDO tied to | I²C address |\n|---|---|---|\n| **Bridge MC1 ↔ MC10 (silk `0x68`)** | GND | **0x68** (demo firmware target ✓, Bosch default) |\n| Bridge MC1 ↔ MC2 (silk `0x69`) | `I2C/0x69` net (pulled up via R1) | 0x69 |\n\nSchematic text: *\"Jumper to GND (LOW): 0x68 (Default). Jumper to VDDIO (HIGH): 0x69.\"*\n\n**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.\n\n## Aux I²C bus (for standalone BMM350 fusion)\n\nThe 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.\n\nFor 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.\n\n## Power\n\n| Rail | Voltage | Source |\n|---|---|---|\n| VDD | 1.71–3.6 V | Host via MP2 (or MC13 as alternate tap) |\n| VDDIO | 1.2–3.6 V | Host via MC11 |\n\nDatasheet 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.\n\n## Interrupts\n\nINT1 (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.\n\n## Wiring to the Arm RM2 I²C bus\n\n```\nBMI270 MP2 (VDD) ──── RM2 +3V3\nBMI270 MC11 (VIO) ──── RM2 +3V3 (tie VDDIO = VDD)\nBMI270 MP1 (GND) ──── RM2 GND\nBMI270 MP3 (SDX) ──── RM2 GPIO4 (I²C0 SDA, shared bus)\nBMI270 MP4 (SCX) ──── RM2 GPIO5 (I²C0 SCL, shared bus)\nBMI270 MC6 (INT1) ──── (optional)\nBMI270 MC8 (INT2) ──── (optional)\nBMI270 MC4/MC5 ──── (unused — aux bus)\nBMI270 MC7/MC9 ──── (unused — slave-SPI debug)\n```\n\n**Bridge MC1 ↔ MC10** (solder blob or 0 Ω) to force SDO → GND → address 0x68.\n\n## Gotchas for firmware bring-up\n\n- **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.\n- **CSB must be high** for I²C mode. The R1 pull-up handles this; just don't accidentally ground MC3.\n- **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.\n- **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.\n- **Silk is cramped** on the east edge — when in doubt, trust the netlist above or probe with a multimeter.\n- **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).\n",
"author": {
"name": "Kyle Bergstedt",
"email": "[email protected]"
},
"visibility": {
"public": true
},
"hero": null,
"sample_prompts": [],
"discovery_triggers": [],
"discovery_pitch": null,
"metadata": {},
"created_at": "2026-05-28T05:31:12.114Z",
"updated_at": "2026-05-28T05:31:12.114Z",
"org": "adom"
}