Muss eine Baudrate in der seriellen Kommunikation (USB oder RS232) genau sein?

Bedeutet die Baudrate bei der seriellen Kommunikation, dass wir die genaue Taktfrequenz verwenden müssen, oder ist es ein Bereich von Geschwindigkeiten, den wir verwenden können?

Und wenn es ein exakter Wert ist, wie genau sollte er sein? Kann ich zum Beispiel 555 als Taktgeber einer seriellen Kommunikationsschaltung verwenden?

Ein UART kann normalerweise eine Abweichung von etwa ~3% tolerieren. Hängt aber von einem bestimmten ab.
Für USB wird es im Standard spezifiziert, der kostenlos heruntergeladen werden kann.

Antworten (2)

Die Timings müssen genau genug sein, damit sie nicht auseinanderdriften, bevor das Protokoll erneut synchronisiert wird.


UART seriell wird auf jedem Byte neu synchronisiert und ein Byte besteht aus etwa 10 Bits (8 Datenbits plus Start und Stopp). Wir gehen davon aus, dass unser UART auf die Mitte jedes Bits abzielt. Wenn alles perfekt ist und nur ein Ende ungenau ist, erlaubt dies einen Unterschied von ungefähr 5 % zwischen den beiden Enden der Verbindung.

Jedoch:

  1. Beide Enden der Verbindung können im Verhältnis zum Nennwert ungenau sein. Im schlimmsten Fall kann ein Ende unter dem Nennwert liegen, während das andere über dem Nennwert liegt.
  2. Es können systematische Fehler auftreten. Zum Beispiel haben die meisten UARTS einen begrenzten Bereich von Einstellungen für den Baudratengenerator.
  3. Ihr UART basiert auf einer Hauptuhr mit endlicher Geschwindigkeit. Selbst wenn der Taktgeber und der Baudratengenerator perfekt sind, führt dies dazu, dass er nicht die genaue Mitte jedes Bits trifft.

Das Fazit ist, dass ein Fehler von 1 % auf Ihrer Uhr mit ziemlicher Sicherheit in Ordnung ist. 5% Fehler ist mit ziemlicher Sicherheit ein Problem. Zwischen diesen beiden Zahlen kann es je nach Gesamtbild ein Problem geben oder auch nicht.

Das ist eine große Herausforderung für einen RC-Oszillator. Nehmen wir an, Ihr R hat eine Toleranz von 1 % und Ihr C eine Toleranz von 2 %. Das ergibt eine Toleranz von etwa 3% für die Zeitkonstante des RC-Netzwerks, und das, bevor Sie an Fehler denken, die durch Ihren Treiberchip verursacht werden.

Unter dem Strich sollten Sie sich also einen Kristall- oder Keramikresonator ansehen.


Was USB betrifft, so habe ich nicht die Erfahrung, um es von Grund auf zu analysieren, aber https://www.silabs.com/community/interface/knowledge-base.entry.html/2004/03/15/usb_clock_tolerance-gVai sagt 1,5% für niedrige Geschwindigkeit und 0,25 % für volle Geschwindigkeit.

Wenn man die Baudrate in 3 % oder feineren Schritten programmieren und eine geeignete "Trainings"-Sequenz verwenden kann, ist die RC-Genauigkeit möglicherweise kein Problem. Wenn man weiß, dass das andere Ende abwechselnd wiederholt 0xF8 und 0xF0 sendet (niedrig für vier bzw. fünf Bitzeiten), sollte die Einstellung der eigenen Baudrate um 33% schneller dazu führen, dass man durchgehend 0xF0 (5,33 Bitzeiten) und 0x80 (6,67 Bit) empfängt mal). Der Empfang anderer Werte lässt einen wissen, dass man schneller oder langsamer als diese "33% über" Geschwindigkeit ist, während der Empfang von wiederholten 0xF0 0x80 anzeigt, dass man die Geschwindigkeit um 25% reduzieren und eine echte Kommunikation beginnen sollte.

Die UARTs , die typischerweise in seriellen RS232-Systemen verwendet werden, arbeiten durch Abtasten der Datenleitung irgendwo in der Mitte des Bits gemäß einer Teilung des vordefinierten Grundfrequenztakts der Baudrate. Wenn die gesendeten Daten und der Empfänger nicht auf derselben Frequenz sind, wandert der "Abtastpunkt" als solches näher an den Rand des Bitrahmens bei aufeinanderfolgenden Bits.

Bei einem normalen UART beträgt die Bitlänge für ein Byte 10 oder 11 Bit. 1 Start, 8 Daten und 1 oder 2 Stoppbits. Ein halbes bisschen Wandern auf dem 10. Bit wird in 0,5/10 = 5 % Fehler übersetzt.

In Wirklichkeit ist Ihre Toleranz jedoch geringer, da Sie auch die Latenz Ihrer Grundfrequenzperiode hinzufügen müssen, wodurch ein Versatz von der Vorderflanke des Startbits hinzugefügt wird. Je höher Ihre Grundfrequenz ist, desto geringer ist der Effekt.

Die Verwendung eines 555-Timers für diesen Zweck würde ich nicht empfehlen, es sei denn, Sie planen eine manuelle Einstellung in der 555-Schaltung.

Ein USART hingegen verwendet ein komplexeres Steuerverfahren, das versucht, die Übertragung mit den empfangenen Daten zu synchronisieren. Dies kann durch Verwendung eines Datenmusters erfolgen, das einen eingebetteten Takt hat, durch Verwendung eines durchgelassenen Takts oder durch irgendeine Form von Phasenverriegelung mit den empfangenen Datenflanken. (Obwohl letzteres wohl wirklich pseudosynchron ist.)

Da Sie wissen, wovon Sie sprechen, dachte ich, ich erwähne die Abkürzung "U S ART", die Teil dieser Antwort sein sollte . Nun, es würde meiner Meinung nach die Antwort vervollständigen und danach eine +1 von mir verdienen.
@HarrySvensson hmm .. Ich stimme zu .. aber der Versuch zu entscheiden, macht die Antwort für ein 555-Verpackungs-OP nur verwirrender.
Ein USART unterscheidet sich darin, dass es synchron sein kann. Und wenn es als synchrone Schnittstelle verwendet wird, dann ist der Takt an beiden Enden gleich, und dann spielt die Taktrate keine Rolle.
Na ja, es kann stattdessen in den Kommentaren stehen, danke @gbarry. Ich habe nichts dagegen. +1 für Trevor.
@HarrySvensson Ich habe der Vollständigkeit halber eine kurze handgewellte Erklärung des Unterschieds hinzugefügt.