Forum: Mikrocontroller und Digitale Elektronik MSP430F2618: DMA bei UART-Empfang


von Marvin Köhler (Gast)


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

von Marvin Köhler (Gast)


Lesenswert?

Hallo!?

Kann mir keiner Helfen? :(

Gruß
Marvin

von gzdt (Gast)


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.

von Marvin Köhler (Gast)


Lesenswert?

Hallo!

Es ist ja nicht so, dass ich das Datenblatt nicht vorliegen habe.
Das Problem sitzt ja zwischen Tastatur und Stuhllehne ...

Gruß
Marvin

von gzdt (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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"?

von Marvin Köhler (Gast)


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

von Marvin Köhler (Gast)


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.

von Christian R. (supachris)


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.

von gzdt (Gast)


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.

von gzdt (Gast)


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

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
Noch kein Account? Hier anmelden.