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


von Marco H. (damarco)


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:

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.

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.