MPU9250 kann AK8963 nicht auslesen

Gast #4424362
Lesenswert?
• ▲
▼
Hallo zusammen,
ich ärgere mich nun seit Tagen mit einem MPU-9250 board herum. Ich 
spreche den Baustein mit einem ATMega 328 über I2C an. Das funktioniert 
auch alles wie es soll, aber an die Daten vom Magnetometer (AK8963) 
komme ich nicht dran. Es gibt wohl die möglichkeit den MPU in einen 
Bypass Modus zu setzen und dann soll man den AK direkt adressieren 
können. Wenn ich das in der Init Sequenz mache, das sind unten die 
beiden auskommentierten Codeschnipsel, dann hängt sich der komplette I2C 
Bus weg. Könnte mal bitte irgendwer über meine Init Sequenz schauen, mir 
gehen so langsam die Ideen aus.
Danke schon mal im Vorraus
1
void mpu9520_init  ( void )
2
{
3
  i2c_start    ( );                                                    //
4
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            // 
5
  i2c_data_ack  ( MPU9250_PWR_MGMT_1 );                  // 0x6B
6
  i2c_data_ack  ( 0x00 );                        // 0x00
7
  i2c_stop    ( );                          //
8
  _delay_ms    ( 100 );
9
  
10
  i2c_start    ( );                                                    //
11
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
12
  i2c_data_ack  ( MPU9250_PWR_MGMT_1 );                  // 0x6B
13
  i2c_data_ack  ( MPU9250_CLKSEL_1 );                  // 0x01
14
  i2c_stop    ( );                          //
15
  _delay_ms    ( 200 );
16

17
  i2c_start    ( );                                                    //
18
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
19
  i2c_data_ack  ( MPU9250_CONFIG );                    // 0x1A
20
  i2c_data_ack  ( MPU9250_DLPF_CFG_3 );                  // 0x03
21
  i2c_stop    ( );                          //
22
  
23
  i2c_start    ( );                                                    //
24
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
25
  i2c_data_ack  ( MPU9250_SMPLRT_DIV );                  // 0x19
26
  i2c_data_ack  ( 0x04 );                        // 0x04
27
  i2c_stop    ( );                          //
28
  
29
  i2c_start    ( );                                                    //
30
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
31
  i2c_data_ack  ( MPU9250_GYRO_CONFIG );                // 0x1B
32
  i2c_data_ack  ( MPU9250_FS_SEL_2000DPS );                // 0x18
33
  i2c_stop    ( );                          //
34
  
35
  i2c_start    ( );                                                    //
36
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
37
  i2c_data_ack  ( MPU9250_ACCEL_CONFIG );                // 0x1C
38
  i2c_data_ack  ( MPU9250_ACCEL_FS_SEL_16G );              // 0x18
39
  i2c_stop    ( );                          //
40
  
41
  i2c_start    ( );                                                    //
42
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
43
  i2c_data_ack  ( MPU9250_ACCEL_CONFIG_2 );                // 0x1D
44
  i2c_data_ack  ( MPU9250_ACCEL_A_DLPFCFG_0 );              // 0X00
45
  i2c_stop    ( );                          //
46

47
  i2c_start    ( );                                                    //
48
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
49
  i2c_data_ack  ( MPU9250_USER_CTRL );                  // 0x6A
50
  i2c_data_ack  ( MPU9250_USR_FIFO_EN );                // 0x40
51
  i2c_stop    ( );                          //
52

53

54
/*
55
  i2c_start    ( );                                                    //
56
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            // 
57
  i2c_data_ack  ( MPU9250_INT_PIN_CFG );                // 0x37
58
  i2c_data_ack  ( MPU9250_BYPASS_EN );                  // 0x02 --> 0x22
59
  i2c_stop    ( );
60
  _delay_ms    ( 100 );
61

62
  i2c_start    ( );                                                    //
63
  i2c_adress    ( MPU9250_ADDRESS | I2C_WRITE );            //
64
  i2c_data_ack  ( MPU9250_INT_ENABLE );                  // 0x38
65
  i2c_data_ack  ( MPU9250_RAW_RDY_EN );                  // 0x01
66
  i2c_stop    ( );
67
  */
68
}
#4490833
Lesenswert?
• ▲
▼
Sehe gerade das ist schon ein paar Tage alt. Aber vielleicht noch 
aktuell. Also ich habe nur kurz drübergeschaut ...

Wenn pass through mode ein ist kannst du nur noch mit dem Kompass (den 
slaves) kommunizieren. Deswegen ist es nicht gut das in der Init 
dauerhaft ein zuschalten.

Der pass through mode ist auch nur dazu gedacht die Slaves zu 
konfigurieren. Eigentlich braucht man nur die calibration values vom AK 
auslesen und dann den pass through mode wieder aus.
Gast #4491938
Lesenswert?
• ▲
▼
Carsten M. schrieb:
> Wenn pass through mode ein ist kannst du nur noch mit dem Kompass (den
> slaves) kommunizieren. Deswegen ist es nicht gut das in der Init
> dauerhaft ein zuschalten.

Das ist falsch. Die MPU und der AK haben unterschiedliche I2C Adressen 
und sind somit individuell ansteuerbar. Es spricht technisch nichts 
gegen eine direkte Kommunikation mit MPU und AK ohne ständiges 
umschalten des passthrough modus.
#4492032
Lesenswert?
• ▲
▼
@Lukas
Ja sorry. Mein Fehler.
Man kann den AK auch als einen externen Sensor behandeln.
Oder man kann die MPU so konfigurieren, dass sie den AK mit ausliest und 
die Daten in den eigenen Registern bereitstellt.

@Hubi
Also an der Init ist nichts verdächtig. Ich würde vermuten das Problem 
liegt woanders.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.