Ich schließe eine MPU-9250 an einen STM8S207-Mikrocontroller an. Der Zugriff auf die MPU-9250 erfolgt über 400kHz I2C. Ich habe keine Probleme damit, Messdaten von Temperatur, Gyro und Beschleunigungsmesser zu erhalten, kann aber die Messergebnisse des eingebauten AK8963-Magnetometers nicht abrufen. Ich kann die AK8963-Geräte-ID korrekt auslesen, sieht so aus, als ob die Fuse-ROM-Kalibrierungswerte korrekt sind, aber wenn ich das Modusregister 0x0A (CNTL1) auf 0x01 oder 0x02 (Einzel- oder 8-Hz-Messungen) programmiere, geht das DRDY-Flag nie auf 1 über , und das CNTL1-Register liest 0x03 zurück, was ein reservierter Wert ist.
Irgendwelche Ideen, was mir fehlt?
Die Initialisierungssequenz, die ich verwende, ist unten, nachdem configure_imu() aufgerufen wurde, wird reg 0x0A vom AK8963 als 0x03 zurückgelesen.
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
}
Vielen Dank für die Kommentare! In der nächsten Version des Boards habe ich die MPU-9250, so weit verbreitet sie auch ist, durch eine Bosch BMO055 ersetzt. Es hilft wenig, wenn Sie sich bereits für MPU9150/9250 einsetzen, aber wenn Board Re-Spin immer noch eine Option für Sie ist, empfehle ich das Bosch-Teil. Es hat die Sensor Fusion-Engine eingebaut, die die Beschleunigungs- / Steuerkurs- / Viertelnionsinformationen direkt außerhalb der Box ohne MCU-Nachbearbeitung generiert - was ich eigentlich brauchte.
Falls Sie immer noch Hilfe benötigen, haben Sie auch jedes Mal versucht, das ST2-Register zu lesen? Es gibt einen Satz in Abschnitt 8.3.5. des Datenblatts "Deshalb, wenn Messdaten gelesen werden, achten Sie darauf, das ST2-Register am Ende zu lesen." Ich hatte auch Probleme mit den kontinuierlichen Modi, also wechselte ich in den getriggerten Modus.
Die beiden Dinge haben meine Datenprobleme mit diesem Chip gelöst.
Viel Glück. Tom
Krunal Desai
maszoka