From c5dbe18be1213376fd7832d07c87ea3d455847d3 Mon Sep 17 00:00:00 2001 From: Lucas Bremgartner Date: Fri, 28 Oct 2022 20:37:12 +0200 Subject: [PATCH] lsm303agr: fix I2C address auto increment for multi data read fixes: #475 --- lsm303agr/lsm303agr.go | 6 +++--- lsm303agr/registers.go | 49 +++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/lsm303agr/lsm303agr.go b/lsm303agr/lsm303agr.go index 39bf84f..55cd9bd 100644 --- a/lsm303agr/lsm303agr.go +++ b/lsm303agr/lsm303agr.go @@ -137,7 +137,7 @@ func (d *Device) Configure(cfg Configuration) (err error) { // -1000000. func (d *Device) ReadAcceleration() (x, y, z int32, err error) { data := d.buf[:6] - err = d.bus.ReadRegister(uint8(d.AccelAddress), ACCEL_OUT_X_L_A, data) + err = d.bus.ReadRegister(uint8(d.AccelAddress), ACCEL_OUT_AUTO_INC, data) if err != nil { return } @@ -190,7 +190,7 @@ func (d *Device) ReadMagneticField() (x, y, z int32, err error) { } data := d.buf[0:6] - d.bus.ReadRegister(uint8(d.MagAddress), MAG_OUT_X_L_M, data) + d.bus.ReadRegister(uint8(d.MagAddress), MAG_OUT_AUTO_INC, data) x = int32(int16((uint16(data[1])<<8 | uint16(data[0])))) y = int32(int16((uint16(data[3])<<8 | uint16(data[2])))) @@ -219,7 +219,7 @@ func (d *Device) ReadCompass() (h int32, err error) { func (d *Device) ReadTemperature() (t int32, err error) { data := d.buf[:2] - err = d.bus.ReadRegister(uint8(d.AccelAddress), OUT_TEMP_L_A, data) + err = d.bus.ReadRegister(uint8(d.AccelAddress), OUT_TEMP_AUTO_INC, data) if err != nil { return } diff --git a/lsm303agr/registers.go b/lsm303agr/registers.go index 6767f2f..11e511c 100644 --- a/lsm303agr/registers.go +++ b/lsm303agr/registers.go @@ -6,31 +6,40 @@ const ( ACCEL_ADDRESS = 0x19 MAG_ADDRESS = 0x1E + // i2C 8-bit subaddress (SUB): the 7 LSb represent the actual register address + // while the MSB enables address auto increment. + // If the MSb of the SUB field is 1, the SUB (register address) is + // automatically increased to allow multiple data read/writes. + ADDR_AUTO_INC_MASK = 0x80 + // accelerometer registers. - ACCEL_WHO_AM_I = 0x0F - ACCEL_CTRL_REG1_A = 0x20 - ACCEL_CTRL_REG4_A = 0x23 - ACCEL_OUT_X_L_A = 0x28 - ACCEL_OUT_X_H_A = 0x29 - ACCEL_OUT_Y_L_A = 0x2A - ACCEL_OUT_Y_H_A = 0x2B - ACCEL_OUT_Z_L_A = 0x2C - ACCEL_OUT_Z_H_A = 0x2D + ACCEL_WHO_AM_I = 0x0F + ACCEL_CTRL_REG1_A = 0x20 + ACCEL_CTRL_REG4_A = 0x23 + ACCEL_OUT_X_L_A = 0x28 + ACCEL_OUT_X_H_A = 0x29 + ACCEL_OUT_Y_L_A = 0x2A + ACCEL_OUT_Y_H_A = 0x2B + ACCEL_OUT_Z_L_A = 0x2C + ACCEL_OUT_Z_H_A = 0x2D + ACCEL_OUT_AUTO_INC = ACCEL_OUT_X_L_A | ADDR_AUTO_INC_MASK // magnetic sensor registers. - MAG_WHO_AM_I = 0x4F - MAG_MR_REG_M = 0x60 - MAG_OUT_X_L_M = 0x68 - MAG_OUT_X_H_M = 0x69 - MAG_OUT_Y_L_M = 0x6A - MAG_OUT_Y_H_M = 0x6B - MAG_OUT_Z_L_M = 0x6C - MAG_OUT_Z_H_M = 0x6D + MAG_WHO_AM_I = 0x4F + MAG_MR_REG_M = 0x60 + MAG_OUT_X_L_M = 0x68 + MAG_OUT_X_H_M = 0x69 + MAG_OUT_Y_L_M = 0x6A + MAG_OUT_Y_H_M = 0x6B + MAG_OUT_Z_L_M = 0x6C + MAG_OUT_Z_H_M = 0x6D + MAG_OUT_AUTO_INC = MAG_OUT_X_L_M | ADDR_AUTO_INC_MASK // temperature sensor registers. - TEMP_CFG_REG_A = 0x1F - OUT_TEMP_L_A = 0x0C - OUT_TEMP_H_A = 0x0D + TEMP_CFG_REG_A = 0x1F + OUT_TEMP_L_A = 0x0C + OUT_TEMP_H_A = 0x0D + OUT_TEMP_AUTO_INC = OUT_TEMP_L_A | ADDR_AUTO_INC_MASK // accelerometer power mode. ACCEL_POWER_NORMAL = 0x00 // default