Hallo zusammen,
ich arbeite auf einem ATSAM4S gerade an der Optimierung der bandbreite
und des timings meiner über UART an ein Bluetooth Modul zu übertragenden
daten:
Ich habe zwei Ringbuffer, über die zu sendende und empfangene daten
abgearbeitet werden.
Der Receive-Zweig klappt wunderbar: Über den UART0_Handler mit
aktiviertem RXRDY Interrupt hole ich immer bei Eingang eines Bytes
dieses aus dem Empfangsregister und schiebe es in den
Empfangs-Ringbuffer für die weitere Verarbeitung.
Der Transmit-Zweig macht mir Probleme: Bislang hatte ich an einer Stelle
der main-routine einfach den Transmit-Ringbuffer schritt für schritt
abgearbeitet - also ganz ohne Interrupts.
Jetzt kann ich aber nur mit 115.2kBaud übertragen (und nutze diese
Bandbreite ziemlich aus) - und das Erzeugt bei mir Timing Problemee,
wenn ich jedes mal warten muss, bis die Übertragung beendet ist.
Am besten soll also regelmäßig der Transmit-Ringbuffer überprüft - und
was darin ist stückweise übertragen werden.
Ich wollte das ganze in der selben UART0_Handler Interrupt routine wie
oben abarbeiten, indem ich den TXRDY Interrupt (oder ENDTX) aktiviere
und dann in der routine wenn einer Übertragung beendet wurde nur noch
prüfe ob der Transmit-Ringbuffer leer ist - und wenn nicht ein Element
herausnehme und versende - etc. etc.
Das funktioniert so nun nicht: Obwohl ständig daten in den ringbuffer
geschickt werden, bekomme ich in der Konsole nur kurz daten - und dann
ein stop. Auch, wenn ich am ende der mainroutine jedes mal noch einen
transmit initiiere, um bei zwischenzeitlich leerem ringbuffer (und damit
gestoppter übertragung) wieder neu zu beginnen.
Wie würdet ihr eine interrupt gesteuerte UART-Transmit-Übertragung
lösen, die immer, wenn etwas im Ringbuffer ist, im "hintergrund" daten
sendet, während in der mainroutine eben diese daten erzeugt werden?