Files
esphome-lsm6ds/docs/lsm6ds-upstream-bug-report.md
T

3.3 KiB

Bug: LSM6DS STATUS_REG XLDA/GDA masks are reversed

Summary

The LSM6DS base component has the accelerometer and gyroscope data-ready bits of STATUS_REG (0x1E) reversed.

The affected implementation treats:

status & 0x01  // GDA - gyroscope data available
status & 0x02  // XLDA - accelerometer data available

The correct mapping is:

Bit Mask Meaning


0 0x01 XLDA --- accelerometer data available 1 0x02 GDA --- gyroscope data available 2 0x04 TDA --- temperature data available

Test environment

  • LSM6DSOXTR
  • Seeed Studio XIAO ESP32-C6
  • ESPHome 2026.8.2
  • ESP-IDF
  • I2C
  • Accelerometer ODR: 104 Hz
  • Gyroscope ODR: OFF
  • Polling interval: 10 ms

Relevant configuration:

lsm6ds_i2c:
  id: imu
  i2c_id: i2c_bus
  address: 0x6A
  accel_range: 2G
  gyro_range: 250DPS
  accel_odr: 104HZ
  gyro_odr: "OFF"
  update_interval: 10ms

Reproduction and diagnostic evidence

To determine which data-ready bits were actually being asserted, temporary logging was added immediately after reading STATUS_REG:

uint8_t status;
if (!this->read_register(0x1E, &status, 1))
  return;

ESP_LOGW(TAG, "STATUS=0x%02X accel_odr=0x%02X gyro_odr=0x%02X",
         status,
         static_cast<uint8_t>(this->accel_odr_),
         static_cast<uint8_t>(this->gyro_odr_));

With:

accel_odr=0x04
gyro_odr=0x00

the device repeatedly reported:

STATUS=0x01 accel_odr=0x04 gyro_odr=0x00
STATUS=0x05 accel_odr=0x04 gyro_odr=0x00

0x02 was not observed.

0x05 is 0x01 | 0x04, corresponding to accelerometer data plus temperature data being available.

This behavior is consistent with:

0x01 = XLDA
0x02 = GDA
0x04 = TDA

rather than the mapping used by the component.

Fix

The data-ready tests should be:

if (this->gyro_odr_ != LSM6DS_ODR_OFF && (status & 0x02)) {  // GDA
    // read gyroscope
}

if (this->accel_odr_ != LSM6DS_ODR_OFF && (status & 0x01)) {  // XLDA
    // read accelerometer
}

Temperature handling remains unchanged:

if (status & 0x04) {  // TDA
    // read temperature
}

Validation

After correcting the masks, with the accelerometer configured at 104 Hz and the gyroscope disabled:

  • accelerometer X/Y/Z values update normally;
  • no gyroscope values are read/published;
  • temperature continues to update normally;
  • downstream pitch/roll calculations operate normally.

The correction is present in:

7adb22de2 lsm6ds: fix swapped accel and gyro status bits

During the investigation two related improvements were also made:

41cb715d6 lsm6ds: expose OFF output data rate
3b86faa44 lsm6ds: skip reads for disabled sensors

Diagnostic commits used to establish the register behavior were:

e2d4b947e lsm6ds: add temporary status diagnostics
53218bd4d lsm6ds: raise temporary status diagnostic to warning

These changes are separable from the XLDA/GDA mask correction itself.

Scope

This bug was discovered while investigating a separate ESP32-C6 interrupt-watchdog issue.

No claim is currently made that the reversed XLDA/GDA masks caused those watchdog resets. The status-register mapping error is independently reproducible and confirmed by the data-ready behavior described above.