Forum: Mikrocontroller und Digitale Elektronik MPU9250 SPI Magnetometer


von Hamster (Gast)


Lesenswert?

Hallo,
ich kann meine IMU (MPU9250) fabelhaft mit SPI initialisieren und 
auslesen , aber es gelingt mir nicht, daten vom Magnetometer dieses 
Teils zu bekommen. (ATMEGA 328, AVR-Studio, C) Problem ist 
wahrscheinlich die Initialisierung des Magnetometers, möglicherweise 
geht das doch nur über I2C im bypass-mode.
Deshalb die frage, hat das schon mal jemend mit SPI geschafft?

Ich kann das Who i am register des magnetometers auslesen, aber 
anscheinend nix in ein register reinschreiben obwohl es dazu bei MPU9250 
das register 99 gibt.

Ich versuche also, die Register des Magnetometers so zu initialisieren:
(Der erste Wert ist das register des MPU9250, der zweite der wert der 
geschrieben werden soll; ohne {39, 0x81} klappt es auch nicht).



{36, 14},              // set I2C slave 0 to < 400 KHz
{37, MAG_ADR | WRITE_REG}, // address of magnetometer into I2C-Slave
                            // -0-Control register, write
{38, MAG_REG_CNTL2},     // start writing into this register
{39, 0x81},                // send this byte
{99, 1},                   // write value 1 into CNTL2: Reset 
magnetometer
{39, 0x81},                // send this byte




{37, MAG_ADR | WRITE_REG}, // address of magnetometer into I2C-Slave
                            //-0-Control register, write
{38, MAG_REG_CNTL1},     // start writing into this register
{39, 0x81},                // send this byte
{99, 0x16},                // write value 6 in CNTL1Cont meas mode 2;
                           //  16 bit
{39, 0x81},                // send this byte




{37, MAG_ADR & READ_REG},  // address of magnetometer into I2C-Slave
                           // -0-Control register, read
{38, MAG_REG_STATUS1},     // start reading from this register;
                           // MAG_REG_STATUS1 = 1 byte before data
{39, 0x98},                // I2C_SLV0_EN=1  I2C_SLV0_REG_DIS=1
                           //   I2C_SLV0_LENG =8


Danke für Hilfe!

von Eddie (Gast)


Lesenswert?

Hallo Hamster,

hast für das Problem bereits eine Lösung gefunden?

MfG Eddie

von sehrAlterHamster (Gast)


Lesenswert?

Eddie schrieb:
> hast für das Problem bereits eine Lösung gefunden?

Seit über drei Jahren arbeite ich daran und schaue auch ständig hier im 
Forum nach, ob mir jemand doch noch den finalen Tip geben kann.

Sorry, leider geht meine Lebenszeit dem Ende zu und ich werde es wohl 
nicht mehr schaffen :-(

von Haha (Gast)


Lesenswert?

Hamster schrieb:
> fabelhaft

von Sven G. (captainalbern)


Lesenswert?

Ich hätte eine ähnliche Frage. Ich möchte den Sensor über I²C auslesen. 
Laut Datenblatt besteht der Sensor aus 2 Teilen, einen für Acc und Gyro 
und einen für Mag. Beide Teile haben eine eigene Register-Map die 
jeweils bei Adresse 0 beginnt. Jetzt frage ich mich, wie man beide Teile 
getrennt anspricht. Von zwei verschiedenen Geräteadressen habe ich 
nichts im Datenblatt gefunden. Auch eine Adressuche am I²C-Bus zeigt mir 
nur ein Gerät an. Wird der Mag-Teil vom Acc/Gyro-Teil etwa wie ein 
extern angeschlossener Sensor behandelt ? Das Handling/Durchschleifen 
von extern angeschlossenen Sensoren scheint mir doch etwas umständlich 
zu sein.

von void (Gast)


Lesenswert?

Sven G. schrieb:
> Von zwei verschiedenen Geräteadressen habe ich
> nichts im Datenblatt gefunden. Auch eine Adressuche am I²C-Bus zeigt mir
> nur ein Gerät an.

Sven schau dir mal im Datenblatt die Kapitel
4.4 Block Diagram, 4.11 Auxiliary I2C Serial Interface und 7.2 I2C 
Interface an.
https://www.invensense.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf

Insbesondere den Unterschied zwischen "I2C  Master  Mode" und 
"Pass-Through mode".
Die Kurzfassung:
Im I2C Master Mode kann nur der MPU-9250 (Accel+Gyro) direkt auf den 
eingebauten Magnetometer die(AK8963) zugreifen, aber nicht der Host-µC.
Dagegen sind nur im Pass-Through mode beide Teile vom Host-µC unter zwei 
verschiedenen I2C Adressen erreichbar.

Zitat:
"Pass-Through mode (...) In this mode,the system processor can still 
access MPU-9250data through the I2C interface. Pass-Through mode is also 
used to access the AK8963 magnetometer directly from the host. In this 
configuration the slave address for the AK8963 is 0X0C or 12 decimal."

"The  slave  address  of  the MPU-9250 is  b110100X (0x68 / 0x69)  which 
is  7  bits  long.  The  LSB  bit  of  the  7  bit  address  is 
determined by the logic level on pin AD0."

von Sven G. (captainalbern)


Lesenswert?

Vielen Dank. Es funktioniert.

Falls andere Fragende auf diesen Thread stoßen:

Ich fülle folgende Register des MPU9250 mit Werten:
INT_PIN_CFG=0x22
INT_ENABLE=0x01

Dann ist der Pass-Through-Mode aktiviert und man kann den Mag-Teil unter 
der eigenen I2C-Adress 0x0C erreichen.

Der Mag-Teil heißt übrigens AK8963 und man bekommt von dessen Hersteller 
ein eigenes Datenblatt.

Im Mag-Teil muss man erst im Control-Register den Messmodus aktivieren 
und kann dann die Messdaten lesen. Obwohl ich einen "continuous" read 
mode verwende, muss ich nach jedem Auslesen der Daten den Modus neu 
setzen, damit die Daten aktualisiert werden. Da bin ich noch am 
Forschen, woran das liegt ....

von void (Gast)


Lesenswert?

Sven G. schrieb:
> Vielen Dank. Es funktioniert.

Super, freut mich. Danke für dir Erfolgsmeldung!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.