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
- Place the part and an MCU in Playground, or add it to a system YAML:
- Agent:
labwired_list→labwired_describe id=icm20948→ wire →labwired_validate→labwired_run/labwired_verify. - 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.