Lesen von mfx-Daten

PfeilZum Menü

Konfiguration

Blockdarstellung
Bei einem Lesewunsch sendet die Zentrale einen READ-Befehl samt den für das Lesen notwendigen Taktimpulsen über das Gleis an den Decoder. Dieser liefert daraufhin ebenfalls über das Gleis ein phasenmoduliertes 52,6kHz-Rückmeldesignal an den RDS-Empfänger, der daraus den Datenstrom regeneriert.
Der Datenstrom von der Zentrale zum Decoder und der regenerierte Datenstrom sind in den Bildern unten dargestellt.

Ablauf eines Lesevorgangs

Aussenden des READ-Befehls

Das schon bekannte READ-Paket startet den Auslesevorgang je eines der in einem mfx-Decoder gespeicherten Parameter.
Parameter: Decoder-Adressfeld 9/12/15/18 Bit
  Typ-Kennung "1110.00"
  zu lesender Konfigurationsstring 10 Bit
  erstes zu lesendes Element 6 Bit
  Anzahl zu lesender Elemente 2 Bit    (00 -> 1 Byte, 01 -> 2 Bytes, 10 -> 4 Bytes)
Gesamtlänge:33 Bit + CRC8 bei 9Bit-Adressfeldformat

Abholen der zu lesenden Daten

Zur Rückmeldung gelesener Daten als Antwort auf ein READ-Paket wird der Rückmeldeträger vom Decoder mit einer Übertragungsrate von 912µs/Bit RDS-ähnlich phasenmoduliert gesendet. Der Takt wird von der Zentrale vorgegeben, indem sie regelmäßig 25µs-Impulse ausgibt, und zwar die ersten 23 im 912µs-Abstand, die restlichen 30 + 16 * D im Abstand von jeweils 456µs. Dabei ist D die Anzahl der zu lesenden Datenbytes. Die Rückmeldung ist also für ein 1-Byte-Lesen für etwa 42ms aktiviert.

 
Lesebefehl
Im oberen Bild sieht man das von der Zentrale ausgesendete READ-Paket mit den Taktimpulsen für ein 1-Byte-Lesen. Rückmeldung
 
Das untere Beispielbild zeigt den Datenausgang des RDS-Decoders während einer 1-Byte-Rückmeldung. Während der Pulse im 912µs-Abstand stabilisiert sich der Pegel auf 1, um dann mit dem Umschalten auf 456µs-Pulse eine 010-Folge abzugeben, daran anschließend erscheinen die 8 Datenbits (D) und die 8 CRC-Bits (C). Danach erscheint wieder ein 1-Pegel am RDS-Datenausgang. In unserem Beispiel wird "00000001" als Datenbyte und "11110010" als CRC-Byte übertragen.

CRC-Berechnung

Die CRC-Bits werden wie in Befehlsrichtung entsprechend dem Polynom x8+ x2 + x + 1 erzeugt, allerdings ist der Berechnungsvorgang etwas seltsam. Das CRC-Register wird mit FF vorbelegt, und VOR jedem neuen Datenbyte 8 mal rotiert, dann das Datenbyte ge-XOR-t. Beim letzten Byte, der Prüfsumme, wird vor dem XOR nicht rotiert, hinterher muss im CRC-Register 0 drin sein.
 
In C sähe das etwa so aus:
/************************************************************/
 int crc = 0xff;                 // CRC-Register vorbelegen

 for (i=0; i<datlen; i++) {      // alle Datenbytes einsammeln
   crc ^= (crc << 1) ^ (crc << 2) ^ *daten;
   if (crc & 0x100) crc ^= 0x107;
   if (crc & 0x200) crc ^= 0x20e;
 }
 crc ^= *daten;                  // mit Prüfsumme vergleichen
/************************************************************/

 

Ausgabenübersicht:
© 2006 Rainer Müller

PfeilZum Menü