STM32F103 + I2C + MPU6050 - DMA

Gast #3932264
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/)
Angehängte Dateien:
Gast #3932586
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.

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