www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Marvin Köhler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Marvin Köhler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo!?

Kann mir keiner Helfen? :(

Gruß
Marvin

Autor: gzdt (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Marvin Köhler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo!

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

Gruß
Marvin

Autor: gzdt (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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"?

Autor: Marvin Köhler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Marvin Köhler (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: gzdt (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: gzdt (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net