whatic.io β
From the bench

ICM-42607-C configuration: wake-on-motion (WOM) with INT1 wake

September 13, 2026 · AI-generated from the datasheet, fact-checked by two independent LLM critics

Use case

Always-on wake-on-motion (WOM): the ICM-42607-C accelerometer runs in Low-Power (LP) mode, duty-cycling at a low ODR and comparing samples against per-axis thresholds. On motion it asserts INT1, waking a sleeping host MCU. The gyro is off. The rest of this post answers the questions you need answered to write that firmware.

Next step
Start building with ICM-42607-C → This guide comes from the same grounded, cited datasheet answers — ask the assistant your own ICM-42607-C questions.

Q: What is the exact register write order for the ICM-42607-C?

All Bank 0 registers unless noted. MREG1 registers are reached indirectly: write the target address to MREG1_ADDR, then data to MREG1_DATA; use REG_BANK_SEL to switch user banks.

 1. Soft reset            -> SIGNAL_PATH_RESET (Bank 0 0x02), write bit 4 SOFT_RESET_DEVICE_CONFIG = 1 (auto-clearing)
 2. Poll for reset done   -> poll INT_STATUS bit 4 RESET_DONE_INT until it reads 1, then read it (clears it)
 3. Confirm sensors off   -> PWR_MGMT0 (0x1F): ACCEL_MODE = 00, GYRO_MODE = 00 (configure while device is off)
 4. LP clock source       -> PWR_MGMT0 (0x1F) bit 7 ACCEL_LP_CLK_SEL = 0 (wake-up oscillator; datasheet-recommended)
 5. ODR + range           -> ACCEL_CONFIG0 (0x21): ACCEL_ODR = LP-mode code, ACCEL_UI_FS_SEL as needed
 6. WOM debounce/mode     -> WOM_CONFIG (0x27): WOM_INT_DUR, WOM_INT_MODE, WOM_MODE (MUST be written before WOM_EN = 1)
 7. WOM thresholds        -> ACCEL_WOM_X_THR / _Y_THR / _Z_THR (MREG1 0x4B / 0x4C / 0x4D)
 8. Route WOM to INT1     -> INT_SOURCE1 (Bank 0 0x2C), write 0x07 (WOM_X/Y/Z_INT1_EN = 1)
 9. INT1 electrical       -> INT_CONFIG (0x22): INT1_MODE (level/pulse), INT1_DRV (push-pull/open-drain), INT1_POL (active-high/low)
10. Arm + enable accel    -> WOM_CONFIG (0x27): WOM_EN = 1; then PWR_MGMT0 (0x1F): ACCEL_MODE = 10 (LP), GYRO_MODE = 00
11. Honor the hold-off    -> after the OFF-to-LP transition, issue no register writes for 200 us, then allow the accel start-up time before expecting valid samples

Notes on ordering:

Q: Which settings on the ICM-42607-C are required vs. choices?

Required (dictated by the use case):

Choices, with the trade-off the datasheet states:

Threshold values: the datasheet publishes no recommended WOM threshold. ACCEL_WOM_X/Y/Z_THR span 0-1 g at ~3.9 mg/LSB. The only numeric inputs the datasheet gives are that resolution and the part's RMS noise of 1.0 mg-rms (100 Hz BW); any specific starting point — e.g. a value a few LSB above the noise floor, then tuned against bench false-wake/missed-wake tests — is engineering judgment, not a datasheet recommendation. [PRACTICE]

Q: What delays and polls are required?

Q: How does firmware read the result?

This is an interrupt model — the host sleeps; no polling happens while it sleeps.

  1. MCU exits sleep on the INT1 edge/level.
  2. Read INT_STATUS2 (Bank 0 0x3B, read-to-clear). Bit 2 = WOM_X_INT, bit 1 = WOM_Y_INT, bit 0 = WOM_Z_INT, bit 3 = SMD_INT. This tells you which axis tripped.
  3. The read itself clears the latch — all INT_STATUS bits are latched, read-to-clear — which releases INT1 (pulse mode) or releases it after the read (latched mode) and automatically re-arms WOM. No reconfigure write is needed before the host goes back to sleep.
  4. Optionally read ACCEL_DATA_X1/X0 (0x0B/0x0C), Y1/Y0 (0x0D/0x0E), Z1/Z0 (0x0F/0x10) as one burst read (address auto-increments; registers are 16-bit two's complement) to see the actual motion — INT_STATUS2 tells you which axis, not how much.
  5. Sleep. The INT_STATUS2 read already re-armed WOM. [PRACTICE]

If the INT1 line is latched mode, remember the host must read INT_STATUS2 to de-assert it; failing to do so means the system cannot re-arm for the next event.

Q: How do I verify the configuration took on the ICM-42607-C?

Layered, cheapest first:

Layer Check Register Pass when
0 Clock running MCLK_RDY (Bank 0 0x00) bit 3 reads 1 ("internal clock is currently running")
0 Identity WHO_AM_I (Bank 0 0x75) reads 0x61. Must read Bank 0 first, or you read something else
1 Accel streaming INT_STATUS_DRDY (0x39) bit 0 DATA_RDY_INT repeatedly sets and clears on read
1 Data sane ACCEL_DATA_X/Y/Z (0x0B-0x10) Z about 1 g level, values change when moved
2 Writes landed PWR_MGMT0, ACCEL_CONFIG0, WOM_CONFIG, WOM threshold regs each reads back exactly what you wrote
3 Reset done INT_STATUS bit 4 RESET_DONE_INT observed 1, then 0 after the read
4 WOM functions INT_STATUS2 (0x3B) WOM flag sets on a physical nudge, clears on read

Two caveats on Layer 2: read-back proves the write landed, not that the combination is electrically valid — forbidden ODR/averaging pairs in LP mode will read back correctly and still not behave. Only the functional nudge test (Layer 4) catches that. And for MREG1 registers (ACCEL_WOM_X/Y/Z_THR), read back through the same MREG1_ADDR/MREG1_DATA indirect path you wrote through.

If you also poll DATA_RDY_INT in latched mode (Layer 1) rather than relying on it self-clearing, its clearing behavior is configured by UI_DRDY_INT_CLEAR — bits 5:4 of INT_CONFIG0, which is an MREG1 register, not Bank 0: 00/01 clear on a status-bit read, 10 clears on a sensor-register read, 11 clears on either. FIFO_THS_INT_CLEAR (bits 3:2) and FIFO_FULL_INT_CLEAR (bits 1:0) in the same register follow the same three-option pattern.

Common mistakes

  1. Arming WOM with ACCEL_MODE = 00 (the reset value) — no samples, no interrupts, ever.
  2. Writing WOM_INT_DUR/WOM_INT_MODE/WOM_MODE after WOM_EN = 1 — writes are silently ignored.
  3. Using an LN-mode-only ODR code in LP mode, or a forbidden ODR/averaging pair.
  4. Writing registers inside the 200 us window after an OFF-to-active sensor transition.
  5. Leaving thresholds at reset 0x00 — most sensitive edge, twitchy on noise.
  6. Routing via INT_SOURCE0 (0x2B) — that register has no WOM bit. WOM-to-INT1 enables are per-axis in INT_SOURCE1 (0x2C): WOM_X/Y/Z_INT1_EN (bits 2:0). (INT_SOURCE4 routes to INT2; INT_SOURCE9 routes to IBI.)

What's still unverified

Per-ODR current figures in LP mode were not recoverable from the datasheet corpus — the only current figure available is a features-list headline for Low-Noise mode (0.55 mA, 6-axis), which is a different mode and not broken out by ODR. Validate actual draw on your bench before locking the battery budget.

Part page: ICM-42607-C.