erstellt 10.03.2009
|
Der I2C Bus |
Der
I2C - Bus ( Inter Integrated Circuit ) wurde 1979 ursprünglich von
der Firma Phillips entwickelt und hauptsächlich in Fernseher
eingesetzt um eine
Datenverbindung innerhalb der Geräte zu
ermöglichen z.B. für die IR Übertragung in Stereo
Anlagen , Fernseher usw. |
Bei
Atmel wird ein Datenbus verwendet welcher unter dem Namen TWI
läuft aber weitgehend mit der I2C Spezifikation überein
stimmt.
Möglicherweise wurde er aus Gründen des Urheberrechts
anders benannt.
Es gibt andere und auch schnellere Bussysteme die aber
entweder mehr Software oder mehr Hardware Aufwand benötigen .
Der I2C ist ein Serielles Bussystem bei dem die Daten hintereinander
und nicht zeitgleich übertragen werden. |
Software I2C |
Die
Softwareversion der I2C-Implementierung kann auf allen AVR programmiert
werden, man kann sich die Ports auf denen Data (SDA) und Clock (SCL)
angeschlossen werden selbst aussuchen.
Standardmäßig
wird von Bascom die Software-Version verwendet um auf den I2C-Bus
zuzugreifen, d.H. die einzelnen Bits der zu übertragenden Daten
werden
per Software auf High- oder Low-Pegel an den Ports ausgegeben.
Der AVR kann in dieser Zeit keine anderen Aufgaben erledigen. |
Hardware TWI |
AVR
Controller die I2C hardwaremäßig unterstützen haben
das TWI-Modul, die Ports für Data und Clock sind dabei vorgegeben.
TWI ist bei den meisten ATMegas vorhanden, z.B. dem ATMega32 un d Atmega 8.
Damit Bascom das TWI-Modul verwendet muss die I2C_twi.lib (bzw. .lbx,
bei der Bascom-Demo) eingebunden werden, ansonsten ist bis auf die
Initialisierung,
alles genauso wie bei Software-I2C. Bei Verwendung der
Bascom-I2C-Befehle macht es Performancemäßig keinen
großen Unterschied, ob man Software-I2C
oder TWI verwendet, denn
bei beiden Versionen wird solange darauf gewartet, bis das Byte
über den Bus gesendet ist, und ein ACK oder NACK empfangen ist.
Der Vorteil von TWI ist aber, das es in Multimasterumgebungen besser
verträglich ist (z.B. I2CStart).
Gibt es nur einen Master, kann
man sich für eine der beiden Versionen entscheiden. |
TWI oder I2C ? |
Kleinere
AVR Controller, die zwar kein TWI-Modul haben aber I2C
hardwaremäßig Unterstützen haben das USI-Modul, die
Ports für Data und Clock sind dabei vorgegeben.
USI ist bei den
meisten ATTinys und einigen ATMegas vorhanden, z.B. dem ATTiny2313.
Das
USI-Modul kann evtl. als eine Art von TWI-Light angesehen werden, denn
es ist nicht so komfortabel wie TWI,es muss intern noch viel in
Software erledigt werden,
weshalb es Performancemäßig auch
keinen großen Unterschied macht ob man Software-I2C oder USI
beim Master verwendet. |
Das Besondere an dem I2C |
Bus
ist sein lammfrommes Zeitverhalten. Es ist gleichgültig wann ein
Befehl über die Leitung geschickt wird (natürlich muß
die richtige Reihenfolge der SDA und
SCL - Impulse eingehalten
werden).
Doch ob der Befehl „Daten lesen“ eine halbe Stunde
nach dem „Start“ - Befehl gegeben wird, ist für den
Bus irrelevant.
Dieses zeichnet ihn für den Einsatz eines kleinen
Microprozessors so besonders aus denn als Programmierer muß man
sich keine Gedanken darüber machen,
ob der Chip irgendwo etwas
anderes abarbeitet und damit evtl. ein Timingproblem aufwirft. |
Wohlgemerkt,
der Bus ist kein Geschwindigkeitsweltmeister , er kann normalerweise im
100 Kilohertzbereich, die neueren Chips im 400 Khz - Bereich, getaktet
werden.
Das erreicht man natürlich mit dem Basiccompiler niemals
(ein Assemblerprogramm könnten hier ein Vielfaches an
Geschwindigkeit herausholen).
Läßt man den Prozessor
ungebremst den I2C-Bus bedienen und hat man Leuchtdioden an den
Ausgängen angescchlossen, so kann man das Blinken der Dioden
(im
Zufallsbetrieb) noch gut mit den Augen beobachten.Doch im Mess- Steuer-
Regelprojekt hat man normalerweise keine allzugroßen
Geschwindigkeitsprobleme. |
Adressen |
Jeder
Chip ( A/D Wandler, EEPROM, ein DTMF-Chip usw) hat eine 4 Bit
große Baustein-Adresse. z..Beispiel das EEprom 24C64, der immer
die Systemadresse 1010yyyx
innerhalb eines Bytes hat, was
gleichbedeutend mit der Grundadresse hex A0 oder dezimal 160 ist.
Also
immer dann, wenn nach der Startkondition in dem gesendeten Byte die 160
enthalten ist, werden die EEprom's angesprochen .
Danach kommen 3 Bits
(oben als yyy bezeichnet), die die Adresse des speziell angesprochenen
Chips in der EEprom Gruppe bezeichnen. Was bedeutet das?
Die drei Bits
können bekanntlich 8 duale Zustände haben. 000=0 , 001=1,
010=2, 011=3, 100=4, 101=5, 110=6, 111=7.
Damit lassen sich also 8
verschiedene EEproms anspechen
Dann gibt es noch das Bit X .
Da die Ports ja bidirektional aufgebaut sind (was sehr vorteilhaft
ist), muß man die Absicht (lesen oder schreiben) dem EEprom
mitteilen. Eine x=1 bedeutet lesen, eine x=0 bedeutet schreiben. |
Paxis |
In
der Praxis bedeutet das, dasss wir ersteinmal beispielsweise bei einem
EEprom 24C128 eine Adresse einstellen müssen ,mit der das Bauteil
(EEprom) eindeutig angesprochen werden kann. |
|
Diese
Adresse werden wir Hardwaremäßig festsetzten , indem wir die
folgenden Adressanschlüsse am EEprom auf Masse legen ,(Bit 1 = PIN
1) , ( Bit 2 =Pin 2) , (Bit 3 =Pin 3) Bedeutet also Bit 1,2 und 3 auf Null . |
|
Dann haben wir noch die Device Adresse, praktisch die von der Art des Bautels Abhängige Adresse beim EEprom folgende Bit 7, 6, 5, 4,ist sie 1010 , bei einem I/O Expander ( praktisch eine Porterweiterung z.B mit dem Baustein PCF 8574 ist die Adresse wie folgt : 0100 |
|
Dann haben wir noch das Bit 0 welches auskunft darüber gibt ob gelesen oder geschrieben werden soll. Beim EEprom ist das Pin7
Somit ergibt sich folgende Adresse 01010001 als Hex A1 als Dezimal 161 zum auslesen des Eeprom
und folgende Adresse 10100000 als Hex A0 als Dezimal 160 zum beschreiben des Eeprom
Damit ist nun ein spezieller Chip angesprochen; . Hierbei erkennt man
auch, warum der Bus nicht so super schnell sein kann.
Denn bisher haben
wir bereits ein Byte gesendet, ohne etwas bewirkt zu haben. Noch sind
keine Daten geschrieben oder gelesen.
Dieses folgt jetzt - allerdings muß der Prozessor noch eine
Bestätigung des Chips abfragen, das sogenannte Acknowledge.
Geht
nämlich nach Versenden des obigen Bytes die Datenleitung auf high
(wir werden das später noch genauer sehen), so setzt der Chip
selbst diese
Datenleitung auf low.
Dieses kann man mit dem Prozessor
abfragen und man weiß dann, daß der angesprochene Chip das
Byte kapiert hat.
Im Beispielprogramm finden Sie nachher die Zeile wait
not data. Hier wird solange in der Abarbeitung des Programmes
innegehalten, bis
die Dataleitung vom Chip auf low gesetzt wurde. Dieses geschieht jedoch
sehr fix, ist aber wieder ein kleiner Geschwindigkeitshemmschuh.
Ok, das Acknowledge wurde vom Chip gegeben und nun kann ich die gewünschte Information als Byte versenden.
| Vorteil |
Der I2C Bus kommt mit nur zwei Datenleitungen und eine Masseleitung
aus. und belegt somit am Mikrocontroller gerade einmal 2
Ein/Ausgänge.
|
| Nachteil | Der
I2C ist nicht besonders schnell, und kann maximal 4 Meter
Übertragungsweg überbrücken, wenn keine
zusätzlichen Maßnahmen getroffen werden.
|
| Allgemeines | Der
ATmega 8 besitzt ein Two-Wire Serial Interface. Diese Schnittstelle ist
äquivalent zum I2C-Bus, der, wie Two Wire schon sagt, mit nur zwei
Leitungen auskommt.
Dieser Bus ist ein serieller Datenbus, der um
1980 von Philips entwickelt wurde, um in Geräten wie Fernsehern
mehrere ICs an Mikroprozessoren anschließen
zu können ohne
breite Adress- und Datenleitungen zu benötigen. Daher kommt auch
die Bezeichnung I2C, was eine Abkürzung für Inter IC ist.
Gemeint ist damit, dass der Bus für Verbindungen zwischen ICs
gedacht ist.
Der Bus hat in der aktuellen I2C-Spezifikation 2.1 von 2001 eine
maximale Datenübertragungsrate von 3,4 Mbit/s (High-Speed Modus),
jedoch ist der ATmega 16 ein Fast-Mode Gerät, daher können
nur Übertragungsraten von maximal 400 kbit/s verwendet werden. | Eigenschaften | Der
groÿe Vorteil des Busses ist, dass man mit nur zwei Leitungen
viele ICs miteinander verbinden kann.
Dazu kommt, dass während
einer Datenübertragung der Takt automatisch von den beteiligten
Geräten angepasst werden kann,
falls eines der Geräte mehr
Zeit zur Verarbeitung der Daten benötigt.
Es ist
außerdem ein Arbitrationsverfahren vorgesehen.
Dieses Verfahren
sorgt dafür, dass nur ein Gerät erfolgreich Daten auf den Bus
schreiben kann, wenn mehrere Geräte gleichzeitig versuchen eine
Verbindung
auf dem Bus zu initiieren.
Zur Adressierung der am Bus
angeschlossenen Geräte stehen wahlweise 7-bit oder 10-bit
Adressierung und damit 112 bzw. 1024 Adressen zur Verfügung.
Dadurch, dass es so wenig Adressen gibt, jedoch die Auswahl an ICs mit
I2CAnsteuerung groß ist, kommt dazu, dass verschiedenen
Geräten desselben Typs
dieselbe Adresse zugewiesen wird.
Problematisch kann dies werden, wenn man beispielsweise mehrere
serielle EEPROMs am Bus betreiben möchte, zumal manche
I2C-fähigen EEPROMs gleich
8 Adressen belegen, wodurch bei 7-bit
Adressierung nur ein einziges EEPROM am Bus betrieben werden kann.
Generell können durch die in der Spezifikation festgelegte
maximale Leitungskapazität von 400pF ca. 20 Geräte an einem
Bus betrieben werden,
alternativ können die Leitungen ca. 10 m
lang sein. Durch I2C Repeater o. Ä. kann diese Beschränkung
jedoch umgangen werden. | Einsatzgebiete | Der
I2C-Bus wird eingesetzt in Geräten wie zum Beispiel Fernsehern,
Telefonen und Waschmaschinen. Es gibt Chipkarten, die über I2C
angesprochen
werden und auch im Computerbereich wird der Bus eingesetzt,
beispielsweise auf Mainboards in Form des SMBus, der auf dem I2C-Bus
basiert.
In Monitorkabeln wird der DDC verwendet, der ebenfalls auf dem
I2C-Bus basiert und der Grafikkarte erlaubt, Informationen mit einem
Monitor auszutauschen.
ICs, die man in I2C-Bussen verwenden kann sind u. a.
• EEPROMs
• Portexpander
• LCD-Displays
• Treiber
• AD-, bzw. DA-Wandler
• Sensoren | Ablauf einer Verbindung | SCL und SDA
Der I2C-Bus verwendet zwei Leitungen zur Datenübertragung, dabei
ist eine der beiden Leitungen eine Datenleitung, während die
andere Leitung
eine Taktleitung ist.
Entsprechend werden die Leitungen
SDA für Serial DAta bzw SCL für Serial CLock genannt.
Beide
Leitungen sind laut Spezifikation mit Pullups auf High-Level zu halten;
die SDA- und SCL-Pins der angeschlossenen ICs sind Open-Drain bzw.
Open-Collector. Daher muss ein am Bus angeschlossener IC um eine 1 zu
senden die Leitung loslassen und um eine 0 zu senden die Leitung auf
Masse ziehen.
Es ergibt sich dadurch eine Wired-And Funktion der
Busleitungen.
START- und STOP-Condition
Der Bus ist so ausgelegt, dass ein Busteilnehmer eine Verbindung zu
einem anderen Busteilnehmer initiiert und nachher die Verbindung
beendet oder eine weitere Verbindung aufbaut.
Während einer
Verbindung dürfen andere Busteilnehmer nicht auf den Bus
zugreifen.
Damit die am Bus angeschlossenen Geräte erkennen
können, ob der Bus frei oder belegt ist, werden START- und
STOPConditions verwendet, die Anfang und Ende einer Verbindung
kennzeichnen.
Eine START-Condition wird ausgelöst durch einen High-Low
Übergang auf SDA, während SCL High ist und eine
STOP-Condition wird umgekehrt ausgelöst durch einen Low-High
Übergang auf SDA, während SCL High ist. Außer beim
Auslösen von START- bzw. STOP-Conditions darf sich SDA
während der High-Phase von SCL jedoch nicht verändern. | Master und Slave, Transmitter und Receiver | Die
Busteilnehmer können jeweils Master oder Slave, Transmitter oder
Receiver sein. Bei einer Verbindung zwischen zwei Busteilnehmern ist
jeweils eines der Geräte Master bzw. Slave; gleichermaÿen ist
jeweils eines der Geräte Transmitter oder Receiver.
Dabei
ist der Master dafür zuständig, die Verbindung zu einem
Slave-Gerät zu initiieren und zu beenden, sowie den Takt auf der
SCL-Leitung bereitzustellen.
Außerdem bestimmt der Master die Datenrichtung der Verbindung, d.
h. welches der beiden Geräte Receiver und welches Transmitter ist.
Ein Gerät, das die Rolle eines Slave einnimmt, spricht auf eine
Verbindungsanfrage eines Masters an, wenn es die eigene
Geräteadresse empfängt. Es reagiert dann abhängig von
der Datenrichtung mit dem Senden, bzw. Empfangen von Daten.
Zusätzlich hat der Slave die Möglichkeit, die Taktrate auf
der SCLLeitung herabzusetzen, wenn diese zu schnell ist um die
empfangenen bzw zu sendenden Daten abzuarbeiten.
Der Transmitter ist das Gerät, das nach erfolgreichem
Verbindungsaufbau Daten auf den Bus legt und der Receiver ist das
Gerät, das die vom Transmitter gesendeten Daten empfängt.
Beispiel:
Wenn ein Mikrocontroller einen Wert von einem Temperatursensor liest,
so ist der Mikrocontroller ein Master Receiver (denn er initiiert die
Verbindung zum Sensor und empfängt dessen Daten), während der
Sensor ein Slave Transmitter ist (denn er wird adressiert und sendet
Daten). | Jede
Verbindung auf dem I2C-Bus beginnt damit, dass ein Master eine
START-Sequenz sendet. Sobald die START-Sequenz übertragen wurde,
sendet der Master die 7-bittige Adresse des Slave-Geräts mit dem
Datenrichtungsbit (R/¯W ). Wenn der Slave mit der passenden
Adresse am Bus angeschlossen ist, so wird er zum nächsten SCL-High
die SDA-Leitung auf Low ziehen und somit das ACK-Bit setzen. Wenn sich
jedoch kein Slave meldet, bleibt SDA auf High und es wird somit ein
NACK-Bit gesetzt. In dem Fall eines NACK hat der Master die Wahl,
entweder. eine STOP-Sequenz zu senden um den Bus wieder freizugeben,
oder eine wiederholte START-Sequenz zu senden um einen anderen Slave zu
adressieren.
Sofern ein ACK empfangen wurde, sendet der
Transmitter eines oder mehrere Datenbytes, die vom Receiver jeweils mit
ACK oder mit NACK bestätigt werden. Wenn der Receiver nach dem
Empfang eines Datenbytes mit NACK antwortet, so ist dies für den
Transmitter das Zeichen, dass der Receiver keine weiteren Bytes mehr
benötigt. Nach jedem ACK oder NACK hat der Master die
Möglichkeit, die Übertragung
mit einer STOP-Sequenz zu beenden oder mit einer wiederholten
START-Sequenz eine neue Übertragung mit neuer Slave-Adresse und
Datenrichtung zu beginnen. | Beispiel: Ein Mikrocontroller liest zwei Datenbytes ab einer bestimmten Speicheradresse von einem EEPROMs
• Der Mikrocontroller (der hier als Master arbeitet) sendet eine
START-Sequenz und anschlieÿend die Adresse des EEPROMs und das
Schreibbit
(1010xxx0).
• Das EEPROM bestätigt mit ACK, dass es seine Adresse empfangen hat und bereit ist, Daten zu empfangen.
• Der Mikrocontroller sendet die Speicheradresse und das EEPROM bestätigt den Empfang mit ACK.
• Der Mikrocontroller sendet eine wiederholte START-Sequenz und
die Adresse des EEPROMs, allerdings diesmal mit einem Lesebit (1010xxx1)
um die Datenrichtung umzukehren, also um nun vom EEPROM zu lesen.
• Das EEPROM sendet ein Datenbyte und Mikrocontroller antwortet mit ACK.
• Das EEPROM sendet ein weiteres Datenbyte und Mikrocontroller
antwortet diesmal mit NACK, um dem EEPROM mitzuteilen, dass es keine
weiteren Datenbytes senden soll.
• Der Mikrocontroller sendet eine STOP-Sequenz. | Adressierung | Beim I2C-Bus gibt es 2 verschiedene Arten der Adressierung: Die 7-Bit Adressierung und die 10-Bit Adressierung.
Bei der 7-Bit Adressierung wird nach einer START-Sequenz eine Adresse
mit 7 Bits, sowie ein Datenrichtungsbit übertragen. Die drei
niedrigstwertigen Bits sind dabei meist am jeweiligen IC einstellbar
(z. B. durch Adresspins am IC). Zwei Adressbereiche von jeweils 8
Adressen (1111XXX und 0000XXX) sind jedoch reserviert. Die folgende
Tabelle aus der I2C-Spezifkation beschreibt, wofür die
reservierten Adressen verwendet werden. | | Da
mit der 7-Bit Adressierung nur 112 verschiedene Adressen möglich
sind, wurde in der I2C-Spezifkation 1.0 von 1992 die 10-Bit
Adressierung eingeführt. Dadurch sind 1024 weitere Adressen
verfügbar. Die 10-Bit Adressierung funktioniert dadurch, dass nach
der START-Sequenz erst eine spezielle 7-Bit Adresse (11110XX) mit einem
Schreibbit (0) übertragen wird, wobei die beiden niedrigstwertigen
Bits dieser 7-Bit Adresse die beiden höchstwertigen Bits der
10-Bit Adresse sind. Weil die 7-Bit Adresse zu den reservierten
Adressen gehört, wird kein Gerät darauf antworten, das nur
7-Bit Adressierung versteht, sondern ausschlieÿlich Geräte,
die eine 10-Bit Adresse haben, deren beiden höchstwertigen Bits
den beiden niederwertigsten Bits der 7-Bit Adresse entsprechen. Nachdem
ein Slave auf die Adresse geantwortet hat, kann nun der Master ein
weiteres Datenbyte übertragen, das nun die nächsten 8 Bit der
Adresse enthält. Wenn auf diese Adresse ein Slave mit einem ACK
antwortet, so kann der Master anfangen Daten zu senden.
Sollte
der Master allerdings Daten vom Slave lesen, so muss er eine
wiederholte START-Sequenz auslösen und wieder die 7-Bit Adresse
senden, allerdings diesmal mit einem Lesebit (11110XX1). Dadurch
erkennt der zuvor adressierte Slave, dass er als Slave-Transmitter
funktionieren soll und fängt an, Daten zu senden.
| |
Aktualisiert 21.05.2018
|
Copyright by Ms 2009
|
|