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