BiDiB, Übertragung über serielle Schnittstelle

BiDiB - Bidirektionaler Bus - Logo

Inhaltsverzeichnis

1. Allgemeines

Das Protokoll BiDiB dient zur Kontrolle einer Modellbahnanlage. Es ermöglicht die Ansteuerung von Loks, Zubehör und sichere Übertragung von Rückmelderinformationen aus der Modellbahnanlage an den steuernden Rechner.

BiDiB kann über verschiedene Übertragungsmedien transportiert werden, dabei wird das Framing und die Sicherung der Nachrichten gewährleistet.

Eine Erläuterung der hier verwendeten Begriffe und der Protokollgrundzüge findet sich im allgemeinen Teil der Protokollbeschreibung, gleiches gilt auch für die Hinweise zur Benutzung und zur Lizenz.

Im folgenden ist der Transport über einen seriellen Link beschrieben, z. B. RS232 oder virtueller COM-Port über USB.

2. Serielle Verbindung

2.1. Übertragungsparameter

Die Kommunikation erfolgt über einen seriellen Port, die Baudrate ist dabei variabel und kann einen Wert 19200 Baud, 115200 Baud oder 1MBaud annehmen. Die weiteren Parameter sind 8 Datenbits, 1 Stopbit, keine Parity (oft als "8N1" bezeichnet). Die tatsächlich verwendete Baudrate ist vom Host zu Beginn durch Abfragen der System-ID festzustellen, bevorzugte Baudrate ist 1MBaud. Der Host hat also maximal drei Baudraten zu probieren.

(Anmerkung zur Baudrate: 1MBaud ist auf gängigen USB-Uarts (wie z. B. FTDI) und auf allen neueren Microprozessoren gut realisierbar, auf älteren Prozessoren ist für die schnelle Rate ein passender Quarz (z. B. 16MHz) erforderlich)

CTS und RTS werden ausgewertet. Auf beiden Seiten (sowohl auf Host als auch beim Interface) sind Fifos vorzusehen, nach einem CTS-off dürfen noch bis zu 8 Byte übertragen werden.

Nach dem Einschalten und Verbinden des BiDiB-Systems erfolgt noch keine Datenkommunikation. Zuerst muss die System-ID des Interfaces erfolgreich gelesen werden (zur Kontrolle der richtigen Baudrate) und im Interface des BiDiB-Systems die Transferfreigabe für Spontannachrichten gesetzt werden.

2.2. Framing, Datensicherung

Ein serielles Paket ist prinzipiell wie folgt aufgebaut:

PACKET ::= MAGIC  MESSAGE_SEQ  CRC  [MAGIC]
MESSAGE_SEQ ::= ε | MESSAGE  MESSAGE_SEQ
MAGIC ::= 0xFE

Ein serielles PACKET beginnt immer mit speziellen Zeichen ([MAGIC]=0xFE) und kann eine oder mehrere Nachrichten (MESSAGE) enthalten. Das ganze Paket ist mit einer CRC (Cyclic Redundancy Check) abgesichert, um Datenfehler bei der Übertragung erkennen zu können. MAGIC-Zeichen, welche innerhalb von Nachrichten auftauchen, werden 'escaped'. Hierzu wird ein ESCAPE Zeichen (=0xFD) eingefügt und das nachfolgende Zeichen mit 0x20 xor-verknüpft. Auch das ESCAPE-Zeichen selbst wird innerhalb der Nachricht escaped. Das heißt: Anstelle des MAGIC wird ein ESCAPE-Zeichen (=0xFD), gefolgt von MAGIC ^ 0x20 = 0xDE gesendet. Anstelle des ESCAPE-Zeichen wird 0xFD + 0xDD gesendet. Das Escaping erfolgt auf dem fertig kodierten PACKET inkl. CRC (d.h. die CRC wird über die Nachricht(en) ohne MAGIC, ohne ESCAPE gebildet).

Die MESSAGE ist vom Host an einen bestimmten Knoten adressiert. In einem Paket können MESSAGES enthalten sein, die an verschiedene Knoten adressiert sind.

CRC bezeichnet das CRC8-Byte; Auf der Senderseite wird das gemäß Polynom x8 + x5 + x4 + 1 über die Nachricht gebildet, beginnend beim ersten Byte der Nachricht, Init=0, nicht invertiert. Empfängerseitig wird die CRC mit dem gleichen Polynom über die gesamte Nachricht inkl. CRC gebildet, das Ergebnis muss 0 sein.

Nach den Paket schließt sich ein MAGIC an, dies kann auch gleichzeitig der Beginn des nächsten Paketes sein. Wenn kein weiteres Paket zum Senden bereit ist, so wird trotzdem die MAGIC übertragen. Anhand des Empfangs eines MAGIC-Zeichens erkennt der Empfänger das Ende der Nachricht und führt die CRC-Prüfung durch.

Zwischen zwei MAGIC-Zeichen dürfen nicht mehr Zeichen übertragen werden, als die jeweilige max. Längenkapazität (siehe MSG_PKT_CAPACITY) erlaubt, Escaping wird hierbei nicht mitgezählt.

Unter bestimmten Bedingungen kann ein leeres Paket entstehen. In diesen Fall wird MAGIC 0x00 MAGIC (wobei 0x00 der CRC-Wert ist) oder MAGIC MAGIC übertragen.

2.3. Protokoll

Die Systemzeit wird mittels MSG_LOCAL_SYNC-Nachrichten übertragen falls hostseitig gewünscht. Diese werden regelmäßig in Abständen kleiner als 32,3 s gesendet (unter Annahme eines 30ppm-Quarz im Knoten ergibt sich in dieser Zeitspanne eine maximale Drift von 1 ms). Der in der Nachricht enthaltene Timestamp bezieht sich jeweils auf das Ende des vorangegangenen MAGIC-Zeichens. Dieser Zeitpunkt lässt sich häufig vom Treiber ermitteln, indem MAGIC als Event-Character eingestellt wird.