STM32 + MPU9250 I2C sequential read

OP #5299197
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren