Ayer estuve intentando toda la tarde para obtener algunos datos de mi LSM303DLHC usando una placa Nucleo STM32L152.
Finalmente conseguí todas las cosas de I2C, logré establecer algunos registros, verificar su contenido, etc., así que dirigí mi atención a los datos que están saliendo.
No importa lo que haga, parece que los datos están atascados en los mismos valores. Cuando enciendo y apaga el sensor, recibo cambios en los valores del magnetómetro, pero luego permanecen igual hasta que lo enciendo nuevamente. Las salidas de los 3 ejes del acelerómetro son siempre cero.
He leído el registro de 'actualización de bloque' y confirmé el IC configurado para hacer actualizaciones continuas.
He verificado en un ámbito que lo que estoy recibiendo es correcto para el protocolo.
Estoy usando esta tabla de ruptura: enlace
¿Alguna idea de alguien? ¿Qué estoy haciendo mal aquí?
#include "mbed.h"
#define ACC_ADDR 0x32
#define MAG_ADDR 0x3C
// ACC registers //
#define CTRL_REG1_A 0x20
#define ACC_X_L 0x28
#define ACC_X_H 0x29
#define ACC_Z_L 0x2C
#define ACC_Z_H 0x2D
// MAG registers //
#define CRA_REG_M 0x00
#define MAG_X_H 0x03
#define MAG_X_L 0x04
#define MAG_TEMP_H 0x31
#define MAG_TEMP_L 0x32
//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
//------------------------------------
Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut led(LED1);
InterruptIn btn(USER_BUTTON);
I2C i2c(PB_9, PB_8);
int main()
{
char data_write[2];
char data_read[6] = {0,0};
/* Turn on temp sensor */
data_write[0] = CRA_REG_M ;
data_write[1] = 0x90;
int status = i2c.write(MAG_ADDR, data_write, 2, 0);
if (status != 0) { // Error
while (1) {
led = !led;
wait(0.2);
}
}
int i = 0;
int bytes = 6;
int j;
while (1) {
// Read acceleromter data registers
data_write[0] = ACC_X_L;
i2c.write(ACC_ADDR, data_write, 1, 1); // no stop
i2c.read(ACC_ADDR, data_read, bytes, 0);
printf("\f");
// Display result
for(j=0;j<bytes;j++){
printf("d: %x\n", data_read[j]);
}
printf("---- (%d)", i++);
led = 1;
wait(0.1);
}
}