3. Status and Statistics¶
For IMU600-V2 / firmware 0.11.2 / GUI v1.6.1.
Follows chapter 3, pages 10–14 of Protocol v1.1. Defaults provide three STAT lines, one FUS and one SYS per second. Since fw 0.4.3, all counters are captured together, then sent in later loop iterations as STAT1 → STAT2 → STAT3 → FUS → SYS → HB (when enabled). Different transmission times still represent one snapshot.
- 3.1 $SPNVSTAT: individual IMU statistics
- 3.2 $SPNVFUS: fusion statistics
- 3.3 $SPNVSYS: system statistics
- 3.4 $SPNVHB: diagnostic heartbeat
Numbering starts after the message name. <...> and XX are placeholders; [...] marks optional fields and is not transmitted. Lines end in CRLF; XOR covers ASCII bytes between $ and *. Request an immediate set with $SPNVCMD,STAT,now.
3.1 $SPNVSTAT — Individual IMU Statistics (One Line per IMU)¶
$SPNVSTAT,<id>,<dry>,<out>,<crc_err>,<frame_err>,<spi_timeout>,<dropped>,<dcnt_skip>,<dry_timeout>,<dry_kicks>,<dry_pin>,<isr_us_max>,<isr_us_last>,<isr_cpu>,<resync>[,<read_retry>,<read_bad>]*XX
| # | Field | Description | Normal / Reference |
|---|---|---|---|
| 1 | id |
IMU number 1–3 | 1–3 |
| 2 | dry |
Cumulative DRY interrupts, about +1470/s; raw sampling count | ≈1470/s |
| 3 | out |
Output count; per-second increase should approach RATE | RATE/s |
| 4 | crc_err |
Internal SPI response CRC errors; normally 0 | 0 |
| 5 | frame_err |
SPI responses carrying S / CE / IDS sensor flags; not communication errors | 0 |
| 6 | spi_timeout |
Internal SPI timeouts; normally 0; 100 µs timeout from fw 0.10.6 | 0 |
| 7 | dropped |
Sampling/output queue drops; normally 0 | 0 |
| 8 | dcnt_skip |
Discontinuous sensor sample counter: possible missed / repeated reads; normally 0 | 0 |
| 9 | dry_timeout |
No DRY for >100 ms: 0 no, 1 yes | 0 |
| 10 | dry_kicks |
Extra reads to clear DRY held high; manual normal example stays at 1 after boot | 1 after startup |
| 11 | dry_pin |
Current DRY level 0 / 1, usually 0 | Usually 0 |
| 12 | isr_us_max |
Maximum DRY ISR execution time (µs). | ≈≤100 µs |
| 13 | isr_us_last |
Latest DRY ISR execution time (µs). | ≈≤100 µs |
| 14 | isr_cpu |
Last-second ISR CPU percentage for this IMU; reference about 13% | ≈13% |
| 15 | resync |
Output-boundary resynchronizations; normally 0 | 0 |
| 16 | read_retry |
fw 0.10.6+, ASCII only; immediate retries after initial CRC failure | 0 |
| 17 | read_bad |
fw 0.10.6+, ASCII only; raw samples discarded after failed retry | 0 |
dry and out accumulate since boot; use differences between snapshots for per-second values. dry_timeout is a current state, not a cumulative count. In fw 0.10.6 the internal SPI timeout is 100 µs, with interrupts briefly masked during transfer. read_retry / read_bad were appended to ASCII in fw 0.10.6 and are absent from Binary STAT; allow omitted or future trailing fields.
3.1.1 Investigating Increasing frame_err¶
The GUI’s “sensor flags” is frame_err: SPI response frames carrying S1:S0≠00, CE or IDS, not independent fault events or a direct link-quality metric. Seven responses form a raw sample, so one condition may add seven. A roughly 5 ms violent motion adding 52 is not 52 independent events. Check crc_err / spi_timeout (GUI “SPI errors”) for communication faults.
| PDF Bench Test: fw 0.4.3, 2026-10-08 | crc_err / spi_timeout | frame_err |
|---|---|---|
| Stationary | 0 | 0, no increase |
| Gentle motion within range | 0 | 0, no increase |
| Violent motion, peak >300 °/s | 0 | +52 on each IMU (saturation) |
| Cause / status | All Three? | Interpretation / Action |
|---|---|---|
| S_SAT / 16 | Usually; shared motion | Limits are ±300 °/s / ±156.9 m/s² including prefilter peaks, so averages within range can still hide saturation. Δθ / Δv may be too small. For repeated normal-operation flags, inspect motor/propeller/engine vibration and isolation; frequent exceedance calls for a higher-range gyro. |
| S_INIT / 32 | Yes | About 250 ms after power-on/REINIT. A short initial increase then stable count is usually normal. Recurrence during operation suggests checking reset from supply dips. Data is unreliable. |
| S_ERROR / 8 + IDS / 4 | All three: shared conditions; one: local sensor | Self-test fault, unreliable data. Inspect 3.3 V / VDDIO noise, dips and temperature. If persistent after REINIT, inspect soldering and sensor hardware. |
| CE / 2 | — | Invalid sensor command; data itself remains valid but fusion rejects by error mask. Unexpected in normal use; report to the vendor. |
- First check for rising crc_err / spi_timeout; if present, inspect communication and timing.
- Determine whether all three or only one are affected; shared symptoms suggest motion, vibration, shared power or temperature.
- Send
$SPNVCMD,OUT,rawand distinguish 16, 32 and 8 / 12 using 2.1.1 status. - Fusion normally excludes (status & 0x7F) ≠ 0; PPS is not an error. If all three are bad, it falls back to all three. Continued FUSED output does not prove health; inspect RAW status too.
3.2 $SPNVFUS — Fusion Statistics¶
$SPNVFUS,<outputs>,<rej1>,<rej2>,<rej3>,<incomplete>,<degraded>,<gth>,<ath>*XX
| # | Field | Type / Decimal Places | Unit | Description |
|---|---|---|---|---|
| 1 | outputs |
Integer | — | Cumulative fused output count. |
| 2–4 | rej1 / rej2 / rej3 |
Integer | — | Cumulative rejected intervals per IMU due to error flags or persistent deviation; excludes PPS. Should not increase during normal use or ordinary handheld motion. |
| 5 | incomplete |
Integer | — | Cumulative outputs generated before all three IMUs arrived. |
| 6 | degraded |
Integer | — | Cumulative instances with fewer than two usable IMUs. |
| 7 | gth |
Float, 3 decimals | °/s | Configured gyro rejection threshold. |
| 8 | ath |
Float, 3 decimals | m/s² | Configured acceleration rejection threshold. |
3.3 $SPNVSYS — System Statistics¶
$SPNVSYS,<uart_drop>,<loops_per_s>,<isr_cpu_total>,<rate_hz>,<out_mode>,<uart_resets>,<pps_cnt>,<baro_samples>,<baro_i2c_err>,<baro_timeouts>,<baro_stale>,<baro_hz>,<proto_mode>,<baud>,<pps_state>,<u2_drop>,<trig_cnt>,<trig_rej>*XX
| # | Field | Description |
|---|---|---|
| 1 | uart_drop |
Whole messages dropped when UART1 transmit queue is full |
| 2 | loops_per_s |
Main-loop iterations in last second; manual reference about 77000 |
| 3 | isr_cpu_total |
Combined ISR CPU percentage, reference about 40% |
| 4 | rate_hz |
Current IMU rate |
| 5 | out_mode |
none / raw / fused / both |
| 6 | uart_resets |
Automatic resets after UART TX stalls; normally 0 |
| 7 | pps_cnt |
Raw PPS captures, including noise; accepted count is SPNVPPS edges |
| 8 | baro_samples |
Successful barometer samples; increase per second about BRATE |
| 9 | baro_i2c_err |
I2C NACK / collision count; normally 0 |
| 10 | baro_timeouts |
Reinitializations after I2C timeout; normally 0 |
| 11 | baro_stale |
No new barometer data for >200 ms: 1 yes, 0 no |
| 12 | baro_hz |
Barometer rate |
| 13 | proto_mode |
ascii / binary |
| 14 | baud |
Current UART1 baud |
| 15 | pps_state |
0 OFF / 1 NO_SIGNAL / 2 ACQUIRING / 3 LOCKED / 4 HOLDOVER |
| 16 | u2_drop |
Whole messages dropped by full UART2 queue |
| 17 | trig_cnt |
Accepted rising edges in trigger mode; not counted in continuous mode |
| 18 | trig_rej |
Rejected edges from <0.5 ms glitches or trigger-event queue overflow while the main loop is busy |
Sustained uart_drop increases usually mean UART1 traffic exceeds bandwidth; reduce RATE/content or use binary/higher baud. baro_samples defaults to about +50/s; baro_stale is a current state, not a cumulative count. pps_state / u2_drop are available from fw 0.8.0 and trig_cnt / trig_rej from fw 0.9.0.
This is the ASCII field order. Binary SYS differs, uses numeric out_mode / proto_mode and has no baud field; follow the binary packet tables.
3.4 $SPNVHB — Diagnostic Heartbeat¶
Provides vendor diagnostics as key=value pairs. Ordinary applications may ignore it; when enabled, it is emitted once per second. The protocol PDF does not publish fixed key names, ordering or per-field types, so it is not a fixed-column packet like STAT / SYS.
The following is structural notation only: <key>, <value> and [...] are not literal device output and do not imply a published diagnostic-key list.
$SPNVHB,<key>=<value>[,<key>=<value>...]*XX
| Command | Description |
|---|---|
$SPNVCMD,HB,0 |
Disable diagnostic heartbeat. |
$SPNVCMD,HB,1 |
Enable diagnostic heartbeat. |
Document discrepancy: protocol section 3.4 says “once per second by default,” while the user manual parameter table lists HB default 0. The defaults conflict; set HB,0 or HB,1 explicitly and do not use heartbeat presence to determine whether measurement output is working.
If retaining diagnostics, validate line XOR first and retain key=value content. Preserve or ignore unknown keys rather than assigning fixed indices. See host parsing and integration for ASCII parsing.
Source document:IMU600-V2 Communication Protocol v1.1 · PDF pages 10–14