Forum: Mikrocontroller und Digitale Elektronik MPU9250 kann AK8963 nicht auslesen


von Hubschraubär (Gast)


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
}

von Carsten M. (ccp1con)


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.

von Lks (Gast)


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.

von Carsten M. (ccp1con)


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.

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.