Hallo! Ich habe Probleme die DMA des MSP430F2618 zu verstehen. Die DMA soll die vom UART A1 einkommenden Daten "verarbeiten". Somit ist der "DMA Addressing Mode" "Fixed Address To Block Of Addresses". Also muss ich erstmal ein Array mit der Pufferlänge anlegen. Deren Start-Adresse und Größe gebe ich der DMA an. Ebenso die Triggeroptionen. Aber was ist der richtige Transfer Mode? "Single"? Und dann? Woher weiß ich wieviel Bytes empfangen wurden? Und was passiert, wenn während ich die Daten verarbeite neue Daten empfangen werden? Fängt dann die DMA wieder bei 0 an, oder setzt die da fort wo sie aufgehört hat? Kann mir hier jemand helfen? Danke. Gruß Marvin
Die Datenblätter von TI sind nicht so schlecht, dass sich nicht auf diese Fragen eine Antwort dort finden liesse. Vorschlag: Du fügst die Antworten auf Deine Fragen jeweils nach dem Fragezeichen ein, mit Hilfe z.B. des MSP430x2xx Family User's Guide, bzw. des für Deinen Chip relevanten Family Users Guide. Sollten dann weiter Unklarheiten bestehen, helfen wir gerne weiter.
Hallo! Es ist ja nicht so, dass ich das Datenblatt nicht vorliegen habe. Das Problem sitzt ja zwischen Tastatur und Stuhllehne ... Gruß Marvin
>Es ist ja nicht so, dass ich das Datenblatt nicht vorliegen habe.
Dann auch bitte lesen!
Paste:
Sollten dann weiter Unklarheiten bestehen, helfen wir gerne weiter.
Wieso sollten wir Dir das DB vorlesen?
Und die Codebeispiele von TI hast Du Dir auch angesehen? Und neben dem Datenblatt (in dem nicht sehr viel drinsteht) auch den "Family User's Guide"?
Also mein Ziel ist es, dass die DMA alles entgegen nimmt, was via UART reinkommt und in einen eigenen Puffer schreibt. Zyklisch soll dann der Puffer ausgewertet werden. D.H. unabhängig von der DMA werden Bytes aus dem Puffer ausgelesen. Die Auswertung erfolgt byteweise nach dem FiFo. Eigentlich müsste ich die Destinationaddresse dekrementieren und das Sizeregister inkrementieren und dabei das Byte auslesen. Das geht ja aber nicht, weil ich ja das erste Byte im Puffer auslese während an n-ter Stelle geschrieben wird. Was wiederrum bedeutet, dass ich alle Bytes des Puffer in einem Rutsch auswerten müsste, dafür aber die DMA anhalten muss, wodurch mir evtl. empfangene Bytes verloren gehen... Wenn der Interrupt anschlägt, wenn das Size-Register 0 ist, ist es quasi zu spät...
Rufus Τ. Firefly schrieb: > Und die Codebeispiele von TI hast Du Dir auch angesehen? Und neben dem > Datenblatt (in dem nicht sehr viel drinsteht) auch den "Family User's > Guide"? Zweimal ja. Hab sogar die Seiten 309-313 des Family User Guides mit den Registern ausgedruckt vor mir liegen. Und unter den Code-Beispielen habe ich kein Beispiel gefunden, was meinem Vorhaben entspricht.
Was du brauchst ist ein Ringpuffer. Ich glaube mit dem DMA kannst du nicht viel anfangen in dem Fall. Der DMA ist auch nicht so zu verstehen, dass du da nebenbei was machen kannst. Wenn der DMA aktiv ist, ist der Adressbus blockiert und die CPU wird angehalten. Lies dir mal im User Guide das Kapitel zum DMA durch. Einfach im Interrupt die Zeichen empfangen und in einen Ringpuffer schreiben sollte vollauf genügen.
>Wenn der DMA aktiv ist, ist der >Adressbus blockiert und die CPU wird angehalten. Das stimmt so nicht ganz. Im Family Guide ist ein Modus erwaehnt, der der CPU einen Teil der Bandbreite uebrig laesst. Ausserdem kann die CPU bei der Geschwindigkeit mit der an der UART die Daten reintroepfeln, noch jede Menge erledigen. Bus wird ja nur fuer den Moment des Transfers von UART (in diesem Fall) nach Mem blockiert.
>Die Auswertung erfolgt byteweise nach dem FiFo. Eigentlich müsste ich >die Destinationaddresse dekrementieren und das Sizeregister >inkrementieren und dabei das Byte auslesen. Nein, das laesst Du in Ruhe, wenn die DMA scharf gemacht ist. Du kannst zwei Puffer verwenden, einen in den von der DMA geschrieben wird, und den anderen, den Du waehrenddessen ausliest. Wenn der eine Puffer (der in den die DMA schreibt) voll ist, und der andere (aus dem Du liest) leer, werden die beiden Puffer getauscht. Den kurzen Moment, in dem Du die DMA auf den anderen Puffer setzt, verkraftet jede UART-Uebertragung. Bei vielen Controllern (weiss nicht, ob das bei Deinem zutrifft) ist im UART ein FIFO drin, und der DMA-Controller hat selbst auch nochmal einen internen Puffer. >Wenn der Interrupt anschlägt, wenn das Size-Register 0 ist, ist es quasi >zu spät... Nur dann, wenn Du troedelst...
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.