Forum: Mikrocontroller und Digitale Elektronik STM32 + MPU9250 I2C sequential read


von Alex X. (behindi)


Angehängte Dateien:

Lesenswert?

Hallo liebe Community,

ich verzweifle gerade daran eine I2C Kummunikation zwischen einem 
STM32f3discovery board und einem externen MPU-9250 zum laufen zu 
bringen.
1 und 2 Byte lesen/schreiben funktioniert einwandfrei, wenn ich mehr als 
2 Byte schreibe/lese bekomme ich jedoch ein HAL_TIMEOUT. Wenn ich mir 
den Signalverlauf auf dem Ozsi anschaue bleibt nach dem dritten byte + 
dem ACK die Tacktleitung auf LOW. (Siehe Anhang [Cursors markieren die 
ACKs])

Im Datenblatt des IMUs steht, dass sequential read unterstützt wird 
(S.34) ... Was mache ich falsch oder wo liegt der Denkfehler?

Die Peripherals wurden mit dem STM32CubeMX konfiguriert.
1
  uint8_t rxBuffer[16] = {58,46};
2
  // Write PWR1
3
  while (HAL_I2C_Mem_Write(hi2c, (uint16_t) IMU_I2C_SLAVE_ADDR_GYRO_ACCEL,
4
        (uint16_t) IMU_GYRO_ACCEL_PWR1_ADDR, (uint16_t) 3,
5
        (uint8_t*) rxBuffer, (uint16_t) 3, 3000) != HAL_OK) {
6
      if (HAL_I2C_GetError(hi2c) != HAL_I2C_ERROR_AF) {
7
        Error_Handler();
8
      }
9
  }
10
  rxBuffer[0] = 0x00;
11
  rxBuffer[1] = 0x00;
12
  rxBuffer[2] = 0x00;
13
  // Read PWR1
14
  while (HAL_I2C_Mem_Read(hi2c, (uint16_t) IMU_I2C_SLAVE_ADDR_GYRO_ACCEL,
15
        (uint16_t) IMU_GYRO_ACCEL_PWR1_ADDR, (uint16_t) 3,
16
        (uint8_t*) rxBuffer, (uint16_t) 3, 3000) != HAL_OK) {
17
      if (HAL_I2C_GetError(hi2c) != HAL_I2C_ERROR_AF) {
18
        Error_Handler();
19
      }
20
  }
21
22
23
//////////////////////////////////////////////
24
25
#define IMU_I2C_SLAVE_ADDR_GYRO_ACCEL   (0x68 << 1)  // 0x68 AD0 is LOW
26
#define IMU_I2C_SLAVE_ADDR_MAGN         (0x0c << 1)
27
#define IMU_CMD_LEN                     1
28
29
#define IMU_GYRO_ACCEL_DEVICE_ID_ADDR   0x75
30
#define IMU_GYRO_ACCEL_DEVICE_ID_LEN    1
31
#define IMU_GYRO_ACCEL_DEVICE_ID        0x71  // 0x68
32
33
#define IMU_MAGN_DEVICE_ID_ADDR         0x00
34
#define IMU_MAGN_DEVICE_ID_LEN          1
35
#define IMU_MAGN_DEVICE_ID              0x48
36
37
#define IMU_GYRO_ACCEL_PWR1_ADDR        0x6b
38
#define IMU_GYRO_ACCEL_PWR1_LEN         1

Und dann hätte ich noch eine zweite Frage.
der MPU-9250 hat ja zwei chips unter der Haube. Im Datatenblatt S.23 ist 
die rede von einem Pass-Trough Mode, bei dem der zweite Sensor direckt 
über I2C angesprochen werden kann (Slave address 0x0c). Auf diese 
Adresse bekomme ich jedoch keine Antwort. Meine Frage lautet daher, muss 
ich diesen Mode zuerst im "ersten Sensor" konfigurieren (habe dazu dem 
"register description" datasheet keine Informationen entnehmen könnnen)?

Vielen Dank für jegliche Hilfe  :-)


Datenblatt:
http://www.invensense.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf

Register description:
http://www.invensense.com/wp-content/uploads/2017/11/RM-MPU-9250A-00-v1.6.pdf

von Bild Versaageer (Gast)


Lesenswert?

Alex X. schrieb:
> Vielen Dank für jegliche Hilfe  :-)

Dein Oszilloskop hat sicher eine Hardcopy-Funktion um Bilder
(Screenshots) direkt in den Rechner laden zu können.

Schnittstelle kaputt? Funktion nicht gefunden? Taste Kaputt?

von Alex X. (behindi)


Lesenswert?

Kein USB-Stick zur Hand ;)

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.