UART-Empfängertakt


14

Ich habe versucht, die UART-Grundlagen zu verstehen

  • Es ist ein asynchrones Kommunikationsprotokoll und daher sind die TX- und RX-Uhren unabhängig voneinander
  • Der Datenempfang wird durch die Verwendung eines Startbits und eines oder mehrerer Stoppbits garantiert. Zusätzlich muss der Empfänger die Datenrate kennen, um einen geeigneten Takt zum Treiben des für den Empfang verwendeten SIPO-Registers zu erzeugen .

Die Fragen hier sind

Es wird erwähnt, dass normalerweise ein Takt mit der 16-fachen Bitrate verwendet wird, um die Daten wiederherzustellen. Wie ist nun die Umwandlung von Bps in Taktfrequenz möglich? Bitte geben Sie mir einige Hinweise, um den im UART-Empfänger verwendeten Taktmechanismus zu untersuchen.

Antworten:


18

Sender- und Empfängertakte sind unabhängig voneinander und werden unabhängig voneinander generiert. Sie sollten jedoch gut aufeinander abgestimmt sein, um eine ordnungsgemäße Übertragung zu gewährleisten.

Das Startbit, das niedrig ist, und das Stoppbit, das hoch ist, garantieren, dass zwischen zwei Bytes immer ein Übergang von hoch nach niedrig besteht, auf den sich der Empfänger synchronisieren kann, aber danach ist es für sich allein: es gibt keine weitere Zeit Hinweise, mit denen aufeinanderfolgende Bits voneinander unterschieden werden können. Alles was es hat ist eine eigene Uhr. Am einfachsten ist es also, jedes Bit in der Mitte seiner Zeit ab dem Start-Bit-Sample zu starten. Beispielsweise beträgt eine Bitzeit bei 9600 bps 104 us, dann würde das Startbit bei + 52 abgetastet, das erste Datenbit bei + 52 us + 104 us, das zweite Datenbit bei + 52 us + 2 104 µs und so weiter. ist die fallende Flanke des Startbits. Während des Abtastens ist das Startbit nicht wirklich notwendig (SieT0T0T0×T0weiß es Tief) ist es nützlich , um festzustellen , dass die Startkante nicht eine Spitze war.

Bildbeschreibung hier eingeben

Für ein Timing von 52 µs benötigen Sie die doppelte Taktfrequenz von 9600 bps oder 19200 Hz. Dies ist jedoch nur eine grundlegende Erkennungsmethode. Fortgeschrittenere Methoden (lesen: genauer) nehmen mehrere Samples hintereinander, um zu vermeiden, dass nur dieser eine Spike getroffen wird. Dann brauchen Sie in der Tat einen 16- 9600-Hz-Takt, um 16 Ticks pro Bit zu erhalten, von denen Sie etwa 5 in der Mitte eines Bits verwenden können. Und die verwenden ein Abstimmungssystem, um zu sehen, ob es als hoch oder niedrig gelesen werden soll.×

Wenn ich mich recht erinnere, hat der 68HC11 am Anfang, in der Mitte und am Ende eines Bits ein paar Samples genommen, das erste und das letzte wahrscheinlich neu synchronisiert, wenn sich der Pegel ändern würde (was nicht garantiert ist).

Der Abtasttakt wird nicht von der Bitrate abgeleitet, sondern umgekehrt. Für 9600 Bit / s müssen Sie den Abtasttakt auf 153 600 Hz einstellen, was Sie über einen Vorteiler aus der Taktfrequenz des Mikrocontrollers ableiten. Daraus wird dann der Bittakt durch eine weitere Division durch 16 abgeleitet.

Unübertroffene Uhren
Dies passiert, wenn die Uhr des Empfängers nicht mit der des Senders synchron ist:

Bildbeschreibung hier eingeben

Die Uhr des Empfängers ist 6,25% langsamer, und Sie können sehen, dass die Abtastung für jedes nächste Bit immer später erfolgt. Eine typische UART-Übertragung besteht aus 10 Bits: 1 Startbit, einer Nutzlast von 8 Datenbits und 1 Stoppbit. Wenn Sie dann mitten in einem Bit abtasten, können Sie es sich leisten, beim letzten Bit, dem Stoppbit, ein halbes Bit Abstand zu haben. Ein halbes Bit auf zehn Bits ist 5%, daher werden wir mit unserer Abweichung von 6,25% auf Probleme stoßen. Das zeigt sich deutlich im Bild: Bereits beim dritten Datenbit wird randnah abgetastet.


Ich schätze die Hilfe. Danke !!. Sollte das Startbit nicht bei T0 + 104us statt bei T0 + 52us abgetastet werden?
Vivek Maran

1
@ Vivek27 - nein, weil 104 us die Dauer des Startbits ist, und dann würden Sie am Ende davon abtasten, anstatt in der Mitte. Wenn Sie mir ein paar Minuten Zeit lassen, aktualisiere ich meine Bilder. :-)
stevenvh

1
@Vivek: Eigentlich wird das Startbit überhaupt nicht "abgetastet". Sein ganzer Zweck ist es, diesen anfänglichen Übergang von der Leerlaufzeile, auf den sich der Rest des Zeichens bezieht, zu ermöglichen. Es ist "Wert" ist immer gegenüber Leerlauf und enthält selbst keine Daten.
Olin Lathrop

7
@Olin - Ich würde das Startbit abtasten , nur um zu überprüfen, ob die Startkante keine Spitze ist.
Stevenvh

1
@downvoter - Wenn Sie uns mitteilen würden, was hier falsch ist, könnte ich das Problem möglicherweise beheben. Aber dann musst du uns etwas sagen . (Sind Sie derselbe, der heute auch meine andere Antwort
abgelehnt hat

11

Lassen Sie uns einen Schritt zurücktreten und über das von UARTs verwendete Low-Level-Signalisierungsprotokoll sprechen. TX und RX sind Datenleitungen, keine Uhren. Die Uhren befinden sich nur in jedem UART, weshalb im Vorfeld Einigkeit darüber bestehen muss, wie hoch die Baudrate ist.

Wenn nicht gesendet wird, bleibt die Leitung im Ruhezustand. Zur Übertragung eines Bytes (z. B. sind andere Datenbreiten möglich) sendet der Sender zunächst das Startbit . Der Empfänger verwendet die Zeit der Vorderflanke des Startbits und die bekannte Baudrate, um dann den Rest des Zeichens zu decodieren. Nehmen wir der Einfachheit halber an, dass 100 kBaud verwendet werden. Das heißt, jede Bitzeit ist 10 µs lang. Dies schließt das Startbit, die Datenbits und das Stoppbit (die Stoppbits) ein. Daher liegt die Mitte des ersten Datenbits bei 15 us nach der Vorderflanke des Startbits, die zweite bei 25 us usw.

Solange die Empfänger- und Senderuhr gleich sind, könnte dies für immer so weitergehen. Sie werden jedoch niemals exakt gleich sein, sodass es nicht ewig so weitergehen kann. Um eine erneute Synchronisation der Uhr des Empfängers mit der Uhr des Senders zu ermöglichen, endet das Datenzeichen, die Leitung wird für ein Bit frei gelassen, und der Vorgang wird wiederholt. Timing-Fehler häufen sich ab der Vorderflanke des Startbits an, sodass die maximale Drift beim letzten Bit liegt. Sobald dieses Zeichen vorbei ist, setzt der Empfänger das Warten auf das nächste Startbit zurück und der Vorgang wird wiederholt.

Mit 8 Datenbits ist der schlechteste Fall für das Timing das Abtasten des letzten Bits. Das sind 8,5 Bitzeiten von der Zeitreferenz, die die Vorderflanke des Startbits ist. Wenn der Empfänger um mindestens 1/2 Bit ausgeschaltet ist, wird das letzte Bit während eines anderen Bits abgetastet. Das ist eindeutig schlecht. Dies geschieht bei einer Taktfrequenzfehlanpassung von 1/2 Bit in 8 1/2 Bits oder 5,9%. Das ist die garantierte Fehlanpassung. Um die Zuverlässigkeit zu gewährleisten, sollten Sie normalerweise sicherstellen, dass der Empfänger mit dem Sender auf die Hälfte oder 2,9% genau übereinstimmt. Dies entspricht einem Zeitfehler von 1/4 Bit beim letzten Bit.

Ganz so einfach ist es jedoch nicht. In dem oben beschriebenen Szenario startet der Empfänger im Wesentlichen eine Stoppuhr an der Vorderflanke des Startbits. Das könnte theoretisch in der analogen Elektronik geschehen, wäre aber kompliziert und teuer und nicht einfach in digitale Chips integrierbar. Stattdessen verfügen die meisten digitalen UART-Implementierungen über einen internen Takt, der mit der 16-fachen erwarteten Bitrate ausgeführt wird. Die "Stoppuhr" zählt dann diese 16 Zyklen. Das bedeutet, dass zu allen Bitabtastzeiten ein zusätzlicher möglicher Fehler von 1/16 Bit hinzugefügt wird, was einer weiteren Taktinkongruenz von 0,7% beim letzten Bit entspricht.

Hoffentlich wird dadurch klar, was das Stoppbit ist, wie das Bit-Timing funktioniert und worum es bei der 16-fachen Uhr geht. Ich habe meistens Stoppbits übersprungen, aber vielleicht können Sie jetzt selbst sehen, warum mindestens ein Stoppbit erforderlich ist. Grundsätzlich sind die Stoppbits die minimale erzwungene Leerlaufzeit zwischen Zeichen. Dies ist die Zeit, in der der Empfänger ein Zeichen empfangen hat und für die nächste Vorderflanke eines Startbits bereit ist. Wenn es kein Stoppbit gäbe, könnte das letzte Datenbit die gleiche Polarität wie das Startbit haben und der Empfänger hätte keine Flanke, an der seine Stoppuhr starten könnte.

Vor langer Zeit wurde dieses Protokoll von Nocken, Hebeln und durchdrehenden Rädern entschlüsselt. Oft wurden zwei Stoppbits verwendet, um das Zurücksetzen des Mechanismus zu ermöglichen. Heutzutage wird alles in digitaler Logik ausgeführt und 1 Stoppbit wird so ziemlich universell verwendet. Sie sehen das Low-Level-Protokoll häufig als 8-N-1, dh 8 Datenbits, keine Paritätsbits (vergessen Sie diese, sie werden heutzutage selten verwendet) und 1 Stoppbit. Das Startbit ist impliziert, da es dort keine Option gibt.

Bei Verwendung von 8-N-1 benötigt ein 8-Bit-Datenbyte tatsächlich 10-Bit-Zeiten zum Senden. Dies ist ein Grund, warum zwischen "Bitrate" und "Baudrate" unterschieden wird. Die Baudrate bezieht sich auf die einzelnen Bit-Signalisierungszeiten einschließlich der Start- und Stoppbits. Bei 100 kBaud dauert jedes übertragene Bit 10 µs, einschließlich Start- und Stoppbit. Das gesamte Zeichen benötigt also 100 µs, es werden jedoch nur 8 Bit echte Daten übertragen. Die Baudrate beträgt 100 kBit, die Datenübertragungsbitrate aus Sicht höherer Ebenen jedoch nur 80 kBit / s.


5

Die Bitrate für die Übertragung ist die Taktrate geteilt durch (wie Sie normalerweise sagen) 16. Sie haben auch einige Nicht-Datenbits für die Rahmenbits (Start, Parität, Stopp). Für einen 16000Hz-Takt erhalten Sie also 1000 Bits pro Sekunde, aber nach minimalen Framing-Bits werden nur 800 Datenbits oder 100 Bytes pro Sekunde eingefügt.

Zum Empfangen zählt der Empfänger ab der Mitte des Startbits 16 Takte und tastet die Leitungsaufrufe ab, die er als "erstes Datenbit" ansieht. es wiederholt diese Zählung und tastet so oft ab, bis das gesamte Symbol gelesen ist, bestätigt dann das Vorhandensein des Stoppbits und beginnt, auf das nächste Startbit zu warten.

Solange der Empfängertakt in der Nähe des Sendertakts liegt, trifft die Abtastung auf die richtigen Teile des gesendeten Signals.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.