I2C am 80C552 Microprozessor


Der I2C Bus
beim 80C552 Microprozessor



1. Allgemeines

Der I2C - Bus verwendet 2 Leitungen (SDA und SCL) um die Informationen zwischen den an den Bus angeschlossenen Geräten zu übertragen. Die Vorteile des Buses sind:

- Bidirektionaler Datentransfer zwischen Master und Slaves
- Multimaster Bus ( kein zentraler Master )
- Arbitration zwischen gleichzeitig übertragenden Mastern ohne Zerstörung der Daten am Bus
- Serielle Taktsynchronisation erlaubt einen Datentransfer von Geräten mit verschiedenen Taktraten über den
gleichen Bus



Die D - Flip Flops der Ausgänge P1.6 und P1.7 müssen auf logisch 1 liegen um die SIO1 Einheit zu aktivieren. Die SIO1 ( Serial Input & Output ) Einheit ist eine der beiden seriellen Eingangs und Ausgangs Logiken, die es erlauben mit Geräten außerhalb des Prozessors zu kommunizieren
Die 80C552 implementierte I2C Bus Logik bietet ein serielles Interface, welches die I2C Bus Spezifikationen und die damit verbundenen Übertragungsarten unterstützt. Die SIO1 Logik verarbeitet den Byte Transfer autonom, d.h. sie verfolgt den seriellen Datentransfer Ein Status Register ( S1DAT ) spiegelt den Zustand der SIO und dem I2C Bus wieder um den Benutzer Auskunft über den jeweiligen Stand der Übertragung zu vermitteln.
Der CPU ist über folgende vier Special Funktion Register zum I2C Bus gekoppelt:

S1CON ( dem SIO1 Kontroll Register)
S1DAT ( dem SIO1 Daten Register )
S1STAT ( dem SIO1 Status Register )
und dem S1ADR ( dem SIO1 slave address Register ).

Die SIO1 Logik leitet die Daten zu den externen I2C Bus, dargestellt durch die Port Pins P1.6


( SCL ) und P1.7 ( SDA ).
Abbildung 1.0:
Die Abbildung zeigt die Geräteanordnung am I2C Bus Interface
Der typische Aufbau eines I2C Buses zeigt die Abbildung 1.0
Das Master Gerät generiert alle seriellen Taktimpulse und zusätzlich die START und die STOP Bedingung. Ein Datentransfer wird mit einer STOP Bedingung oder mit einer wiederholten START Bedingung beendet. Die wiederholte START Bedingung stellt wiederum eine neue beginnende Datenübertragung dar, der Bus wird aber bei dieser nicht freigegeben sonder gehört den beiden Geräten welche ihre Funktion als Master und Slave beibehalten jedoch die Funktion von Transmitter ( Sender ) und Receiver ( Empfänger ) tauschen.
Man unterscheidet vier verschiedene Arten der Kommunikation, welche die interne SIO1 Logik unterstützt:

1.1. Der Master Transmitter Mode

Die Daten werden wie zuvor erwähnt über die Pins 1.6 ( SCL ) und 1.7 ( SDA ) ausgegeben. Das erste Byte welches übertragen wird enthält die Slave Adresse von dem empfangendem Gerät ( diese ist 7 Bits lang ) und zusätzlich das Datenrichtungsbit ( R/W - Bit ) was in dieser Funktion 0 ist ( Write ). Die seriellen Daten welche anschließend übermittelt werden sind dann jeweils 8 Bits lang. Nach jedem Byte welches übermittelt wurde, wird ein Acknowledge Bit empfangen. Der Beginn und das Ende der Übertragung wird, wie schon erwähnt mit der START und der STOP Bedingung signalisiert.

1.2. Der Master Receiver Mode

Das erste Byte welches übertragen wird, enthält die Slave Adresse des angesprochenen Gerätes am Bus und zusätzlich das Datenrichtungsbit welches bei diesem Übertragungsmodus 1 ist ( Read ).
Die seriellen Daten werden über die Pins 1.7/SDA und 1.6/SCL empfangen. Es werden jeweils 8 Bits verarbeitet. Nach jedem korrekt empfangenem Byte wird dem Slave ein Acknowledge gesendet. Der Beginn und das Ende der Übertragung wird wieder mitder START und der STOP Bedingung signalisiert.

1.3. Der Slave Receiver Mode

Die seriellen Daten und der Takt wird beim Slave über die Pins 1.7/SDA und 1.6/SCL empfangen. Nach jedem Byte welches empfangen wurde, wird ein Acknowledge am Bus generiert. Die START und die STOP Bedingung welche empfangen wurde, dient zur Feststellung ob eine Übertragung gestartet oder beendet wurde. Die Adresserkennung wird von der Hardware nach dem Empfang der Adresse und dem Datenrichtungsbit ausgeführt.

1.4. Der Slave Transmitter Mode

Das erste Byte welches empfangen wurde wird wie im Slave Receiver Mode abgearbeitet. Jedoch, in diesem Modus, zeigt das Datenrichtungsbit an, dass die Datenrichtung umgekehrt wird. So wie bei den anderen Modi werden auch hier die seriellen Daten über die Pins 1.7 und 1.6 empangen bzw. übertragen. Die START und STOP Bedingung wird als Beginn und Beendigung der Übertragung gewertet.

Ein Beispiel:


In einer gegebenen Anwendung würde die SIO1 Logik als Master und als Slave arbeiten. Im Slave Mode achtet die SIO1 Einheit auf seine eigene Slave Adresse und der General Call Adresse. Wenn nun eine dieser beiden Adressen erkannt wurde, wird ein Interrup ausgelöst. Wenn der Microkontroller es verlangt ein Master zu werden, wartet die Hardware bis der Bus frei und der Master Mode eingeleitet wird, so dass mögliche Slave Funktionen nicht unterbrochen werden. Wenn die Bus Arbitration im Master Mode verloren wurde, schaltet die SIO1 Logik sofort wieder in den Slave Mode und erkennt wenn nötig seine eigene Adresse im selben seriellen Datentransfer.

2. Der SIO1 Aufbau und die Funktion

Abbildung 2.0 zeigt das im Microkontroller untergebrachte I2C Bus Interface. Der folgende Text beschreibt die verschiedenen Blöcke:

2.1. Eingangsfilter und Ausgangsstufen

Die Eingangsfilter haben ein I2C Bus kompatibles Spannungsniveau. Wenn die Eingangsspannung kleiner ist als 1.5V, erkennt die Eingangslogik eine 0, wenn die Eingangsspannung größer als 3.0V ist wird dies als eine 1 interpretiert. Die Eingangssignale werden mit den internen Takt synchronisiert ( fosc/4 ), und Spikes kürzer als 3 Oszillatorperioden werden ausgefiltert.
Die Ausgangsstufen bestehen aus Open - Drain - Transistoren welche 3mA bei Spannungen
Abbildung 2.0: Aufbau der SIO1 Logik im 80C552
Uaus <0,4 V liefern können. Diese Open - Drain Ausgänge haben keine Schutzdioden gegen vDD.. Wenn das Gerät mit dem I2C Bus verbunden jedoch die Spannung abgeschalten ist, ergibt sich auf diese Art keinerlei Beeinflussung des Buses.

2.2. Adressregister S1ADR

Dieses 8 - Bit Special Funktion Register kann mit einer 7 Bit langen Slave Adresse geladen werden, auf die die SIO1 Logik reagiert wenn sie als Slave Transmitter oder Receiver programmiert wurde. Das LSB ( GC - Bit ) des Registers wird gesetzt wenn eine Erkennung der General Call Adresse gewünscht wird.

2.3. Der Komperator

Der Komperator vergleicht die empfangene 7 Bit Slave Adresse mit der eigenen eingestellten Slave Adresse. Auch vergleicht er das erste 8 Bit lange Byte mit der General Call Adresse. Wenn eine Gleichheit gefunden wurde, werden entsprechende Status Bits gesetzt und der I2C Bus Interrupt ausgelöst.

2.4. Schieberegister S1DAT

Dieses 8 Bit Special Funktion Register beinhaltet ein Byte an seriellen Daten welche übertragen werden sollen, oder ein Byte welches gerade empfangen wurde. Daten im S1DAT Register werden immer von rechts nach links geschoben; das erste Bit ist damit das MSB (7. Bit) und, nach dem Empfang eines Bytes, steht an der Stelle des MSB das erste Bit von dem neu empfangenen Datenbytes. Während Daten auf den Bus hinausgeschoben werden, wird an einer anderen Stelle am Bus gleichzeitig dieselben wieder in ein S1DAT Register hineingeschoben. Damit enthält das S1DAT Register immer das letzte Byte welches am Bus vorgekommen ist. Im Falle einer verlorenen Arbitration, wird der Übergang vom Master Transmitter zum Slave Receiver auf diese Art mit den richtigen ( empfangenen ) Daten im S1DAT erledigt.

2.5. Arbitration und Synchronisierungslogik

Im Master Transmitter Mode überprüft die Arbitration Logik ob jede übertragene logische 1 auch eine logische 1 am I2C Bus ergibt. Wenn ein anderes Gerät am Bus eine logische 1 ablehnt und die SDA Leitung auf 0 zieht, ist die Arbitration verloren und die SIO1 Logik schaltet vom Master Transmitter in den Slave Receiver Mode. Die SIO1 Logik wird jedoch weiter Taktimpulse auf SCL ausgeben bis die Übertragung vom aktuellen Byte abgeschlossen wurde.
Es ist zu beachten, dass Arbitration auch im Master Receiver Mode verloren werden kann. Das Verlieren der Arbitration kann jedoch nur dann passieren wenn die SIO1 Logik kein Acknowledge zurücksendet ( Logisch 1 am Bus ).
Auch kann die Arbitrtion verloren werden wenn am Bus ein Gerät ein Signal gegen 0 zieht. Dies kann am Ende eines seriellen Datenbytes passieren. Die SIO1 Logik generiert dann keine weiteren Taktimpulse mehr.

Die Synchronisierungslogik synchronisiert den seriellen Taktgenerator mit den Taktimpulsen an der SCL Leitung die von einem anderen Gerät am Bus erzeugt werden. Wenn zwei oder mehrere Master, Taktimpulse erzeugen, wird die 1 Dauer von dem Gerät welches den kürzesten 1 Impuls erzeugt und die 0 Dauer von dem Gerät, welches die längste 0 Periode gerneriert diese erkannt und berücksichtigt. Ein Gerät im Slave Mode kann die Pausenperiode dehnen, um eine Verlangsamerung der Übertragungsgeschwindigkeit zu erzwingen.

2.6. Der serielle Taktgenerator

Dieser programmierbare Taktimpulsgenerator stellt die SCL Taktimpulse wenn sich die SIO1 Logik im Master Transmitter oder im Master Receiver Mode befindet, zur Verfügung. Er wird im Slave Mode abgeschaltet. Die programmierbaren Taktfrequenzen sind: fosc/120, fosc/9600 und die achtel Timer Overflow Rate des Timer 1. Es ist auffällig dass die Ausgangstaktimpulse nach einer Synchronisation mit anderen SCL Quellen ein Tastverhältnis von 50% besitzen.

2.7. Timing und Control Einheit

Die Timing und Control Einheit erzeugt die Zeit - und Kontroll Impulse die zur Byteverarbeitung benötigt werden. Sie erzeugt die Schiebeimpulse für das S1DAT Register, aktiviert den Komperator, erzeugt und erkennt START und STOP Bedingung, empfängt und sendet die Acknowledge Bits, überwacht den Master und Slave Mode und beinhaltet die Interruptauslöseeinheit sowie die Steuereinheit zum Anzeigen der I2C Bus Staten.

2.8. Control Register S1CON

Dieses 7 - Bit Special Funktion Register wird vom Microkontroller verwendet um folgende SIO1 Funktionen zu
überwachen:
.) den Start und wiederholten Start der seriellen Ãœbertragung
.) den Abruch einer Ãœbertragung
.) Bitraten
.) Adresserkennung
und .) Acknowledgements.

2.9. Status Dekoder und Status Register

Der Status Dekoder nimmt alle internen Status Bits und komprimiert diese in einen 5 - Bit Code. Dieser Code ist spezifisch für jeden einzelnen I2C Bus Zustand. Der 5 - Bit Code kann nun dazu verwendet werden um Vektor Adressen zu erzeugen welche eine schnelle Abarbeitung der jeweiligen Interrupt Service Routinen erlauben. Jede Service Routine verarbeitet einen bestimmten Bus Status. Wenn alle 4 Betriebsarten verwendet werden gibt es maximal 26 mögliche Staten. Nachdem das Interrupt Flag von der Hardware gesetzt wurde, wird der 5 - Bit Status Code an den Stellen der 5 wichtigsten Bits ( MSBs ) im Status Register gespeichert und bleibt dort solange erhalten bis das Interrupt Flag von der Software gelöscht wird. Die 3 wenig wichtigen Bits ( LSBs ) des Status Registers sind immer auf logisch 0 gesetzt.

3. Beschreibung der vier Special Funktion Register


Der Microkontroller arbeitet über die Special Funktion Register mit der SIO1 Logik zusammen. Diese vier Register (S1ADR, S1DAT, S1CON und S1STAT ) werden nun im Folgenden genauer beschrieben:


3.1. Das Adressregister S1ADR

Der CPU kann von diesem direkt adressierbaren 8 Bit Register lesen und auf dieses schreiben.
Abbildung 3.0:
Das Adressregister



Das S1ADR bleibt während der ganzen I2C Bus Operation von der SIO1 Logik unbeeinflußt. Der Inhalt hat keine Bewandniss wenn sich diese im Master Mode befindet, im Slave Mode jedoch müssen die 7 wichtigen Bits entsprechend der gewünschten Slave Adresse geladen werden. Zusätzlich kann, wenn es gewünscht wird das letzte Bit gesetzt werden um die Gerneral Call Adresse falls diese gesendet wird, zu akzeptieren. Anderfalls wird die ignoriert.

Das wichtigste Bit entspricht dem ersten Bit welches empfangen wurde wenn eine START Bedingung am Bus aufgetreten ist. Eine logisch 1 im S1ADR Register entspricht einem High und eine logisch 0 einem Low am Bus.

3.2. Das Daten Register S1DAT

Das S1DAT Register beinhaltet ein Byte der seriellen Daten welche übermittelt werden soll oder ein Byte welches gerade empfangen wurde. Der CPU kann direkt in dieses Register schreiben oder von diesem Register lesen wenn nicht gerade ein Hinausschieben eines Bytes im Gange ist. Dieses ist der Fall wenn die SIO1 Logik sich in einem definierten Zustand befindet und das serielle Interrupt Flag gesetzt wurde. Die Daten im S1DAT Register bleiben solange erhalten, solange der Interrupt ( SI ) gesetzt bleibt. Die Daten im S1DAT Register werden immer von rechts nach links hinausgeschoben; das erste Bit welches übertragen wird ist damit das MSB im S1DAT. Während Daten auf den Bus hinausgeschoben werden, wird an einer anderen Stelle am Bus gleichzeitig dieselben wieder in ein S1DAT Register beim Empfänger hineingeschoben. Damit enthält das S1DAT Register immer das letzte Byte welches am Bus vorgekommen ist. Im Falle einer verlorenen Arbitration, wird der Übergang vom Master Transmitter zum Slave Receiver auf diese Art mit den richtigen ( empfangenen ) Daten im S1DAT erledigt.
Abbildung 4.0:
Das Datenregister






Acht Bits werden empfangen oder übertragen. Eine logisch 1 entspricht einem High und eine logisch 0 einem Low am I2C Bus. Die Abbildung 3.0 zeigt, wie die Daten aus dem S1DAT seriell an und vom dem Bus übertragen bzw. empfangen werden.
Abbildung 5.0:
Die Abb. zeigt den prinzipiellen Aufbau eines I2C Bus Interfaces
Das S1DAT Register und das Ack Flag Einheit bilden ein 9 - Bit Schieberegister welches ein 8 - Bit langes Byte herein oder hinaus schiebt. Dieses Byte wird durch ein Ack Bit gefolgt. Das Ack Flag wird von der SIO1 Logik gesteuert und kann nicht vom CPU beeinflußt werden. Serielle Daten welche empfangen werden, schiebt man durch die Ack Einheit ins S1DAT mit jeder steigenden Flanke eines SCL Impulses hindurch. Wenn ein Byte ins S1DAT Register geschoben wurde, stehen die Daten im Register zur Verfügung und ein Acknowledge Bit wird, ausgelöst durch die Control Unit mit dem 9. Taktimpuls zurückgesendet.
Die seriellen Daten selber, werden bei einem Sendevorgang mit den fallenden Taktimpulsen des Taktgenerators über einen 1 Bit Ausgangsbuffer auf die SDA Leitung geschrieben.
Wenn der CPU Daten an das S1DAT Register schreibt, wird der Ausgangsbuffer mit den 8. Bit des S1DAT Registers geladen, welches das erste zu übertragende Bit darstellt. Nach 9 Taktimpulsen sind die 8 Bits aus dem S1DAT übertragen und man findet ein Acknowledge Bit in derACK Einheit vor. Man beachte, dass die übertragenen 8 Bit wieder in das S1DAT Register geschoben wurden.

3.3. Das Control Register

Der CPU kann direkt zu diesem 8 Bit Special Funktion Register schreiben und auch lesen. Zwei Bits in diesem Register werden von SIO1 Logik beeinflußt:


Abbildung 6.0:
Das Control Register

Das SI Bit wird gesetzt wenn ein serieller Interrupt ansteht, und das STO Bit wird gelöscht wenn eine STOP Bedingung am I2C Bus auftritt. Das STO Bit wird zusätzlich gelöscht wenn das ENS1=0 gesetzt wird.

3.3.1. ENS1 ( aktiviert die SIO1 Logik )

Wenn das ENS1 Bit 0 ist, werden die SDA und SCL Leitung auf High gelegt. Ankommende SDA und SCL Impulse werde ignoriert, die SIO1 Logik ist im nichtadressiertem Slave Mode, und das STO Bit wird im S1CON Register auf 0 gehalten. Keine anderen Bits werden dadurch beeinflußt und die Ausgangspins können als normale Open Drain Ausgänge benutzt werden.
Wenn ENS1=1 ist, wird die SIO1 Logik aktiviert. Die Portpins P1.6 und P1.7 werden nun auf logisch 1 gesetzt. EN1 sollte nicht dazu benutzt werden um die SIO1 Logik kurzfristig vom I2C Bus zu trennen. Dabei wird nämlich der I2C Bus Status im S1STAT gelöscht. Stattdessen sollte man dazu das AA Bit verwenden welches später genauer erklärt wird.
Im nachfolgenden Text wird angenommen das ENS1=1 ist:

3.3.2. Das STA Bit ( = START Flag )

Wenn das STA Bit gesetzt ist wird der Master Mode initiiert, die SIO1 Logik überprüft den Status des I2C Buses und erzeugt die START Bedingung wenn der Bus sich als frei darstellt. Wenn dieser jedoch wegen einer laufenden Übertragung gerade belegt ist, wartet die SIO1 Logik bis eine STOP Bedingung ( welche den Bus freigibt ) anliegt, und erzeugt eine START Bedingung nach einer Verzögerung von einer halben Taktperiode ( gemessen anhand des internen Taktgenerators ).
Wenn das STA Bit gesetzt wird, während sichdie SIO1 Logik bereits im Master Mode befindet und ein oder mehrere Bytes sendet, wird eine sogenannte wiederholte START Bedingung von der SIO1 Logik generiert. STA bleibt die ganze Zeit gesetzt, kann also auch gesetzt werden wenn sich die SIO1 Logik im adressierten Slave Mode befindet.
Man beachte, wenn das STA bit gelöscht wird, wird keine START oder wiederholte START Bedingung erzeugt.

3.3.3. Das STO Bit ( = STOP Bit )

Wenn das STO Bit gesetzt wird während sich die SIO1 Logik im Master Mode befindet, wird eine STOP Bedingung am I2C Bus erzeugt. Wenn eine STOP Bedingung am Bus anliegt, wird das STO Flag automatisch von der Hardware gelöscht. Im Slave Mode, kann das STO Flag gesetzt werden um aus einem vorangegangenem Fehlerzustand in einem Normalzustand zurückgekehrt werden kann. In diesem Falle wird keine STOP Bedingung am I2C Bus erzeugt. Dennoch, verhält sich die SIO1 Logik so, wie ob eine STOP Bedingung empfangen wurde und schaltet in den nichtadressierten Slave Receiver Mode. Das STO Flag wird dabei automatisch von der Hardware gelöscht.
Wenn die SIO1 Logik sich im Master Mode befindet und das STA mit dem STO Bit gleichzeitig gesetzt wird, erzeugt dies eine STOP Bedingung am I2C Bus. In diesem Fall würde die sich im Slave Mode befindende SIO1 Logik eine interne STOP Bedingung generieren welche jedoch nicht übertragen wird. Danach wird eine START Bedingung generiert.

3.3.4. Das SI Flag ( = serielle Interrupt Flag )

Wenn das SI Flag gesetzt wurde, dann sind die Bits EA und ES1 ebenfalls gesetzt ( zu finden im Interrupt Enable Register ), ein serieller Interrupt wird angekündigt. Das SI Flag wird durch 1 von 25 der 26 möglichen Staten der SIO1 Logik gesetzt. Der einzige Zustand welcher nicht ein setzten des SI Flags verursacht, ist der Zustand F8h welcher angibt, dass keine wichtige Information anliegt.
Während das SI Flag gesetzt ist, wird die Low Periode des Taktsignales auf der SCL Leitung gedehnt und die serielle Übertragung verzögert. Ein Highzustand der SCL Leitung wirkt sich auf den seriellen Interrupt nicht aus. Das SI Flag muss über die Software zurückgesetzt werden. Wenn das SI Flag gelöscht wird, steht kein Interrupt mehr an und der Takt wird folglich nicht mehr gedehnt.

3.3.5. Das AA Flag ( = Assert Acknowledge Flag )

Wenn das AA Flag gesetzt wurde, wird ein Acknowledge ( auf Low ziehen der SDA Leitung ) während des Acknowledge Taktimpulses zurückgesendet:
Dazu müssen folgende Kriterien erfüllt worden sein:

⇒ Es wurde die eigene Slave Adresse empfangen
oder ⇒ Die Gerneral Call Adresse wurde empfangen ( GC Bit in S1ADR Register gesetzt )
oder ⇒ Ein Datenbyte wurde empfangen während sich die SIO1 Logik im Master
Receiver Mode befindet
oder ⇒ Ein Datenbyte wurde empfangen während sich die SIO1 Logik im adressierten Slave
Receiver Mode befindet

Wenn das AA Flag gelöscht wurde, wird kein Acknowledge beim Acknowledge Taktimpuls zurückgesendet. Dieser Zustand kann auftreten wenn folgende Kriterien erfüllt wurden:

⇒ Ein Datenbyte wurde empfangen, während sich die SIO1 Logik im Master Receiver
befindet oder
oder ⇒ Ein Datenbyte wurde empfangen, während sich die SIO1 Logik im adressierten Slave
Receiver Mode befindet

Wenn sich die SIO1 Logik im nichtadressierten Slave Mode befindet, wird die eigene Slave Adresse bzw. die General Call Adresse ignoriert. Folglich wird kein Acknowledge zurückgesendet und kein serieller Interrupt ausgelöst. Auf diese Art kann die SIO1 Logik zeitweise vom Bus weggeschalten werden. Die START und STOP Bedingung werden erkannt, und die seriellen Daten werden in das S1DAT Register geschoben. Die Adresserkennung kann zu jeder Zeit durch setzten des AA Flags wieder aufgenommen werden.

3.3.6. Die Bits CR0, CR1 und CR2 ( = Takt Raten Bits )

Diese drei Bits bestimmen die serielle Taktfrequenz wenn die SIO1 Logik sich im MasterMode befindet. Die verschiedenen seriellen Taktraten sind in der folgenden Tabelle angeführt:





Bit Frequenz ( kHz) bei fosc


CR2
CR1
CR0
6 MHz
12 MHz
16 MHz
fosc dividiert durch
0
0
0
23
47
63
256
0
0
1
27
54
71
224
0
1
0
31
63
83
192
0
1
1
37
75
100
160
1
0
0
6,25
12,5
17
960
1
0
1
50
100
-
120
1
1
0
100
-
-
60
1
1
1
0,25 <62,5
0,5 <62,5
0,67 <56
96 x ( 256 - Startwert des Timers 1 )






Der Startwert kann zwischen 0 und 256 in Mode 2 liegen

Eine 12,5 kHz Bitrate kann von verschiedenen Geräten verwendet werden, welche normale I/O Schnittstellen besitzen und softwaremäßig der I2C Bus simuliert wird ( langsam ). 100kHz ist üblicherweise das Maximum an Bitrate und kann durch 16MHz, 12MHz oder 6MHz Oszillatoren erzeugt werden. Zusätzlich kann eine veränderliche Bitrate ( 0,5kHz bis 62,5kHz ) erzeugt werden, wenn kein Bedarf an dem Timer 1 besteht und sich die SIO1 Logik im Master Mode befindet.
Die in der Tabelle aufgelisteten Frequenzen sind nicht von Bedeutung wenn sich die SIO1 Logik im Slave Mode befindet. In diesem Falle synchronisiert sich die SIO1 Logik automatisch an den Sender und kann dabei Taktraten bis 100kHz erreichen.

3.4. Das Status Register S1STAT

Das S1STAT Register ist ein 8 Bit Special Funktion Register. Die drei unwichtigsten Bits sind immer auf logisch 0 gehalten. Die fünf wichtigen Bits ( MSBs ) enthalten die 26 möglichen Status Codes. Wenn das S1STAT Register den Wert F8h beinhaltet, liegt keine wichtige Information an und ein serieller Interrupt wird nicht ausgelöst. Alle anderen S1STAT Werte weisen auf einen definierten Zustand der SIO1 Logik hin. Wenn einer dieser Zustände auftritt, wird ein serieller Interrupt ausgelöst und ein gültiger Statuscode wird nach einem Machinenzyklus der Auslösung in das S1STAT Register geschrieben und ist bis 1 Machinenzyklus nach dem der Interrupt zurückgesetzt wurde vorhanden.


4. Mehr Information über die Arbeitsarten der SIO1 Logik


Die vier Arbeitsarten der SIO1 Logik sind:

- Master Transmitter
- Master Receiver
- Slave Receiver
- Slave Transmitter


4.1. Der Master Transmitter Mode


Im Master Transmitter Mode werden eine Anzahl von Datenbytes an einen Slave Receiver übertragen. Bevor man in den Master Transmitter Mode gehen kann, muss das S1CON wie folgt eingerichtet werden.
Abbildung 7.0:
Das Control Register wie es im Master Transmitter Mode konfiguriert werden muss





CR0, CR1 und CR2 definieren die serielle Bitrate. ENS1 muss auf logisch 1 gesetzt werden um die SIO1 Logik zu aktivieren. Wenn das AA Bit gelöscht wird, hat dies zur Folge dass die SIO1 Logik die eigene Slaveadresse oder ein General Call nicht beantwortet und in diesem Falle ein anderes am I2C Bus angeschlossenes Gerät zum Master wird. In anderen Worten gesagt, wenn das AA Bit gelöscht wird, kann die SIO1 Logik nicht in den Slave Mode übergehen. STA, STO und SI müssen zurückgesetzt werden.
Der Master Transmitter Mode kann nun durch setzten des STA Bit durch Verwendung des SETB Befehl gestartet werden. Die SIO1 Logik testet zuerst den I2C Bus und generiert bei positiven Ergebnis die START Bedingung. Wenn die START Bedingung erzeugt wurde, wird der serielle Interrupt ausgelöst und im Status Register steht der Wert 08h. Dieser Status Code muss als Vektor, der auf die zugehörige Interrupt Service Routine verweist, verwendet werden. In dieser Routine muss die Slave Adresse des gewünschten Bausteines in das S1DAT Register geschrieben und das Datenrichtungsbit gesetzt werden. Das SI Bit muss per Software gelöscht werden um mit der seriellen Datenübertragung fortzufahren.

Nachdem die Slaveadresse und das Datenrichtungsbit übertragen worden ist, wurde ein Acknowledge Bit empfangen und der serielle Interrupt wurde wieder ausgelöst. Nun sind eine Anzahl von Status Codes im S1STAT Register möglich. Es gibt die Werte 18h, 20h oder 38h für den Master Mode aber auch 68h, 78h oder B0h wenn der Slave Mode aktiviert wurde. ( AA Bit logisch 1 ). Die geeigneten Reaktionen welche auf Grund dieser Codes ausgeführt werden können sind in der Tabelle des MASTER TRANSMITTER MODES im Datenbuch zu entnehmen.
Ein vereinfachtes Schema der Statuscodes die während der Übertragung auftreten sind in dem folgendem Diagramm zu sehen:

Abbildung 8.0: Das Statuscodediagramm des Master Transmitter Modes



Nach einer wiederholten START Bedingung ( Status Code 10h ) schaltet die SIO1 Logik in den Master Receiver Mode in dem sie die Slave Adresse und das Read Bit in das S1DAT Register lädt.


4.2. Der Master Receiver Mode

Im Master Receiver Mode werden eine Anzahl von Datenbytes von einem Slave Transmitter empfangen. Die Übertragung wird wie im Master Transmitter Mode eingeleitet. Nachdem die START Bedingung übertragen wurde, muss die definierte Interrupt Service Routine die Slave Adresse und das Read Bit in das S1DAT Register geladen werden. Das SI Bit muss dazu vorher gelöscht werden bevor mit der weiteren Übertragung fortgefahren werden kann. Nachdem der Inhalt des S1DAT Registers übermittelt und ein Acknowledge Bit empfangen wurde, wird das SI Bit wiederholt gesetzt und eine Anzahl von Status Codes im S1STAT Register werden möglich. Es könnten die Codes 40h, 48h oder 38h für den Master Mode vorkommen oder aber auch 68h, 78h und B0h wenn der Slave Mode aktiviert wurde. Die passende Operation für den jeweiligen Code ist in der Tabelle mit der Überschrift MASTER RECEIVER MODE dem Datenbuch zu entnehmen.

Das dazu vereinfachte Statuscodeschema kann man der Abbildung 8.0 entnehmen.


Abbildung 9.0: Das Statuscodediagramm des Master Receiver Modes
ENS1, CR1 und CR0 sind nicht von der seriellen Übertragung betroffen und sind daher nicht in der Tabelle angeführt. Nach einer wiederholten START Bedingung ( Statuscode 10h ) schaltet die SIO1 Logik wieder in den Master Transmitter Mode und ladet die gewünschte Slave Adresse mit dem Write Bit in das S1DAT Register.


4.3. Der Slave Receiver Mode


Im Slave Receiver Mode werden eine Anzahl von Datenbytes vom Master Transmitter empfangen. Um den Slave Receiver Mode einzuleiten muss das S1ADR Register und das S1CON Register wie folgt konfiguriert werden:


Abbildung 10.0:
Das Adressregister in welches die eigene gewünschte Slave Adresse eingetragen werden muss



Die oberen 7 Bits stellen die Adresse, auf die die SIO1 Logik reagiert, dar. Wenn das niederwertigste Bit ( GC ) gesetzt ist reagiert die SIO1 Logik auf eine General Call Adresse, ist dies nicht der Fall wird eine General Call Adresse ignoriert.
Abbildung 11.0:
Das Control Register wie es im Slave
Receiver Mode konfiguriert werden muss




CR0,CR1 und CR2 haben keine Auswirkung auf die SIO1 Logik im Slave Mode. ENS1 muss auf logisch 1 gesetzt werden um die SIO1 Logik zu aktivieren. Anschließend muss das AA Bit gesetzt werden um die SIO1 Logik aufzufordern ein Acknowledge zurückzusenden wenn die eigene Slave Adresse oder eine General Call Adresse empfangen wurde. Die Bits STA, STO und SI müssen gelöscht werden.
Wenn die Register S1ADR und S1CON richtig eingerichtet worden sind wartet die SIO1 Logik bis die eigene Adresse und das Datenrichtungsbit mit der Wertigkeit 0 empfangen wurde. Nachdem nun die Adresse empfangen und ein Acknowledge zurückgesendet wurde, wird das serielle Interupt Flag gesetzt und der gültige Statuscode kann dem S1STAT Register entnommen werden. Dieser Statuscode wird verwendet um die entsprechende Service Routine abzurufen in der die einzelnen Handlungen ausgeführt werden. Die Tabelle der einzelnen Codes ist im Datenbuch unter der Überschrift SLAVE RECEIVER MODE zu finden. Das Statuscodeschema des Slave Receiver Modes sieht wie das folgende Diagramm zeigt so aus:


Abbildung 12.0: Das Statuscodediagramm des Slave Receiver Modes
Die SIO1 Logik schaltet auch dann in den Slave Receiver Mode wenn die Arbitration Prozedur verloren wurde.
Wenn das AA Bit während einer Übertragung gelöscht wird, wird kein Acknowledge zurückgesendet. Bleibt es weiterhin gelöscht wird ein weiterer Versuch mit der Slave Adresse oder General Call Adresse zu adressieren ignoriert. Trotzdem wird der I2C Bus weiter überwacht um die Adresserkennung jederzeit wieder mit dem AA Bit aufzunehmen. Man kann also das AA Bit dazu verwenden um die SIO1 Logik zeitweise vom I2C Bus zu trennen.

4.4. Der Slave Transmitter Mode


Im Slave Transmitter Mode werden eine Anzahl von Datenbytes an den Master Receiver übertragen. Die Datenübertragung wird wie im Slave Receiver Mode begonnen. Wenn das S1ADR und S1CON Register richtig eingestellt wurde wartet die SIO1 Logik solange bis die eigene Adresse und das Datenrichtungsbit empfangen wird. Das Datenrichtungsbit muss in dieser Funktionsart eine Wertigkeit von 1 haben. Nachdem nun die eigene Adresse und das Datenrichtungsbit empfangen wurde, wird der serielle Interrupt ausgelöst und dem S1STAT Register kann der gültige Status der SIO1 Logik entnommen werden. Dieser kann als Zeiger verwendet werden, der auf die zugehörige Interrupt Service Routine verweist, in der die passenden Operationen ausgeführt werden.
Wenn das AA Bit während eine Übertragung gelöscht wird, überträgt die SIO1 Logik noch das letzte Byte und befindet sich anschließend im Zustand C0h oder C8h. Die Logik hat in den nichtadressierten Slave Mode geschalten und ignoriert nun den Master Receiver wenn dieser die Übertragung weiterführt. Auf diese Art empfängt der Master lauter Einsen als serielle Daten. Während das AA Bit gelöscht bleibt, ignoriert die SIO1 Logik ihre eigene bzw. die General Call Adresse. Der I2C Bus wird jedoch weiterhin überwacht und die Adresserkennung kann jederzeit mit dem Setzen des AA Bit aufgenommen werden.


Der zugehörige Statuscodebaum des Slave Transmitter Modes lässt sich vereinfacht wie folgt darstellen:
Abbildung 12.0: Das Statuscodediagramm des Slave Transmitter Modes

5. Verschiedene Status Codes

Es gibt zwei verschiedene Statuscodes welche nicht auf einen bestimmten Zustand der SIO1 Logik hinweisen. Diese werden anschließend besprochen:

5.1. Der Code F8h

Dieser Code zeigt, dass keine wichtige Information verfügbar ist, da das serielle Interrupt Flag zur Zeit der Abfrage nicht gesetzt ist. Solch ein Code kann auftreten wenn man sich genau zwischen zwei Zuständen der SIO1 Logik befindet oder diese nicht an einer seriellen Übertragung beteiligt ist.

5.2. Der Code 00h

Dieser Code zeigt an, dass ein Bus Error während einer Übertragung aufgetreten ist. Dieser Error kann durch eine START oder STOP Bedingung an einer falschen Stelle im I2C Rahmen auftreten,
z.B. während der Übertragung der Adresse, eines Datenbytes oder eines Acknowledge Bits. Ein Bus Error kann genauso auftreten wenn eine externe Schnittstelle das SDA Signal stört. Wenn ein Bus Error auftritt, wird das SI Flag gesetzt. Um aus diesem erkannten Fehler zurückzukehren muss das STO Flag gesetzt und das SI Flag gelöscht werden. Dieses verursacht, dass sich die SIO1 Logik nun im nichtadressierten Zustand befindet. Die SDA und SCL Leitung wird freigegeben. Eine STOP Bedingung wurde in diesem Falle nicht übermittelt.

6. Spezielle Fälle

Die SIO1 Hardware hat spezielle Besonderheiten um folgende Fälle bearbeiten zu können die während einer serielle Übertragung auftreten könnten:

6.1. Eine gleichzeitig wiederholte START Bedingung zweier Master

Eine solch wiederholte START Bedingung kann im Master Transmitter oder Receiver Mode erzeugt werden. Ein spezieller Fall tritt dann auf, wenn ein zweiter Master gleichzeitig mit einem anderen Master eine START Bedindung erzeugt. Wenn dieser Zustand auftritt und die Arbitration von einem der beiden nicht verloren wird, übertragen beiden die Daten.
Wenn die SIO1 Logik jedoch erkennt, dass eine wiederholte START Bedingung erzeugt wird, ohne dass sie von ihr selbst generiert wurde, wird der Bus augenblicklich freigegeben. Erst wenn der andere Master eine STOP Bedingung am Bus erzeugt, wird die wiederholte START Bedingung von der SIO1 Logik generiert und es wird versucht die ganzen gewünschten Daten zu übertragen.

6.2. Datenverlust nach dem Verlieren der Arbitration Prozedur

Die Arbitration Prozedur kann im Master Transmitter und im Receiver Mode verloren werden. Den Verlust der Arbitration wird durch die Zustände 38h, 68h, 78h und B0h im S1STAT Register angezeigt.
Wenn das STA Bit im S1CON Register durch eine Routine gesetzt wurde, wird eine START Bedingung sobald der Bus frei ist ohne auf den CPU zurückzugreifen erzeugt.

6.3. Gezwungener Zugriff auf den I2C Bus

In einigen Anwendungen kann es vorkommen das eine unkontrollierte Quelle einen Zusammenbruch des Buses hervorruft. In solchen Fällen kann das Problem durch Störungen, zeitweisen Unterbrechungen des Buses oder durch zeitweise Kurzschlüsse zwischen der SDA und SCL verursacht werden.
Wenn solch eine unkontrollierte Quelle eine überflüssige START Bedingung oder eine STOP Bedingung vorgibt, bleibt der I2C Bus in einem undefinierten Zustand aktiv. Wenn das STA Bit gesetzt ist und ein Zugriff auf den Bus in einer gewissen Zeit nicht möglich ist kann nun ein gezwungener Zugriff auf den Bus erfolgen. Dies wird eingeleitet in dem das STO Bit gesetzt wird während das STA Bit gesetzt bleibt. Es wird keine STOP Bedingung am Bus erzeugt, einzig und allein die SIO1 Logik glaubt nun eine empfangene STOP Bedingung zu erkennen und kann nun eine START Bedingung am Bus erzeugen. Das STO Bit wird durch die Hardware gelöscht.

6.4. Der I2C Bus ist durch ein LOW auf der SDA oder SCL Leitung blockiert

Ein I2C Bus Absturz tritt dann auf wenn ein Gerät am Bus die SDA oder SCL Leitung gegen Low zieht. Wird die SCL Leitung gegen Low gezogen ist eine Datenübertragung nicht mehr möglich und die SIO1 Logik kann dieses Problem nicht beheben. Einzig und allein das Gerät welches diesen Fehler hervorruft kann diesen auch wieder beheben.
Wenn die SDA Leitung von dem Problem betroffen ist, kann es durch ein weitersenden von Taktimpulsen auf der SCL Leitung behoben werden. Dies wird erreicht wenn das STA Bit gesetzt ist aber eine Erzeugung einer START Bedingung nicht möglich ist da ja die SDA Leitung auf Low gezogen bleibt. Die SIO1 Logik geht dazu über, nach jeden zwei zusätzlichen Taktimpulsen eine START Bedingung zu senden. Wenn nun die SDA eventuell in den Normalzustand übergeführt wird, wird anschließend sofort eine START Bedingung übertragen und die Datenübertragung kann fortgesetzt werden.
Bei einem gezwungenen Zugriff auf den Bus oder bei einer wiederholten START Bedingung während die SDA Leitung auf LOW gezogen wird ebenfalls nach dem soeben genannten Prinzip vorgegangen.

6.5. Ein Bus Fehler

Ein Bus Fehler tritt dann auf wenn eine START oder STOP Bedingung zu einem falschen Zeitpunkt im I2C Bus Übertragungsprotokoll gesendet wird. Die SIO1 Logik reagiert auf einen Bus Fehler nur wenn dieser gerade bei einer Übertragung auftritt. Sie schaltet automatisch in den nichtadressierten Slave Mode, gibt die SDA und SCL Leitung frei und schreibt 00h in das Status Register. Dieser Code kann als Zeiger auf eine Service Routine verwendet werden die entweder erneut eine Datenübertragung zu starten versucht oder einfach aus dem Fehlerzustand zurückkommt.

7. Literaturverzeichnis


DATA HANDBOOK 80C51 based 8 - bit Microcontrollers Philips
Die Codebäume der Statuscodes für den Master Transmitter, den Master Receiver, den Slave Transmitter und dem Slave Receiver Mode, sind dem Referat von Christian Schmutzer und Bruno Kutschera vom 9.3.1996 entnommen und sind zur Gänze aus den Entwürfen von Prof. W. Guggenberg nachempfunden.

5675 Worte in "deutsch"  als "hilfreich"  bewertet