⏪ | Zurück zur Hauptseite |
Datenaustausch zwischen PC und Arduino (Protokoll)
Der Datenfluss für einen Testdurchlauf wird durch das folgende Diagramm beschrieben.
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:
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.
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.
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 |
Pakettyp 1, Versand an Arduino
Dieses Paket dient zum Einstellen der IODIR- und PULLUP-Register der MCP23017.
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.
Pakettyp 2, Versand an Arduino
Dieses Paket versendet die Einstellungen für die GPIO-Register der MCP23013 für die einzelnen Testschritte.
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 |
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.
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:
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 |
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.
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:
RailRoad-Code: ReadPacket ::= Address NumberOfBytesToRead
Pakettyp 10, Empfang von Arduino
Der Arduino meldet zurück, ob das Paket korrekt empfangen und verarbeitet werden konnte.
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 |
---|---|
0 | 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. |
Pakettyp 11, Empfang von Arduino
Der Arduino meldet über dieses Paket die eingelesenen GPIO-Register zurück.
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 |
Pakettyp 12, Empfang von Arduino
Der Arduino meldet über dieses Paket die per I²C vom zu testenden IC eingelesenen Werte zurück.
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 |