LIS3DH polling acceleration data only work with patching Register 10h
Hi community,
I'm using a LIS3DH MEMS on our propriety board with a ST32L476 MCU.
When trying to read x, y, z, channels I get correct data for y and z, but x (Registers 0x28 and 0x29) always return 0x80 0x80.
Sometimes after power up the board, all three channels work as expected!
The behaviour is the same with SPI or I2C interface.
I made a dump of all registers to see the configuration:
SELFTEST OK, all channels are readable.
Reg: 0x7 = 0xFF
Reg: 0x8 = 0x0
Reg: 0x9 = 0x0
Reg: 0xA = 0x0
Reg: 0xB = 0x0
Reg: 0xC = 0x0
Reg: 0xD = 0x0
Reg: 0xE = 0x0
Reg: 0xF = 0x33
Reg: 0x10 = 0x9C
Reg: 0x11 = 0xB
Reg: 0x12 = 0x90
Reg: 0x13 = 0x31
Reg: 0x14 = 0xB1
Reg: 0x15 = 0x33
Reg: 0x16 = 0x1C
Reg: 0x17 = 0x24
Reg: 0x18 = 0x28
Reg: 0x19 = 0x9E
Reg: 0x1A = 0x70
Reg: 0x1B = 0x75
Reg: 0x1C = 0xC0
Reg: 0x1D = 0x0
Reg: 0x1E = 0x10
Reg: 0x1F = 0x0
Reg: 0x20 = 0x27
Reg: 0x21 = 0x0
Reg: 0x22 = 0x0
Reg: 0x23 = 0x0
Reg: 0x24 = 0x0
Reg: 0x25 = 0x0
Reg: 0x26 = 0x0
Reg: 0x27 = 0xFF
Reg: 0x28 = 0x0
Reg: 0x29 = 0x3
Reg: 0x2A = 0x80
Reg: 0x2B = 0xFF
Reg: 0x2C = 0xC0
Reg: 0x2D = 0x3D
Reg: 0x2E = 0x0
Reg: 0x2F = 0x20
Reg: 0x30 = 0x0
Reg: 0x31 = 0x0
Reg: 0x32 = 0x0
Reg: 0x33 = 0x0
Reg: 0x34 = 0x0
Reg: 0x35 = 0x0
Reg: 0x36 = 0x0
Reg: 0x37 = 0x0
Reg: 0x38 = 0x0
Reg: 0x39 = 0x0
Reg: 0x3A = 0x0
Reg: 0x3B = 0x0
Reg: 0x3C = 0x0
Reg: 0x3D = 0x0
Reg: 0x3E = 0x0
Reg: 0x3F = 0x0
SELFTEST FAILED, only y and z are readable,
Reg: 0x7 = 0xFF
Reg: 0x8 = 0x0
Reg: 0x9 = 0x0
Reg: 0xA = 0x0
Reg: 0xB = 0x0
Reg: 0xC = 0x0
Reg: 0xD = 0x0
Reg: 0xE = 0x0
Reg: 0xF = 0x33
Reg: 0x10 = 0x35
Reg: 0x11 = 0xC
Reg: 0x12 = 0x22
Reg: 0x13 = 0x31
Reg: 0x14 = 0xB1
Reg: 0x15 = 0x35
Reg: 0x16 = 0x28
Reg: 0x17 = 0x22
Reg: 0x18 = 0x1B
Reg: 0x19 = 0xAD
Reg: 0x1A = 0x80
Reg: 0x1B = 0x85
Reg: 0x1C = 0xC0
Reg: 0x1D = 0x0
Reg: 0x1E = 0x10
Reg: 0x1F = 0x0
Reg: 0x20 = 0x27
Reg: 0x21 = 0x0
Reg: 0x22 = 0x0
Reg: 0x23 = 0x0
Reg: 0x24 = 0x0
Reg: 0x25 = 0x0
Reg: 0x26 = 0x0
Reg: 0x27 = 0xFF
Reg: 0x28 = 0x80
Reg: 0x29 = 0x80
Reg: 0x2A = 0x80
Reg: 0x2B = 0xF8
Reg: 0x2C = 0xC0
Reg: 0x2D = 0x3D
Reg: 0x2E = 0x0
Reg: 0x2F = 0x20
Reg: 0x30 = 0x0
Reg: 0x31 = 0x0
Reg: 0x32 = 0x0
Reg: 0x33 = 0x0
Reg: 0x34 = 0x0
Reg: 0x35 = 0x0
Reg: 0x36 = 0x0
Reg: 0x37 = 0x0
Reg: 0x38 = 0x0
Reg: 0x39 = 0x0
Reg: 0x3A = 0x0
Reg: 0x3B = 0x0
Reg: 0x3C = 0x0
Reg: 0x3D = 0x0
Reg: 0x3E = 0x0
Reg: 0x3F = 0x0
As you can see, register 0x10, which is reserved, not documented and should not be modified, differs.
But I did and wrote 0x9C in Register 0x10, and by magic everything is fine, all channels are working reliable,
Does anybody has the same experience or can see, what I am doing wrong?
I read my data with the following code:
template<>
bool LIS3DH::raw(int16_t& x, int16_t& y, int16_t& z) const {
/* --Check if new data is available. */
while (!GETBIT(status(), ZYXDA));
bool ret = true;
uint32_t len=7;
uint8_t buffer[7]; // 2 bytes per channel + register
buffer[0]=static_cast<uint8_t>(Register::OUT_X_L);
SETBIT(buffer[0],READBIT); // set read mode!
SETBIT(buffer[0],AUTOINC); // set multiple reads!
ret = read(buffer, len);
if(ret)
{
uint8_t count = 1;
x = buffer[count] + (buffer[count+1] << 8);
count += 2;
y = buffer[count] + (buffer[count+1] << 8);
count += 2;
z = buffer[count] + (buffer[count+1] << 8);
fit(x);
fit(y);
fit(z);
}
return ret;
}Regards
Jürgen
