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 ?