{
  "schema_version": 1,
  "type": "component",
  "slug": "bhi360-molecule-v11-137000",
  "title": "BHI360 Molecule v11",
  "brief": "16×16 mm BHI360 + BMM350 combo breakout (9-DOF fusion hub + aux-bus mag). I²C at 0x28 via MC12↔MC3 strap. Runs Shuttle3 BHI360+BMM350C fusion firmware.",
  "version": "1.0.1",
  "tags": [],
  "license": "MIT",
  "component": {
    "mpn": "BHI360 Molecule v11",
    "manufacturer": "",
    "package": "",
    "pin_count": null,
    "category": "other",
    "subcategory": "",
    "body_size": null,
    "parts": {},
    "distributor_links": {},
    "molecule_id": 8975450008581137000
  },
  "readme": "# BHI360 + BMM350 Combo Molecule — Hardware Reference\n\n16×16 mm combo breakout carrying a Bosch BHI360 smart-sensor hub (9-DOF fusion engine) and a BMM350 magnetometer on the BHI's internal auxiliary I²C bus. This is the target board for `fw_arm`'s **BHI360 combo** sensor (sensor_id `0x30` in the wire protocol).\n\n- **Source:** [adom-inc/bosch-molecules/Molecule_BHI360-BMM350_bosch_v1](https://github.com/adom-inc/bosch-molecules/tree/main/Molecule_BHI360-BMM350_bosch_v1) — imported 2026-04-17\n- **KiCad project:** `Molecule_BHI360-BMM350_bosch_v1.kicad_pro`\n- **Wiki page:** [molecules/bhi360-molecule-v11-137000](https://wiki-ufypy5dpx93o.adom.cloud/wiki/molecules/bhi360-molecule-v11-137000)\n- **Board:** 17 contacts on two columns (X=144 west, X=160 east), single-sided, silk revision `V1: 2025-09-03`, silkscreen title `BHI360+BMM350`\n- **ICs:** U1 = BHI360 (Bosch LGA-20, 2.5 × 3.0 × 0.95 mm), U2 = BMM350 (Bosch BGA-9 WLCSP)\n\n> **Mechanical/electrical twin:** the `Molecule_BHI385-BMM350` board is identical in layout and component placement. The only difference between the two is the IC itself (BHI360 vs BHI385) and the address strap the end user should apply. If a pair of combo modules is unlabelled, trust the silkscreen title (`BHI360+BMM350` vs `BHI385+BMM350`) and the date stamp.\n\n## Component summary\n\n| Ref | Part | Function |\n|---|---|---|\n| U1 | BHI360 | Smart-sensor hub — ARM Cortex-M4, runs Bosch fusion firmware |\n| U2 | BMM350 | 3-axis magnetometer on U1's **aux I²C bus** — not on the external bus |\n| C1, C5 | 100 nF 0402 | VDDIO decoupling |\n| C2, C6 | 100 nF 0402 | VDD decoupling |\n| C3 | VREG bypass (0603) | BHI360 internal regulator |\n| C4 | 2.2 µF 0805 | BMM350 CRST reset cap |\n| R1 | 10 kΩ 0402 | HCSB default pull-up to +VDDIO (holds I²C mode) |\n| R2 | 10 kΩ 0402 | BMM aux-bus SCK pull-up to +VDDIO |\n| R3 | 10 kΩ 0402 | BMM aux-bus SDA pull-up to +VDDIO |\n| R4 | LED current-limit 0402 | For D1 (BHI_LED) |\n| R5 | 10 kΩ 0402 | Default pull-up on MC12 strap → +VDDIO |\n| D1 | LED 0402 | Activity LED driven by BHI_LED pin (programmable via firmware) |\n\n## External contact map\n\n### West edge (X=144)\n\n| Ref | Silk | Net | Role |\n|---|---|---|---|\n| MP3 | `+VDD` | `+VDD` | BHI core rail — 1.71–1.89 V (**1.8 V only**) |\n| MC6 | `JTDIO` | `BHI_JTSG_DIO` | JTAG data I/O — for factory debug, leave floating |\n| MC1 | `RST` | `BHI_RST` | Active-low external reset — leave floating or pull high |\n| MC10 | `GND` | `GND` | Ground tap |\n| MC7 | `M3SDA` | `BHI_M3SDA` | Cortex-M3 debug SDA — leave floating |\n| MC8 | `M3SCL` | `BHI_M3SSCL/JTAG_CLK` | Cortex-M3 debug SCL / JTAG clock — leave floating |\n| MC14 | `HCSB` | `BHI_HCSB` | Interface strap — default high via R1 (I²C mode) |\n| MC9 | `SPI` | `GND` | SPI-select strap — bridge MC14 ↔ MC9 to pull HCSB low (forces SPI) |\n| MP1 | `GND` | `GND` | Ground |\n\n### East edge (X=160)\n\n| Ref | Silk | Net | Role |\n|---|---|---|---|\n| MP2 | `+VDDIO` | `+VDDIO` | Logic rail — 1.72–3.6 V |\n| MC2 | `HIRQ` | `BHI_HIRQ` | BHI host interrupt (active-low by default) |\n| MC5 | `HSCL` | `BHI_HSCX` | **I²C SCL to the BHI** |\n| MC4 | `HSDA` | `BHI_HSDX` | **I²C SDA to the BHI** |\n| MC12 | `0x28` | *(floating, pulled up by R5)* | **Address strap — bridge MC12↔MC3 to select 0x28** |\n| MC3 | `HSDO` | `BHI_HSDO/0x29/0x28` | SDO / address-select pin of the BHI |\n| MC14 | `HCSB` | (see west) | (listed on west, repeated here for reference) |\n| MC11 | `0x29` | `GND` | **Address strap — bridge MC11↔MC3 to select 0x29** |\n| MP4 | `GND` | `GND` | Ground |\n\n### I²C address strap (critical)\n\nThe BHI360's I²C slave address is set by HSDO at power-up. On this molecule, HSDO (MC3) is routed between two strap pads:\n\n| Strap | HSDO tied to | I²C address |\n|---|---|---|\n| **Bridge MC12 ↔ MC3 (silk `0x28`)** | +VDDIO (HIGH — via R5) | **0x28** ← *required for this molecule* |\n| Bridge MC11 ↔ MC3 (silk `0x29`) | GND (LOW) | 0x29 *(for the BHI385 sibling molecule)* |\n\nSchematic annotation on the board: *\"HSDO (I2C ADD Select). Jumper to GND (LOW): 0x29. Jumper to VDDIO (HIGH): 0x28. Reset Active-LOW.\"*\n\nThis convention is **opposite to the BMI270** (where SDO→GND gives the lower address). The BHI hub uses the inverted mapping internally; don't port an address rule from BMI270 over to BHI and expect it to work.\n\n**For this BHI360 molecule:** solder-bridge MC12 to MC3 so the firmware finds it at 0x28. On its sibling BHI385 molecule, bridge MC11 to MC3 for 0x29 instead.\n\n### Interface strap (HCSB — I²C vs SPI)\n\n| HCSB state | Mode |\n|---|---|\n| Floating / pulled high (default via R1) | I²C |\n| Bridge MC14 ↔ MC9 (silk `SPI`) | SPI (active-low select) |\n\nLeave unbridged for I²C.\n\n## Aux I²C bus (BMM350 — internal)\n\nU2 (BMM350) is wired to U1's auxiliary I²C master:\n\n| BMM350 pin | U1 (BHI360) pin |\n|---|---|\n| SDA (A2) | BHI M_SDA (pin 2) |\n| SCK (A3) | BHI M_SCK (pin 3) |\n| INT (A1) | BHI M_INT (pin 10) |\n| ADSEL (B2) | `GND` — fixed on-board via net `+VDDIO` pull tap only on standalone BMM350 |\n\nSchematic text on this molecule: *\"ADSEL (Legacy I2C Add): GND = 0x14\"* — confirms the on-board BMM350 is strapped to **0x14** on the aux bus. The BHI360 firmware blob (`Bosch_Shuttle3_BHI360_BMM350C.fw`) expects to find the mag at 0x14 on its aux master, so this matches.\n\nThe aux BMM350 is **not visible** on the external I²C lines. The host only sees the BHI hub at 0x28. Magnetometer samples come out of the BHI fusion engine as virtual-sensor outputs.\n\n## Power\n\n| Rail | Voltage | Source |\n|---|---|---|\n| VDD (BHI core + BMM core) | 1.71–1.89 V | **1.8 V rail** (shared with BMM350 and BHI385 VDD) |\n| VDDIO (both ICs) | 1.72–3.6 V | Host 3.3 V via MP2 |\n\nSchematic annotation: *\"BHI360: VDD 1.71–1.89 V, VDDIO 1.72–3.6 V, Turbo Mode 2.8 mA, Typical 0.95 mA.\"* Typical active current for the hub alone is ~0.95 mA, peaking at 2.8 mA during firmware RAM upload / turbo mode.\n\n## Firmware upload\n\nFirst-time boot requires the host to upload a firmware blob to the BHI360's SRAM via I²C. For this combo we use **`Bosch_Shuttle3_BHI360_BMM350C.fw`** (the Shuttle3-board fused firmware — BHI360 + BMM350 as 9-DOF virtual sensors). The blob is vendored in `firmware/sensors/bhi360_sdk/Bosch_Shuttle3_BHI360_BMM350C.fw.h`.\n\nUpload flow (already wired in `fw_arm`):\n\n1. Host sends `UPLOAD_BEGIN` frame (sensor_id 0x30, blob size, CRC32).\n2. Arm RM2 calls `bhy2_upload_firmware_to_ram()` (Bosch BHY2 SDK) over I²C.\n3. Host streams `UPLOAD_CHUNK` frames.\n4. Host sends `UPLOAD_END`; arm responds with `UPLOAD_STATUS` containing CRC check result.\n5. Firmware boots from RAM and the BHI360 starts exposing virtual-sensor IDs (accel, gyro, mag, orientation, rotation vector, gesture detectors, etc.).\n\n## Interrupt + LED\n\n- **HIRQ (MC2):** BHI → host interrupt line. Active-low. Signals FIFO not empty or async events. The `fw_arm` BHI driver polls by default, so wiring HIRQ is optional, but pulling in HIRQ enables efficient low-latency FIFO draining.\n- **LED (D1):** driven off-board by the BHI's LED pin; programmable via firmware. Useful \"is the chip alive?\" indicator during bring-up.\n\n## Wiring to the Arm RM2 I²C bus\n\n```\nCombo MP3 (VDD)  ──── +1.8 V rail\nCombo MP2 (VDDIO)──── RM2 +3V3\nCombo MP1 (GND)  ──── RM2 GND       (MP4 is a second GND tap — parallel OK)\nCombo MC4 (HSDA) ──── RM2 GPIO4 (I²C0 SDA, shared bus)\nCombo MC5 (HSCL) ──── RM2 GPIO5 (I²C0 SCL, shared bus)\nCombo MC2 (HIRQ) ──── (optional GPIO; enables IRQ-driven FIFO drain)\nCombo MC1 (RST)  ──── (optional GPIO, or tie to +VDDIO through 10 kΩ)\n```\n\n**Solder-bridge MC12 ↔ MC3** (strap to VDDIO / silk `0x28`).\n\nLeave unconnected: MC6 (JTDIO), MC7 (M3SDA), MC8 (M3SCL), MC9 (SPI), MC11 (`0x29` strap), MC14 (HCSB).\n\n## Gotchas for firmware bring-up\n\n- **Address strap is non-obvious and non-standard.** Bridge MC12↔MC3 on the BHI360 board (gives 0x28). The silk label \"0x28\" is on MC12 and the board's behavior depends on you actually making that bridge.\n- **VDD = 1.8 V only** (shared with the BHI385 and standalone BMM350).\n- **No external I²C pull-ups on this molecule** — rely on the main bus pull-ups. R2/R3 are on the internal aux bus, not the external bus.\n- **RST (MC1) is active-low.** If you wire it up, default it high. Never drive it high; use an open-drain driver or tie to +VDDIO via 10 kΩ.\n- **Firmware blob upload takes ~1–2 seconds** — during that window, no other I²C traffic should hit this sensor. The `fw_arm` dispatcher enforces this with a `SELECT` lock.\n- **Aux BMM350 is captive** to U1's fusion engine — you cannot talk to it directly. If you need raw magnetometer data at non-fused rates, use the standalone BMM350 molecule on the same bus at 0x15.\n- **The JTAG / M3 contacts (MC6, MC7, MC8) are for Bosch factory debug.** Do not connect them to GPIOs in the demo. Leave floating.\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.781Z",
  "updated_at": "2026-05-28T05:31:12.781Z",
  "org": "adom"
}