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