Zugriff auf Magnetometerergebnisse in MPU-9250

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.

Müssen Sie den Pass-Through-Modus einrichten? „Der Pass-Through-Modus wird auch verwendet, um direkt vom Host auf das AK8963-Magnetometer zuzugreifen. In dieser Konfiguration ist die Slave-Adresse für das AK8963 0X0C oder 12 Dezimalstellen.“
DankeKrunal für deinen Kommentar. Der Pass-Through-Modus ist eingerichtet, und ich kann das WHOAMI-HW-ID-Register des AK8963 korrekt lesen. Ich kann auch die Werkskalibrierungswerte aus dem Fuse-ROM lesen und nach dem Zurücksetzen den korrekten MODE-Wert (0x00) aus (0x0A) lesen. Sobald ich jedoch 0x01 oder 0x02 schreibe, um 0x0A zu adressieren, und das Magnetometer anweise, eine Messprobe bereitzustellen, werden die Daten nie bereit, und 0x0A wird als 0x03 zurückgelesen.

Antworten (1)

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