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