Articles

Back to Basics: Der Universal Asynchronous Receiver/Transmitter (UART)

Dieser technische Artikel erklärt einige Low-Level-Details der weit verbreiteten – man könnte sogar sagen allgegenwärtigen – UART-Kommunikationsschnittstelle.

Zugehörige Informationen

  • Komfortable, robuste Datenübertragung mit RS-422 und RS-485

Es gibt wahrscheinlich nur wenige Elektroingenieure und Elektronik-Enthusiasten auf der Welt, die noch nicht in irgendeiner Weise mit einer universellen asynchronen Empfänger/Sender-Schnittstelle (UART) zu tun hatten. In einer Welt, in der Technologie sehr schnell veralten kann, müssen wir demjenigen Anerkennung zollen, der dieses einfache digitale Kommunikationsschema geschaffen hat, das seit Jahrzehnten existiert und sich immer noch großer Beliebtheit erfreut.

Anmerkung: Der Begriff „UART“ ist ziemlich vage. Verschiedene Aspekte der Schnittstelle – Anzahl der Datenbits, Anzahl der Stoppbits, Logikpegel, Parität – können an die Bedürfnisse des Systems angepasst werden. In diesem Artikel konzentriere ich mich auf UART-Implementierungen, die häufig in modernen Mikrocontroller-Anwendungen zu finden sind.

Fähigkeiten und Eigenschaften

Wie Sie wahrscheinlich wissen, bietet ein grundlegendes UART-System eine robuste, mittelschnelle Vollduplex-Kommunikation mit nur drei Signalen: Tx (gesendete serielle Daten), Rx (empfangene serielle Daten) und Masse. Im Gegensatz zu anderen Protokollen wie SPI und I2C ist kein Taktsignal erforderlich, da der Benutzer der UART-Hardware die notwendigen Timing-Informationen gibt.

Eigentlich gibt es ein Taktsignal, aber es wird nicht von einem kommunizierenden Gerät zum anderen übertragen; vielmehr haben sowohl Empfänger als auch Sender interne Taktsignale, die bestimmen, wie die wechselnden logischen Pegel erzeugt (auf der Tx-Seite) und interpretiert (auf der Rx-Seite) werden. Es überrascht nicht, dass die UART-Kommunikation nicht funktioniert, wenn Sender und Empfänger für unterschiedliche Datenübertragungsfrequenzen konfiguriert wurden. Außerdem müssen die internen Taktsignale 1) hinreichend genau in Bezug auf die erwartete Frequenz und 2) hinreichend stabil über Zeit und Temperatur sein.

Schlüsselbegriffe

Lassen Sie uns einige Begriffe wiederholen und dabei weitere UART-Eigenschaften abdecken:

  • Startbit: Das erste Bit einer Ein-Byte-UART-Übertragung. Es zeigt an, dass die Datenleitung ihren Leerlaufzustand verlässt. Der Ruhezustand ist typischerweise logisch hoch, daher ist das Startbit logisch niedrig.
    • Das Startbit ist ein Overhead-Bit; das bedeutet, dass es die Kommunikation zwischen Empfänger und Sender erleichtert, aber keine sinnvollen Daten überträgt.
  • Stopbit: Das letzte Bit einer Ein-Byte-UART-Übertragung. Sein logischer Pegel ist derselbe wie der Ruhezustand des Signals, also logisch hoch. Dies ist ein weiteres Overhead-Bit.

  • Baudrate: Die ungefähre Rate (in Bits pro Sekunde, oder bps), mit der Daten übertragen werden können. Eine genauere Definition ist die Frequenz (in bps), die der Zeit (in Sekunden) entspricht, die benötigt wird, um ein Bit digitaler Daten zu übertragen. Bei einem 9600-Baud-System benötigt ein Bit z. B. 1/(9600 bps) ≈ 104,2 µs. Das System kann nicht tatsächlich 9600 Bits an sinnvollen Daten pro Sekunde übertragen, da zusätzliche Zeit für die Overhead-Bits und eventuell für Verzögerungen zwischen den Ein-Byte-Übertragungen benötigt wird.

  • Paritätsbit: Ein Bit zur Fehlererkennung, das am Ende des Bytes hinzugefügt wird. Es gibt zwei Arten – „ungerade Parität“ bedeutet, dass das Paritätsbit logisch hoch ist, wenn das Datenbyte eine gerade Anzahl von logisch hohen Bits enthält, und „gerade Parität“ bedeutet, dass das Paritätsbit logisch hoch ist, wenn das Datenbyte eine ungerade Anzahl von logisch hohen Bits enthält. Dies mag kontraintuitiv erscheinen, aber die Idee ist, dass das Paritätsbit sicherstellt, dass die Anzahl der logisch hohen Bits immer gerade (für gerade Parität) oder ungerade (für ungerade Parität) ist. Wenn Sie also eine gerade Parität verwenden und das Byte drei logisch hohe Bits hat, wird das Paritätsbit logisch hoch sein, so dass die Gesamtzahl der logisch hohen Bits in den übertragenen Daten (d. h.,
    • Durch das Erzwingen, dass die Anzahl der logisch hohen Bits immer gerade (für gerade Parität) oder ungerade (für ungerade Parität) ist, bietet das Paritätsbit einen groben Fehlererkennungsmechanismus – wenn ein Bit irgendwo im Übertragungsprozess vertauscht wird, wird die Anzahl der logisch hohen Bits nicht mit dem gewählten Paritätsmodus übereinstimmen. Natürlich bricht die Strategie zusammen, wenn zwei Bits umgedreht werden, also ist das Paritätsbit alles andere als kugelsicher. Wenn Sie einen ernsthaften Bedarf an fehlerfreier Kommunikation haben, empfehle ich einen CRC.

Synchronisieren und Abtasten

Standard-Digitaldaten sind ohne irgendeinen Taktmechanismus sinnlos. Das folgende Diagramm zeigt Ihnen, warum:

Ein typisches Datensignal ist einfach eine Spannung, die zwischen logisch niedrig und logisch hoch wechselt. Der Empfänger kann diese logischen Zustände nur dann korrekt in digitale Daten umwandeln, wenn er weiß, wann er das Signal abtasten muss. Dies kann leicht mit einem separaten Taktsignal erreicht werden – zum Beispiel aktualisiert der Sender das Datensignal bei jeder steigenden Flanke des Takts und der Empfänger tastet dann die Daten bei jeder fallenden Flanke ab.

Die UART-Schnittstelle verwendet jedoch, wie der Name „universeller asynchroner Empfänger/Sender“ andeutet, kein Taktsignal zur Synchronisierung der Tx- und Rx-Geräte. Woher weiß der Empfänger also, wann er das Datensignal des Senders abtasten muss?

Der Sender generiert einen Bitstrom basierend auf seinem Taktsignal, und dann ist es das Ziel des Empfängers, sein internes Taktsignal zu verwenden, um die eingehenden Daten in der Mitte jeder Bitperiode abzutasten. Die Abtastung in der Mitte der Bitperiode ist nicht zwingend erforderlich, aber optimal, da eine Abtastung näher am Anfang oder Ende der Bitperiode das System weniger robust gegenüber Taktfrequenzunterschieden zwischen Empfänger und Sender macht.

Die Empfänger-Sequenz beginnt mit der fallenden Flanke des Startbits. Dies ist der Zeitpunkt, an dem der kritische Synchronisationsvorgang stattfindet. Der interne Takt des Empfängers ist völlig unabhängig vom internen Takt des Senders, d.h. diese erste fallende Flanke kann jedem beliebigen Punkt im Takt des Empfängers entsprechen:

Um sicherzustellen, dass eine aktive Flanke des Empfängertaktes nahe der Mitte der Bitperiode auftreten kann, ist die Frequenz des Baudratentaktes, der an das Empfängermodul gesendet wird, viel höher (um den Faktor 8 oder 16 oder sogar 32) als die tatsächliche Baudrate.

Sagen wir, dass eine Bitperiode 16 Empfängertaktzyklen entspricht. In diesem Fall kann die Synchronisation und Abtastung wie folgt ablaufen:

  1. Der Empfangsvorgang wird durch die fallende Flanke des Startbits eingeleitet.
  2. Der Empfänger wartet 8 Taktzyklen, um einen Abtastzeitpunkt festzulegen, der nahe der Mitte der Bitperiode liegt.
  3. Der Empfänger wartet dann 16 Taktzyklen, was ihn in die Mitte der ersten Datenbitperiode bringt.
  4. Das erste Datenbit wird abgetastet und im Empfangsregister gespeichert, und dann wartet das Modul weitere 16 Taktzyklen, bevor es das zweite Datenbit abtastet.
  5. Dieser Prozess wiederholt sich, bis alle Datenbits abgetastet und gespeichert wurden, und dann kehrt die steigende Flanke des Stoppbits die UART-Schnittstelle in ihren Ruhezustand zurück.

Abschluss

Dieser Artikel hat einige Details über ein Kommunikationsprotokoll behandelt, das Sie vielleicht schon oft erfolgreich eingesetzt haben. Es ist durchaus möglich, eine UART-Schnittstelle zu implementieren, ohne viel über das tatsächliche Verhalten der Signale und der Hardware zu wissen, aber ein wenig zusätzliches Wissen – abgesehen von der allgemeinen Erbauung, die ein solches Wissen bietet – kann hilfreich sein, wenn Ihre UART-Kommunikation nicht wie erwartet funktioniert.

Eine Antwort schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.