Estoy conectando un MPU-9250 a un microcontrolador STM8S207. Se accede al MPU-9250 a través de 400kHz I2C. No tengo problemas para obtener los datos de medición de la temperatura, el giroscopio y el acelerómetro, pero no puedo obtener los resultados de las mediciones incorporadas del magnetómetro AK8963. Puedo leer la identificación del dispositivo AK8963 correctamente, parece que los valores de calibración de Fuse-ROM son correctos, pero cuando programo el registro de modo 0x0A (CNTL1) en 0x01 o 0x02 (mediciones individuales o de 8Hz), el indicador DRDY nunca cambia a 1 , y el registro CNTL1 lee 0x03, que es un valor reservado.
¿Alguna idea de lo que me estoy perdiendo?
La secuencia de inicialización que estoy usando está debajo, después de llamar a configure_imu () , el registro 0x0A del AK8963 se lee como 0x03.
void configure_imu()
{
u8 status, mag_mode, mag_sense[3];
i2c_write_byte(MPU_I2CAddress, 27,GYRO_FULL_SCALE_2000_DPS); // Configure gyroscope range
i2c_write_byte(MPU_I2CAddress, 28,ACC_FULL_SCALE_16_G); // Configure accelerometers range
i2c_write_byte(MPU_I2CAddress, 0x37,0x02); // Set bypass mode for external I2C master connection
i2c_write_byte(MPU_I2CAddress, 0x6B,0x01); // Clock source is PLLGYROZ
i2c_write_byte(MPU_I2CAddress, 0x19,0x04); // Set SMPLRT_DIV to 0x04; this gives a 200 Hz sample rate when using the DLPF
i2c_write_byte(MPU_I2CAddress, 0x1A,0x03); // 42 Hz LPF
i2c_write_byte(MPU_I2CAddress, 0x6A,0x01); // Disable master mode and clear all signal paths
//i2c_write_byte(MPU_I2CAddress, 0x37,0x32); // Interrupts pin stays high until cleared, cleared on any read, I2C bypass
//i2c_write_byte(MPU_I2CAddress, 0x38,0x01); // Data ready interrupt enabled
status = i2c_read(MAG_I2CAddress, 0x00, I2C_rx_rd_ptr++, 1);
if (status==0) return;
i2c_write_byte(MAG_I2CAddress, 0x0B,0x01); // Software Reset Magnetometer
Delay(10000);
i2c_write_byte(MAG_I2CAddress, 0x0B,0x00); // Deassert Software Reset Magnetometer
Delay(10000);
do { status = i2c_read(MAG_I2CAddress, 0x0A, &mag_mode, 1); }
while ((status==1) && (mag_mode>0));
i2c_write_byte(MAG_I2CAddress, 0x0A,0x0F); // Enter Fuse-ROM mode
Delay(10000);
i2c_read(MAG_I2CAddress, 0x10, mag_sense, 3); // Read the x-, y-, and z-axis calibration values
i2c_write_byte(MAG_I2CAddress, 0x0A,0x00); // Enter power-down mode
Delay(10000);
i2c_write_byte(MAG_I2CAddress, 0x0A,0x02); // Magnetometer to enter continuous 8Hz measurement mode
}
Gracias a todos por los comentarios! En la siguiente versión de la placa, reemplacé el MPU-9250, por muy extendido que esté, con un Bosch BMO055. Es de poca ayuda si ya está comprometido con MPU9150 / 9250, pero si el giro de la placa sigue siendo una opción para usted, le recomiendo la parte de Bosch. Tiene el motor Sensor Fusion integrado, generando la información de aceleración / rumbo / quarternion fuera de la caja sin ningún procesamiento posterior de MCU, que es realmente lo que necesitaba.