Der PC sendet einen Befehl. Danach wartet er bis der TWI-Master mit einer Erfolgs- oder Fehlermeldung antwortet. Danach kann der nächste Befehl übertragen werden. Der aktuelle Befehl ist beendet, wenn sämtliche Antwort-Bytes übertragen wurden.
Die Zeitdauer zwischen den einzelnen Zeichen eines Befehls darf 250 ms nicht überschreiten. Ist sie länger, wird eine Zeitüberschreitung (Watchdog) erkannt und ein Reset ausgelöst.
Bei merkwürdigen Reaktionen des TWI-Masters ist davon auszugehen, dass die Synchronisation verloren gegangen ist. Die Firmware interpretiert Datenbytes als Kommandos. I.d.R. reicht es in diesem Fall, einfach zu warten. Nach einer kurzen Zeit (ca. 250 ms) wird die Watchdog-Einheit einen Reset auslösen. Dieser Reset kann anhand der folgenden Break-Bedingung auf dem seriellen Anschluss erkannt werden. Ab dann ist wieder eine synchrone Kommunikation möglich. Zuletzt besteht noch die Möglichkeit, aktiv einen Reset auszulösen.
Beim I²C (Inter-Integrated Circuit ) im Allgemeinen und beim Atmel TWI (Two-wire Serial Interface) im Speziellen gibt es mehrere Betriebszustände. Für diese Applikation sind nur die Zustände Master Transmitter Mode und Master Receiver Mode von Relevanz.
Je nach Betriebszustand und gerade ausgeführter Bus-Funktion können verschiedene Fehlersituationen auftreten, auf die angemessen reagiert werden muss. Der TWI-Master liefert i.d.R. eine treffende Fehlermeldung. Ist diese nicht ausreichend, kann über die Funktion GetTWIStatus u.a. der aktuelle Inhalt des TWI-Status-Registers abgefragt werden. Per GetExtendedError kann der Status der letzten durchgeführten TWI-Funktion abgefragt werden.
Bei den TWI-Funktionen, die das Erzeugen einer Starbedingung beinhalten, kann festgelegt werden, ob im Misserfolgsfall mehrfach versucht werden soll, die Startbedingung zu erzeugen. Es wird dann max. TwiTimeout Millisekunden lang versucht, die Arbitrierung des Busses zu übernehmen.
Bei einer TWI-Transferfunktion gibt es die Möglichkeit nach deren Beendigung den Bus freizugeben. Dies geschieht durch das Erzeugen einer Stopp-Bedingung. Alternativ verbleibt die Arbitrierung beim AVR und der nächste Übertragung wird mit dem Erzeugen einer Restart-Bedingung begonnen.
Funktion | Beschreibung | Parameter | Rückgabe |
---|---|---|---|
Basis-Funktionen | |||
SetTWI | Schaltet die TWI-Einheit aus und belegt die I²C-Leitungen manuell. | Je ein Bit für SDA und SCL | Fehlercode |
GetTWIState | Liefert den Wert des TWI Status Registers (TWSR), den Zustand der TWI-Leitungen und den Wert von TWEN des TWI Control Registers (TWCR). | - | Fehlercode, Status |
TWIStart | Erzeugt eine Start-Bedingung, wartet ggf. darauf, den BUS arbitrieren zu können. | - | Fehlercode |
TWIStartNoWait | Erzeugt eine Start-Bedingung, wartet nicht. | - | Fehlercode |
TWIStop | Erzeugt eine Stop-Bedingung. | - | Fehlercode |
WriteByte | Sendet ein einzelnes Byte. | Byte | Fehlercode, Rückmeldung des Slaves |
ReadByteACK | Liest ein einzelnes Byte aus und sendet anschließend ein ACK-Bit. | - | Fehlercode, gelesenes Byte |
ReadByteNAK | Liest ein einzelnes Byte aus und sendet anschließend ein NAK-Bit. | - | Fehlercode, gelesenes Byte |
SetTwiClockRate | Legt die TWI-Übertragungsrate (Bit-Rate) fest. | Takt-Code | Fehlercode |
GetTwiClockRate | Liest die TWI-Übertragungsrate (Bit-Rate) aus. | - | Fehlercode, Takt-Code |
SetTwiTimeout | Legt fest, ab wann bei der Erzeugung der Startbedingung auf Timeout erkannt wird. | Anzahl ms (1..100) | Fehlercode |
GetTwiTimeOut | Liest die Zeitdauer aus, nach der auf ein Timeout bei der Erzeugung der Startbedingung erkannt wird. | - | Fehlercode, Wert |
SetTwiPullUp | Schaltet die Pull-Up-Widerstände für die TWI-Bus-Leitungen. | None, 5kΩ, 50kΩ | Fehlercode |
Stream-Funktionen | |||
WritePacket | Überträgt ein Datenpaket an den Slave. | Slave-Adresse, Paketlänge, Nutzdaten | Fehlercode |
ReadPacket | Fordert ein Datenpaket vom Slave ab. | Slave-Adresse, Paketlänge | Fehlercode, Paketlänge, Nutzdaten |
Register-Funktionen | |||
WriteRegisterPacket | Kann durch WritePacket abgewickelt werden, indem zunächst die Registeradresse übertragen wird. | - | - |
ReadRegisterPacket | Fordert Inhalte aus einem Register ab. | Slave-Adresse, Register-Adresse, Paketlänge | Fehlercode, Paketlänge, Nutzdaten |
Ergänzung-Funktionen | |||
SetDDR | Werte der DDR-Register für die IO-Pins festlegen. | Pin#, Wert | Fehlercode |
SetPort | Werte der PORT-Register für die IO-Pins festlegen. | Pin#, Wert | Fehlercode |
GetDDR | Werte der DDR-Register der IO-Pins auslesen. | Pin# | Fehlercode, Wert |
GetPORT | Werte der PORT-Register der IO-Pins auslesen. | Pin# | Fehlercode, Wert |
GetPIN | Werte der PIN-Register der IO-Pins auslesen. | Pin# | Fehlercode, Wert |
ReadADC | Liest die am Pin angelegte Spannung mittels des ADC aus. Der ADC-Pin wird
NICHT selbständig auf Input
geschaltet. Dies muss vorher per SetDDR und SetPORT geschehen. Es wird jeweils der Mittelwert aus vier Messungen gebildet. |
Pin#, Referenz-Spannung | Fehlercode, Wert |
ResetOut | Legt die RstOut-Leitung auf Low für die per SetResetTime eingestellte Zeit. | - | Fehlercode |
SetResetTime | Legt die Zeit fest, wie lange die RstOut-Leitung auf Low gehalten wird (Standardeinstellung ist 10 ms). | Anzahl ms (1..100) | Fehlercode |
GetResetTime | Liest die vorgesehene Dauer des Reset-Pulses aus. | Fehlercode, Wert | |
Power | Die anschaltbare Stromversorgung an- oder ausschalten. | On/Off | Fehlercode |
GetPowerState | Den aktuellen Status der anschaltbaren Stromversorgung auslesen. | - | Fehlercode, Wert |
Trigger | Auslösen des Trigger-Impulses. Die Dauer des Trigger-Pulses ist konstant 10µs. Der Ruhezustand dieser Leitung ist Low. Zum Triggern wird sie für die eingestellte Zeit auf High gelegt. | - | Fehlercode |
NOP | "No Operation", Synchronisation bzw. Lebenszeichen. | - | Fehlercode |
GetExtendedError | Zusätzliche Informationen bei Fehlercode FAIL abrufen. | - | Informationen zu Fehler |
GetVersion | Liefert die aktuelle Version der Firmware. | Fehlercode, Wert | |
Signal | Signal-LED an- oder abschalten. | On/Off | Fehlercode |
Reset | Reset des ATmega per Watchdog. | - | Fehlercode |
Das Bit 7 (MSB) wird nicht zur Befehlscodierung genutzt. Ist es bei der Übertagung gesetzt (= 1), wird vor der Ausführung des Befehls die Triggerleitung für 10 µs auf High gesetzt.
Mit den Fehlercodes OVERLAP und UNKNOWN muss immer gerechnet werden und werden deshalb nicht explizit erwähnt!
Code | Bedeutung | Fehlercodes | Anmerkung |
---|---|---|---|
0x00 | SetTwi: SDA=0, SCL=0 |
SUCCESS, FAIL | FAIL: Der Befehl wurde ausgeführt, jedoch nehmen die Leitungen nicht den vorgesehenen Wert an. Ein anderer Bus-Teilnehmer beeinflusst den Leitungszustand. |
0x01 | SetTwi: SDA=0, SCL=1 |
SUCCESS, FAIL | - dito - |
0x02 | SetTwi: SDA=1, SCL=0 |
SUCCESS, FAIL | - dito - |
0x03 | SetTwi: SDA=1, SCL=1 |
SUCCESS, FAIL | - dito - |
0x04 | GetTWIStatus | SUCCESS_1B | Das folgende Datenbyte liefert den Wert des TWI Status Registers (TWSR) in den Bit 3..7, den Zustand der SCL-Leitung in Bit 0, den der SDA-Leitung in Bit 1 und den Wert von TWEN des TWI Control Registers (TWCR) in Bit 2. |
0x05 | SendStart | SUCCESS, FAIL | FAIL: Das TWI-Interface des ATmega hat einen Fehler gemeldet. |
0x06 | SendStartNoWait | SUCCESS, FAIL | - dito - |
0x07 | SendStop | SUCCESS, FAIL | - dito - |
0x08 | Power Off | SUCCESS | - |
0x09 | Power On | SUCCESS | - |
0x0A | ResetOut | SUCCESS | - |
0x0B | NOP | SUCCESS | - |
0x0C | Trigger | SUCCESS | - |
0x0D | ReadByteACK | SUCCESS_1B, FAIL | SUCCESS_1B: Das folgende Datenbyte liefert den gelesenen Wert. FAIL: Das TWI-Interface hat einen Fehler gemeldet. |
0x0E | ReadByteNAK | SUCCESS_1B, FAIL | SUCCESS_1B: Das folgende Datenbyte liefert den gelesenen Wert. FAIL: Das TWI-Interface hat einen Fehler gemeldet. |
0x0F | ungültig | UNKNOWN | - |
0x10 | SetTwiPullUp None: Kein Pull Up |
SUCCESS | - |
0x11 | SetTwiPullUp Pull Up = 5kΩ |
SUCCESS | - |
0x12 | SetTwiPullUp Pull Up = 50kΩ |
SUCCESS | - |
0x13 | GetVersion | SUCCESS_NB | Die folgenden Bytes enthalten die aktuelle Version der Firmware als String. |
0x14 | GetResetTime | SUCCESS_1B | Das folgende Datenbyte enthält die vorgesehene Dauer des Reset-Pulses in ms. |
0x15 | ungültig | UNKNOWN | |
0x16 | GetExtendedError | SUCCESS_2B | Status des TWI-Moduls |
0x17 | GetPowerState | SUCCESS_DATA | LSB enthält den Status der anschaltbaren Stromversorgung: 0: aus, 1: an |
0x18 | GetTwiTimeout | SUCCESS_1B | Das folgende Datenbyte enthält die vorgesehene Dauer für das TWI-Timeout in ms. |
0x19 | GetTwiPullUp | SUCCESS_DATA | Status der geschalteten PullUp-Widerstände. |
0x1A | EnableTwi | SUCCESS | Die TWI-Einheit wird eingeschaltet. |
0x1B | GetBitRateCode | SUCCESS_DATA | Liest den aktuell gültigen Code für die I²C-Übertragungsrate (Bitrate) aus. |
0x1C | SignalOn | SUCCESS | Die Signal-LED wird angeschaltet. |
0x1D | SignalOff | SUCCESS | Die Signal-LED wird ausgeschaltet. |
0x1E | GetSignalState | SUCCESS_DATA | LSB enthält den Status der Signal-LED: 0: aus, 1: an |
0x1F | ungültig | UNKNOWN | |
Befehle für die einzelnen IO-Pins | |||
Die Pin-Nr. 0..3 wird in Bit 0..1 übertragen, Zusatzinformationen in Bit 3 | |||
0x2x x:0..7 | SetDDR | SUCCESS | |
0x2x x:8..F | SetPORT | SUCCESS | |
0x3x x:0..3 | GetDDR | SUCCESS_DATA | |
0x3x x:4..7 | ungültig | UNKNOWN | - |
0x3x x:8..B | GetPORT | SUCCESS_DATA | |
0x3x x:C..F | ungültig | UNKNOWN | - |
0x4x x:0..3 | GetPIN | SUCCESS_DATA | |
0x4x x:4..7 | ungültig | UNKNOWN | - |
0x4x x:8..B | ReadADC Ref. = VCC ADC 0..3 |
SUCCESS_2B | Die nachfolgenden beiden Bytes enthalten den ermittelten Wert. MSB zuerst. |
0x4x x:C..F | ReadADC Ref. = 2,56 V ADC 0..3 |
SUCCESS_2B | Die nachfolgenden beiden Bytes enthalten den ermittelten Wert. MSB zuerst. |
Befehl zum Setzen der Bitrate | |||
0x70 .. 0x7A | SetBitrate | SUCCESS | Setzen der I²C-Übertragungsrate (Bitrate). |
0x7B .. 0x7F |
ungültig | UNKNOWN | - |
Code | Bedeutung | 1. Folge-Byte | 2. Byte | 3. Byte | Fehlercodes | Anmerkung |
---|---|---|---|---|---|---|
0x50 | WriteByte | Daten-Byte | - | - | SUCCESS_ACK, SUCCESS_NAK, FAIL | |
0x51 | SetTwiTimeout | Anzahl ms (1..100) | - | - | SUCCESS, INVALID | INVALID: Anzahl ms = 0 |
0x52 | ungültig | - | - | - | UNKNOWN | |
0x53 | SetResetTime | Anzahl ms (1..100) | - | - | SUCCESS, INVALID | INVALID: Anzahl ms = 0 oder > 100 |
0x54 | ReadPacket | Slave-Adresse (0..127) | Paketlänge N | - | SUCCESS_NB, INVALID, FAIL, SLAVE_ADDRESS | INVALID: Adresse > 127 FAIL: Übertragungsproblem |
0x57 | ReadRegisterPacket | Slave-Adresse (0..127) | Register-Adresse | Paketlänge N | SUCCESS_NB, INVALID, FAIL, SLAVE_ADDRESS | INVALID: Adresse > 127 FAIL: Übertragungsproblem |
0x5B .. 0x5F |
ungültig | - | - | - | UNKNOWN | - |
Code | Bedeutung | 1. Folge-Byte | 2. Byte | 3. Byte | 4.Byte | Fehlercodes | Anmerkung |
---|---|---|---|---|---|---|---|
0x60 | WritePacket | Slave-Adresse (0..127) | Paketlänge N | 3. Byte & ff Dtenpaket |
- | SUCCESS, INVALID, FAIL, SLAVE_ADDRESS | INVALID: Adresse > 127 FAIL: Übertragungsproblem |
0x63 .. 0x6F |
ungültig | - | - | - | - | UNKNOWN | - |
Fehler | Bedeutung | Code | Symbol |
---|---|---|---|
Erfolg | Erfolgreiche Durchführung, kein Fehler | 0x00 | SUCCESS |
Erfolg, Rückmeldung im niederwertigen Nibble | Erfolgreiche Durchführung, kein Fehler. Das Ergebnis wird im niederwertigen Nibble zurückgeliefert. | 0x1x | SUCCESS_DATA |
Erfolg, ein Byte Rückmeldung | Erfolgreiche Durchführung, kein Fehler, es wird ein Byte zurückgeliefert | 0x21 | SUCCESS_1B |
Erfolg, zwei Byte Rückmeldung | Erfolgreiche Durchführung, kein Fehler, es wird ein Byte zurückgeliefert | 0x22 | SUCCESS_2B |
Erfolg, N Byte Rückmeldung | Erfolgreiche Durchführung, kein Fehler, es werden N Bytes zurückgeliefert. Das folgende Byte ist die Längenangabe N (1..255). Danach folgen N Bytes an Daten | 0x23 | SUCCESS_NB |
Lebenszeichen | Bei Befehlen, bei denen erwartet wird, dass die Ausführung länger dauert, wird nach jeweils 50 ms ein Lebenszeichen gesandt. | 0x40 | PATIENCE |
Zeitüberschreitung Befehlsausführung | Der Befehl konnte nicht in der vorgesehenen Zeit durchgeführt oder beendet werden. | 0x80 | TIMEOUT |
Unbekannter Befehl | Der Befehlscode ist unbekannt. | 0xB0 | UNKNOWN |
Ungültiger Parameter | Der gesendete Parameter liegt außerhalb des Wertebereichs. | 0xC0 | INVALID |
Erfolglos | - Befehl konnte nicht ausgeführt werden. - Das TWI-Interface hat einen Fehler gemeldet. Details zum Fehler über GetExtendedError abrufen. |
0xD0 | FAIL |
Slave unbekannt | Kein Slave hat auf die angegebene Adresse mit ACK geantwortet | 0xE0 | SLAVE_ADDRESS |
Nach Übertragung des Kommando-Bytes erfolgt ggf. die Übertragung der zur Ausführung des Kommandos notwendigen Daten. Danach beginnt der Watchdog zu laufen (s. auch Firmware/Reset-Einheit). Üblicherweise ist die Ausführungszeit der Befehle recht kurz und das Ergebnis wird unmittelbar zurück geliefert.
Bei länger dauernden Befehlsausführungen wird nach jeweils 50 ms ein Lebenzeichen gesendet (PATIENCE). Dies betrifft die Befehle RstOut und die TWI-Funktionen (s.o.). Erhält der TWI-Host während der Befehlsausführung jeweils innerhalb von 100 ms keine erneute Meldung kann davon ausgegangenen werden, dass eine Fehlfunktion des TWI-Master vorliegt. Ein Read-Timeout von 100 ms auf der seriellen Schnittstelle erlaubt es, die Befehlsausführung per Ausnahme-Behandlung abzubrechen und zur erneuten Synchronisation auf das Reset-Signal des TWI-Master zu warten.
Die Zeitdauer des ausgehenden Reset-Impulses ist einstellbar, kann aber 100 ms nicht überschreiten. Bei den TWI-Funktionen ist die Dauer der Befehlsausführung durch TwiTimeout begrenzt (ebenfalls max. 100 ms). Eine Watchdog-Reset nach 250 ms würde also keinen gültigen Befehl unterbrechen. Die beim Wiederanlaufen des TWI-Master gesendeten Signale (Break und APP_START) ermöglichen dem TWI-Host die erneute Synchronisation.
Erhält der TWI-Host die Reset-Meldung nicht innerhalb einer angemessen Zeit von ca. 1.000 ms kann er seinerseits versuchen einen Reset auszulösen. Hilft auch das nicht, muss der Anwender aufgefordert werden, einen manuellen Reset vorzunehmen.
Das ganze in einem Zustandsdiagramm: