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/)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.