Wofür ist der UART TX-Interrupt?

8

Ich weiß, dass der RX-Interrupt offensichtlich zum Speichern von Abfragen verwendet wird, aber warum auch der TX-Interrupt?


quelle
3
Gleicher Grund. Sie senden oft eine lange Nachricht an einen Charakter.
Brian Drummond
1
Code, der sonst nur sehr wenig tun muss, kann die eigentliche Übertragung blockieren. Effizienterer Code kann einen Softwarepuffer im Interrupt entleeren. Noch ausgefeilterer Code auf Hardware, die dies unterstützt, kann eine DMA-Engine einrichten, um die Übertragung zu pumpen, ohne die CPU von wichtigerer Arbeit abzulenken, obwohl die seriellen Baudraten in MCU-Begriffen oft recht langsam sind, was möglicherweise nicht immer wichtig ist.
Chris Stratton
3
Wenn Sie nach einem UART TX-Interrupt auf einem bestimmten Gerätetyp fragen, veröffentlichen Sie bitte einen Link zu dessen Datenblatt.
Nick Alexeev
Der Interrupt, den andere erwähnt haben, signalisiert, dass im uart Pufferplatz für mehr Übertragungsdaten verfügbar ist. Der Puffer kann abhängig von der uart-Hardware ein oder mehrere Bytes lang sein. Es gibt oft einen anderen Interrupt "Übertragung abgeschlossen", der signalisiert, dass alle Bits aus dem Uart verschoben wurden. Dies kann für andere Zwecke verwendet werden, beispielsweise zum Umschalten eines Transceivers von Senden auf Empfangen.
Tut

Antworten:

7

Das Hauptziel des TX-Interrupts (eigentlich ein END OF TX) besteht darin, den Inhalt eines Puffers (mehrere Bytes) automatisch zu senden. Bei ordnungsgemäßer Implementierung:

  1. Aktivieren Sie den TX-Interrupt.
  2. Der Benutzercode startet die Übertragung, indem nur das erste Byte im Puffer gesendet wird.
  3. Am Ende von TX (des ersten Bytes) wird ein Interrupt generiert.
  4. In der TX ISR (Interrupt Service Routine) muss der Code das nächste Byte im Puffer senden und den Pufferindex aktualisieren.
  5. Am Ende dieser Übertragung tritt ein neuer Interrupt usw. auf, bis der gesamte Inhalt des Puffers "automatisch" gesendet wird.
  6. Deaktivieren Sie den TX-Interrupt.

Das genaue Verhalten hängt vom Mikrocontroller ab. Das ist eine allgemeine Beschreibung.

Dirceu Rodrigues Jr.
quelle
4
Eine einfache Vereinfachung auf vielen Plattformen besteht darin, dass der Benutzercode lediglich dafür verantwortlich ist, Daten in den Puffer zu legen und den Interrupt zu aktivieren. Der ISR deaktiviert den Interrupt, wenn er ausgelöst wird, wenn der Puffer trocken ist.
Supercat
8

Der TX-Interrupt ist hauptsächlich für längere Datagramme vorgesehen. Sie können die Übertragung für einen Puffer bekannter Länge (Bytecount) initiieren. Jetzt können Sie Ihren Pufferzeiger so oft drücken, wie Bytes gesendet werden müssen, wenn der TX-Interrupt auftritt. Dies stellt die "so schnelle wie möglich" Übertragung Ihres Puffers sicher, ohne dass "TransferComplete" -Flag / Statusbit abgefragt werden muss.

DPF
quelle
2

Einige UARTS haben einen internen Puffer, der größer als eins ist, die 16xxx-Serie für einen.

Das Verfahren hier war

  1. Stellen Sie eine Sendefenstermaske ein, zum Beispiel auf 4 verbleibende.
  2. Füllen Sie die Pufferpositionen, bis der UART angibt, dass die Daten voll sind oder nicht mehr gesendet werden müssen
  3. mach andere Sachen
  4. Wenn nur noch 4 Pufferpositionen nicht gesendet werden, setzen Sie den TX-Interrupt
  5. Warten Sie, bis der Interrupt gewartet wurde
  6. Wenn weitere Daten gesendet werden müssen, fahren Sie mit Schritt 2 fort.

Dies verringert die CPU-Auslastung, indem ein Teil der Verarbeitung auf den UART verlagert wird, wodurch langsamere CPUs andere Aufgaben ausführen und ausführen können, anstatt ständig unterbrochen zu werden.

Surt
quelle
2

Der TX-Interrupt wird ausgelöst, wenn im Sendepuffer Platz vorhanden ist.

Bei Geräten ohne Sendepuffer (dh wenn Sie ein Byte schreiben, das sofort übertragen wird) wird der Interrupt aktiviert, wenn das Senderegister mit dem nächsten Byte geschrieben werden kann.

Bei Geräten mit Puffer wird der Interrupt zu einem implementierungsdefinierten Zeitpunkt aktiviert. Für einige ist es, wenn der Puffer halb leer ist, für einige, wenn die Übertragung des letzten Bytes begonnen hat und der Puffer vollständig leer ist.

Simon Richter
quelle
0

Ein weiterer Anwendungsfall ist, wenn Sie den UART an eine andere Kommunikationsschnittstelle wie RS485 anschließen. Der Controller muss den Bustreiber freigeben, sobald das letzte Bit aus dem TX-Puffer verschoben wurde. Dies ist im TX-Interrupt einfach zu handhaben, aber ohne zu implementieren wäre umständlich, da Sie nach dem Schreiben des letzten Bytes in den Ausgabepuffer eine genaue Zeit warten müssten, die auch mit der Baudrate variieren würde.

Rev1.0
quelle
Die Verwendung von RS485 funktioniert am besten, wenn ein Interrupt für die vollständige Übertragung verfügbar ist und nicht nur der Sendepuffer. Insbesondere auf Geräten mit großen Puffern besteht die einzige Möglichkeit, nach dem Senden des letzten nützlichen Bytes einen Interrupt zu erhalten, darin, dem UART unerwünschte zusätzliche Bytes zuzuführen und zu hoffen, dass die Übertragung deaktiviert werden kann, bevor sie ausgehen.
Supercat
@supercat: Sie haben in der Tat Recht, darauf hinzuweisen, dass dies einen vollständigen Tx- Interrupt erfordern würde . Aber ich denke, das hängt immer noch mit der Frage zusammen.
Rev1.0
Es ist oft möglich, mit nur einem Puffer-verfügbaren Interrupt auszukommen, aber der tx-vollständige Interrupt ist oft besser. Ich hatte gedacht, dass es hilfreich sein könnte, zu erläutern, warum einige UARTs separate Interrupts für die Pufferbereitschaft und die vollständige Übertragung haben.
Supercat