Skip to content

ICM-20948

TDK InvenSense ICM-20948 motion sensor (accelerometer + gyroscope + temperature; magnetometer NOT modelled).

Live catalog

Prefer labwired_describe with the catalog id over guessing pins or addresses.

Status at a glance

Aspect Status
Catalog id icm20948
Bus I²C
Address 0x68 (AD0 low); 0x69 (AD0 high)
Source configs/devices/icm20948.yaml (declarative, no Rust model)
Datasheet TDK InvenSense DS-000189 rev 1.3, §7 register map (user banks 0/2/3), §8 descriptions; cross-checked against Zephyr icm20948_reg.h
Tier smoke-proven (register-level tests: crates/core/tests/everyday_sensor_set.rs)

Pins / attachment

Pin / net Role
SDA I²C SDA
SCL I²C SCL
VDD/GND Power (digital twin)

Support matrix

Behavior Status Notes
WHO_AM_I (bank 0, 0x00) = 0xEA ✅
REG_BANK_SEL (0x7F) — banks 0 / 2 / 3 ✅ Same pointer decodes to different registers per bank
Accel / gyro / temp (0x2D..0x3A, int16 BE) ✅ Sensitivity follows bank-2 ACCEL_FS_SEL / GYRO_FS_SEL
Sleep (PWR_MGMT_1 = 0x41 at reset) ✅ Outputs read 0 until SLEEP is cleared
RAW_DATA_0_RDY (INT_STATUS_1) ✅ 1 ms after wake; clear on read
DEVICE_RESET ⚠️ Restores the modelled registers, not the bank select
AK09916 magnetometer (aux I²C master / bypass) ❌ I2C_SLVx are storage; EXT_SLV_SENS_DATA reads 0
FIFO, DMP, WoM, INT pin, PWR_MGMT_2 axis disables ❌
Analog / power ❌ Bench

Stimulus

Host inputs: accel_x/y/z (g), gyro_x/y/z (dps), temperature (°C).

How to run

  1. Place the part and an MCU in Playground, or add it to a system YAML:
    external_devices:
      - id: "icm20948"
        type: "icm20948"
        connection: "i2c0"   # the bus id your chip system uses
    
  2. Agent: labwired_list → labwired_describe id=icm20948 → wire → labwired_validate → labwired_run / labwired_verify.
  3. Register-level smoke: cargo test -p labwired-core --test everyday_sensor_set — WHO_AM_I 0xEA; PWR_MGMT_1 0x41; 16384 counts at 1 g on ±2 g after wake; bank-2 ACCEL_CONFIG 0x01. The same file's negative control proves the check fails against a part that answers only 0x00 or only 0xFF.

Limitations

  • The magnetometer is not modelled: firmware that needs it will time out rather than read fake data.

See the YAML header for the full datasheet trace and every named approximation.