Forum: Mikrocontroller und Digitale Elektronik STM32F103 + I2C + MPU6050 - DMA


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

habe folgendes Problem:
Ich will den MPU6050 über DMA auslesen, der Controller hängt nach dem 
zweiten DMA-Durchlauf (sprint aus der externen [EXTI0] Interruptroutine 
hinein) beim Ausdruck:
/* While the bus is busy */
while(I2C_GetFlagStatus(MPU6050_I2C, I2C_FLAG_BUSY));

Jetzt habe ich bereits gesehen, dass es ähnliche Probleme damit gab, 
deren Lösungen unterschiedlich waren.
Allerdings funktioniert das Auslesen ohne dem DMA-Block über 
MPU6050_I2C_BufferRead(...) gut.

Der einzige Unterschied, der mir aufgefallen ist, ist, dass beim 
einfachen Auslesen des letzten Bytes das Acknowledge vorher deaktiviert 
wird und eine Stop-Condition gesendet wird:
    if (NumByteToRead == 1)
    {
      /* Disable Acknowledgement */
      I2C_AcknowledgeConfig(MPU6050_I2C, DISABLE);
      /* Send STOP Condition */
      I2C_GenerateSTOP(MPU6050_I2C, ENABLE);
    }

Fällt jemanden etwas dazu ein?
Gibt es eine einfache Problemlösung?
(main-File im Anhang; DMA-Auslesen angelehnt an:
http://letanphuc.net/2014/06/stm32-mpu6050-dma-i2c/)

von Daniel (Gast)


Lesenswert?

Dieses Problem ist ein interessant ärgerliches.

Wenn ich MPU6050_GetRawAccelGyro() in der EXTI-ISR aufrufe, funktioniert 
es.
Wenn ich die DMA-Routine durchlaufen lasse (also Initialisierung und auf 
DMA-Ende-Interrupt warten), geht das einmal gut, danach ist Schluss.

Ich habe auch schon versucht, das letzte Byte ohne DMA auszulesen (also 
nur 13 statt 14 Bytes über DMA), damit ich das so wie im 
MPU6050_I2C_BufferRead() für das letzte Byte im 
DMA1_Channel5_IRQHandler() implementiere - das bringt aber auch nichts.

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.