Forum: Mikrocontroller und Digitale Elektronik sam3x Usart PDC Transfer Ende festellen ?


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.
von Marco H. (damarco)


Bewertung
0 lesenswert
nicht lesenswert
Ich stehe so ziemlich auf den Schlauch da der SAM3x wohl keine 
Möglichkeit hat das ende des DMA Transfers der Usart festzustellen.

Hintergrund in der ISR Routine läuft eine Statemaschine die einen 
Datenpacket zusammen bastelt. Nach dem auftreten der ISR springt sie 
einen schritt weiter. Genau genommen DMX->RDM_TX -> RDM_RX request-> 
usw.  Die Übertragung ist etwas luftig also mal hängt RDM dran oder auch 
nicht dann komm in 176µS das nächste DMX packet.

Das Problem:

Die ISR sollte nur beim Ende des DMA Tx Transfers aufgerufen werden. Die 
Bits im Register US_CSR bieten die Möglichkeit offenbar nicht. Das Dumme 
ist die ISR immer wieder aufgerufen wird weil sich einige diese Bits 
US_IMR_TXEMPTY etc. nicht mit US_CR_RSTSTA zurücksetzen lassen. Das 
US_IMR_TXEMPTY  tritt also bei jeden byte auf :( Was den DMA Transfer so 
ziemlich Hirnlos macht. Ich finde kein Register was mir das Ende des DMA 
Transfers anzeigt. Bei PWM Modul ist solch ein Mechanismus vorhanden.

Das einlesen per DMA funktioniert übrigens mit dem Trick das man das 
Ende über den Timeoutcounter erkennt und den Transfer stopt.

Der letzte Notnagel wäre einen Timer aufziehen, das CC Value wird aus 
der Paketlänge berechnet und somit die Statemaschine über den Timer zu 
steuern.

Was ewt. die Lauffähigkeiten auf andere Hardware verbessert. Jemand noch 
eine Idee ?

: Bearbeitet durch User
von Marco H. (damarco)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Alles hat auch seine Ursachen ;) Hier lag es schlicht daran das es auch 
beim PDC Prioritäten gibt und die eine USART war höher gewichtet als die 
andere.

Die Signale US_CSR_ENDRX u. US_CSR_ENDTX sind bei der entsprechenden 
Peripherie vorhanden.  Die ISR wurde dauernd ausgelöst da die bais vom 
RS485 etwas zu weit daneben war. Genau genommen war der Widerstand auf 
dem Testaufbau nicht da wo er hin gehörte ;). Ich konnte mit dem logic 
analyzer dort nicht ansetzen da der IKA Logic bei Spikes immer 
abstützte. Tolles Gerät wenn man es braucht funktioniert es nicht :( Ich 
könnte es gegen die Wand schmeißen...

Für alle die das nicht wissen, der Bus muss vorgespannt werden da dieser 
in der Luft hängt wenn kein Teilnehmer sendet. Der RX schwingt sich dann 
auf und löste hier dauernd die ISR aus.

Trotzdem wird die Statemaschine jetzt vom Timer gesteuert. Nur beim RX 
der Antwort wird der Timeout benutzt im das Frame Ende zu erkennen.

Anbei ein Discovery mit Antwort :) Auf dem Arduino Due läuft noch eine 
Artnetnode mit 2048 Channel die über ws2812 ausgegeben werden und ein 
RDM Device auf der anderen Usart. Mit etwas Planung gibt es keine 
Timingprobleme.

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]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.