MSP430F2618: DMA bei UART-Empfang

Gast #2766195
Lesenswert?

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
Gast #2766936
Lesenswert?

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.
Gast #2767165
Lesenswert?

>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?
Gast #2767258
Lesenswert?

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...
Gast #2767261
Lesenswert?

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.
#2767332
Lesenswert?

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.
Gast #2767403
Lesenswert?

>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.
Gast #2767435
Lesenswert?

>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...

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