Hallo Forum, hat jemand von Euch schon Erfahrungen beim Einsatz des DMA Controllers in Verbindung mit UART0 gemacht? Bekomme das irgendwie nicht gebacken bzw. ist mir unklar wieso das so funktioniert. Wenn ich den DMA auf die UART0 scharf mache passiert nix weil die UART0 keinen Interrupt für den DMA auslöst obwohl der Transmit Buffer leer ist. Erst wenn ich von Hand 1 Byte in den Transmit Buffer der UART schreibe und das versendet wurde dann kommt der Interrupt. Gibt es da einen Trick, mache ich was falsch? Das kann doch nicht sein dass ich das von Hand starten muss oder?
Hi, ich habe mich jetzt nicht speziell mit dem DMA beschäftigt... aber interrupts werden im Normalfall nicht auf Zustände sondern auf Ereignisse erzeugt... in deinem Fall auf eine Falle Flanke des Statusbits von Transmitbuffer Empty. Gruß Ansgar
Hallo, ich habe es zwischenzeitlich gelöst. Also im DMA Modus kann man sich ja darüber streiten, aber letztendlich muss ja auf den Zustand Sendebuffer leer ein Interrupt für den DMA ausgeelöst werden. Klar im Normalen Betrieb kann man das auch auf ein Ereignis machen, nämlich genau dann wenn der Buffer gesendet wurde. Das hat ja wie gesagt auch funktioniert. Nur was mache ich um das ganze überhaupt ans laufen zu bekommen ? Der Buffer ist ja leer wenn ich den DMA scharf mache? Das ging bei mir bisher nur indem ich von Hand doch nochmals Daten in den Buffer geschrieben habe um das Senden ausgelöst habe. Nur dann hatte ich immer schon 8 Bit auf der Empfangseite im DMA Buffer und somit in den einzelnen Worten immer 1 Byte versatz. Problem war ich hatte ein altes Datenblatt zum M16C und habe die Register genau in der Reihenfolge beschrieben wie die dort erklärt wurden. In einer überarbeiteten Version steht aber ein Hinweis auf das Schreiben der Register in einer anderen Reihenfolge, wenn man das macht dann funktioniert das mit dem Interrupt wenn man den DMA aktiviert auch.
Ich hatte mal mit dem DMA den DAC gespeist. Das ging völlig im Hintergrund, nur wenn 8 kB übertragen waren, löste ich einen Interrupt aus, der den Zeiger neu setzte und den DMA wieder startete. Vermutlich geht das bei UART ebenfalls. Löst Du bei jedem Byte oder bei jedem Paket einen Interrupt aus?
Ich löse den Interrupt ja nicht von Hand aus, sondern die Uart Schnittstelle löst den Interrupt aus wenn der Sendebuffer leer sprich versendet wurde, dadurch schreibt dann der DMA das nächste Byte in den Sendebuffer
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.