Zurück zur Hauptseite

 

Datenaustausch zwischen PC und Arduino (Protokoll)

Inhaltsverzeichnis

Datenfluss

Aufbau der Pakete

Startpaket

Pin-Typen-Paket

Testschritt

Testschritt mit I²C Übertragung

Testschritt mit I²C-Übertragung und I²C-Empfang

Quittung

Eingelesene Pin-Werte

Per I²C eingelesene Werte

Datenfluss

Der Datenfluss für einen Testdurchlauf wird durch das folgende Diagramm beschrieben.

Datenfluss

RailRoad-Code: Protokoll ::= Start (OK Pin-Definitionen (OK (Testschritt)* | Fehler) | Fehler)
SVG-Farbe angepasst: rect.Arduino {fill: #FFC90E; stroke: #332900; stroke-width: 1;}

Der PC sendet einen Auftrag an den Arduino. Dieser meldet dessen Ausführung entweder mit einer Bestätigung (OK) oder mit einem Fehlercode. Fehler beruhen entweder Übertragungsprobleme bei der RS232-Schnittstelle oder auf Programmierfehler (welche zu beheben wären). Die komplette Übersicht über die Fehlercodes findet man im PC-Projekt in der Enumeration IC_Tester.TestResult und auf der Arduino-Seite in der Klasse PcPort.

Der Testdurchlauf beginnt mit einem Startpaket. Dieses enthält die Anzahl Pins des zu testenden ICs. Der Arduino sorgt daraufhin für einen definierten Zustand. Er initialisiert die internen Datenstrukturen und führt einen Reset bei den MCP23017 aus. Tritt hierbei ein Fehler auf, wird der Test abgebrochen.

Als nächstes werden die Pin-Definitionen übertragen. Der Arduino stellt darauf hin die Datenrichtungs- und Pullup-Register ein. Auch hier wird der Test abgebrochen, wenn ein Fehler auftritt.

Dann folgen eine beliebige Anzahl von Testschritten.

Aktuell sind drei Testschritt-Typen implementiert:

Testschritte

RailRoad-Code: Testschritt ::= GPIO (GPIO | Fehler) | GPIO_I2C-Write (GPIO. | Fehler) | GPIO_I2C-Write_I2C-Read (I2C GPIO | Fehler)
SVG-Farbe angepasst: rect.Arduino {fill: #FFC90E; stroke: #332900; stroke-width: 1;}
"GPIO." -> "GPIO

GPIO: Der PC sendet Daten zur Einstellung der GPIO-Register der MCP23017. Der Arduino stellt die GPIOs entsprechend ein. Damit werden die INPUT-Pins und die Spannungsversorgung des zu testenden ICs belegt. Anschließend liest er die GPIO Register aus -und damit die OUTPUT-Pins des zu testenden ICs- und sendet die Daten an den PC zurück.

GPIO_I2C-Write: Der PC sendet Daten zur Einstellung der GPIO-Register und Datenpakete die per I²C an das zu testende IC übertragen werden sollen. Der Arduino stellt zunächst die GPIOs ein, sendet dann die I²C-Pakete an das zu testende IC. Danach werden wieder die GPIOs ausgelesen und die Daten zurück an den PC gesendet.

GPIO_I2C-Write_I2C-Read: Der PC sendet Daten zur Einstellung der GPIO-Register und Datenpakete die per I²C an das zu testende IC übertragen werden sollen. Der Arduino stellt zunächst die GPIOs ein, sendet dann die I²C-Pakete an das zu testende IC. Danach wird vom zu testenden IC per I²C ein Datenpaket angefordert und zum PC übertragen. Zum Schluss werden wieder die GPIOs ausgelesen und die Daten zurück an den PC gesendet.

Aufbau der Pakete

Startpaket

Pakettyp 0, Versand an Arduino

Über dieses Paket wird dem Arduino die Anzahl Pins des zu testenden ICs mitgeteilt. Der Arduino initialisiert seine internen Felder und führt einen Reset der MCP23017 aus. Alle Pins des MCP23017 gehen dadurch in den INPUT-Modus.

Packet 0

RailRoad-Code: Packet_0 ::= StartByte Packet-Length '0' NumberOfPins CRC

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
0 ::= 1 Byte Pakettyp 0
NumberOfPins ::= 1 Byte Anzahl der Pins des IC
CRC ::= 1 Byte Checksumme für das Paket

Pin-Typen-Paket

Pakettyp 1, Versand an Arduino

Dieses Paket dient zum Einstellen der IODIR- und PULLUP-Register der MCP23017.

Packet 1

RailRoad-Code: Packet_1 ::= StartByte Packet-Length '1' PinModeQ+ CRC
Im SVG: PinModeQ -> PinMode†

Die Anzahl Wiederholungen entspricht dem Feld NumberOfPins aus dem Startpaket (Paket 0).

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
1 ::= 1 Byte Pakettyp 1
PinMode ::= NumberOfPins Bytes Pin-Typ
CRC ::= 1 Byte Checksumme für das Paket

Folgende Pin-Typen sind definiert.

Pin am Test-IC  Pin am MSC23017 GPIO-Level  Aktion 
NC INPUT LOW Tri-State
GND OUTPUT LOW Der GPIO-Pin liegt auf GND
VCC OUTPUT HIGH Der GPIO-Pin liefert die Versorgungsspannung
INPUT OUTPUT - Belegung durch GPIO-Paket (s.u.)
OUTPUT INPUT LOW Wert wird ausgelesen
OC INPUT-PULLUP LOW -dito- (Open Collector)
SDA INPUT LOW Tri-State, die Pins werden von SDA-Pin der SoftwareI2c-Einheit des Arduino angesteuert. Separate Kabelverbindung notwendig (siehe Bedienungsanleitung).
SCL INPUT LOW -dito-

Der Wert ist unerheblich, der Pin ist im INPUT-Modus.

Testschritt

Pakettyp 2, Versand an Arduino

Dieses Paket versendet die Einstellungen für die GPIO-Register der MCP23013 für die einzelnen Testschritte.

Packet 2

RailRoad-Code: Packet_2 ::= StartByte Packet-Length '2' GPIOQ+ CRC
Im SVG: GPIOQ -> GPIO†

Die Anzahl Wiederholungen entspricht dem Feld NumberOfPins aus dem Startpaket (Paket 0).

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
2 ::= 1 Byte Pakettyp 2
GPIO ::= NumberOfPins (s. Pakettyp 0) Bytes mit einzustellenden Logik-Werten
CRC ::= 1 Byte Checksumme für das Paket

Die logischen Werte der funktionalen Pins werden durch ihre Funktion festgelegt (siehe Tabelle Pin-Typen im vorhergehenden Abschnitt).

Die im Testschritt vorgegeben logischen Werte werden wie folgt übersetzt:

Testschritt GPIO
LOW LOW
HIGH HIGH
IGNORE LOW

Testschritt mit I²C Übertragung

Pakettyp 3, Versand an Arduino

Dieses Paket versendet die Einstellungen für die GPIO-Register der MCP23013 für die einzelnen Testschritte. Zusätzlich sind Daten enthalten an die I²C-Schnittstelle des zu testenden ICs übertragen werden sollen.

Packet 3

RailRoad-Code: Packet_3 ::= StartByte Packet-Length '3' GPIOQ+ Packet-Count XmitPacketQ+ CRC
Im SVG: GPIOQ -> GPIO† ; PacketQ -> Packet‡

Die Anzahl Wiederholungen entspricht dem Feld NumberOfPins aus dem Startpaket (Paket 0).
Die Anzahl Wiederholungen entspricht dem Feld Packet-Count.

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
3 ::= 1 Byte Pakettyp 3
GPIO ::= NumberOfPins (s. Pakettyp 0) Bytes mit einzustellenden Logik-Werten
Packet-Count ::= 1 Byte Anzahl I²C-Pakete, die an das zu testende IC übertragen werden sollen
XmitPacket := Übertragungspaket, Anzahl = Packet-Count
CRC ::= 1 Byte Checksumme für das Paket

Das XmitPacket besitzt folgenden Aufbau:

Xmit-Packet

RailRoad-Code: Xmit-Packet ::= Xmit-Packet-Length Address DataByteQ+
Im SVG: DataByteQ -> DataByte#

# Die Anzahl Wiederholungen entspricht dem Feld Xmit-Packet-Length - 1 (Geräteadresse wird bei der Länge mitgezählt).

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
0 ::= 1 Byte Pakettyp 0
NumberOfPins ::= 1 Byte Anzahl der Pins des IC
CRC ::= 1 Byte Checksumme für das Paket

Testschritt mit I²C-Übertragung und I²C-Empfang

Paket-typ 4, Versand an Arduino

Dieses Paket versendet die Einstellungen für die GPIO-Register der MCP23013 für die einzelnen Testschritte. Zusätzlich sind Daten enthalten an die I²C-Schnittstelle des zu testenden ICs übertragen werden sollen. Zuletzt wird Leseauftrag für die I²C-Schnittstelle übermittelt.

Packet 4

RailRoad-Code: Packet_4 ::= StartByte Packet-Length '4' GPIOQ+ Packet-Count Xmit-PacketQ+ ReadPacket CRC
Im SVG: GPIOQ -> GPIO† ; PacketQ -> Packet‡

Die Anzahl Wiederholungen entspricht dem Feld NumberOfPins aus dem Startpaket (Paket 0).
Die Anzahl Wiederholungen entspricht dem Feld Packet-Count.

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
3 ::= 1 Byte Pakettyp 3
GPIO ::= NumberOfPins (s. Pakettyp 0) Bytes mit einzustellenden Logik-Werten
Packet-Count ::= 1 Byte Anzahl I²C-Pakete, die an das zu testende IC übertragen werden sollen
XmitPacket := Übertragungspaket, Anzahl = Packet-Count
ReadPacket ::= Leseauftrag zum Einlesen von Daten über die I²C-Schnittstelle des Test-ICs
CRC ::= 1 Byte Checksumme für das Paket

Das ReadPacket besitzt folgenden Aufbau:

ReadPacket

RailRoad-Code: ReadPacket ::= Address NumberOfBytesToRead

Quittung

Pakettyp 10, Empfang von Arduino

Der Arduino meldet zurück, ob das Paket korrekt empfangen und verarbeitet werden konnte.

Packet 10

RailRoad-Code: ReadPacket ::= Address NumberOfBytesToRead

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
10 ::= 1 Byte Pakettyp 10
OK/ErrorCode ::= 1 Byte Fehlercode
CRC ::= 1 Byte Checksumme für das Paket

Folgende Fehlercodes werden benutzt:

Code Bedeutung 
OK
1 CRC-Fehler, die CRC des empfangen Paket war falsch (RS323-Problem).
2 Ungültiger Paket-Typ (Programmierfehler).
3 Ungültige I²C-Pin-Angaben, SDA und/oder SCL-Angabe fehlt (Fehler bei der Pin-Definition).
4 Ungültiger Pin-Typ (Programmierfehler). 
6 Ungültige I²C-Adresse, keine Slave hat auf die übermittelte Adresse reagiert. 
7 I²C-IO-Fehler, die I²C-Daen konnten nicht vollständig übertragen  werden.
8 Fehler bei der Initialisierung des I²C -Busses. SDA und/oder SCL konnten nicht auf HIGH-Pegel gezogen werden.

Eingelesene Pin-Werte

Pakettyp 11, Empfang von Arduino

Der Arduino meldet über dieses Paket die eingelesenen GPIO-Register zurück.

Packet 11

RailRoad-Code: Packet_11 ::= StartByte Packet-Length '11' GPIOQ+ CRC
Im SVG: GPIOQ -> GPIO†

Die Anzahl Wiederholungen entspricht dem Feld NumberOfPins aus dem Startpaket (Paket 0).

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
2 ::= 1 Byte Pakettyp 2
GPIO ::= NumberOfPins (s. Pakettyp 0) Bytes mit einzustellenden Logik-Werten
CRC ::= 1 Byte Checksumme für das Paket

Per I²C eingelesene Werte

Pakettyp 12, Empfang von Arduino

Der Arduino meldet über dieses Paket die per I²C vom zu testenden IC eingelesenen Werte zurück.

Packet 12

RailRoad-Code: Packet_12 ::= StartByte Packet-Length '12' I2C-DataQ+ CRC
Im SVG: I2C-DataQ -> I2C-DataQ#

# Die Anzahl Wiederholungen entspricht der über das ReadPacket angeforderten Menge.

StartByte ::= 1 Byte mit dem Wert 0xFF
Packet-Length ::= 1 Byte Länge des gesamten Pakets (<Start>, <Länge>, <Typ>, <CRC> und Nutzdaten)
12 ::= 1 Byte Pakettyp 12
I2C-Data ::= Angeforderte Anzahl Bytes an eingelesenen I²C-Daten (s. ReadPacket)
CRC ::= 1 Byte Checksumme für das Paket