I²C-Bus-Dokumentation
Slave-Receiver
Aufgabenstellung
Unser Projekt sollte darin bestehen, einen I²C-Bus Slave-Receiver als XILINX-Schaltung zu realisieren. Hr. Prof. Guggenberg hatte jedoch bald die Idee, daß es praktisch wäre, einen Slave-Receiver als Software-Programm für den Mikroprozessor zu erstellen. So wurde unsere Aufgabe in zwei Teile unterteilt, zuerst die softwaremäßige und anschließend die hardwaremäßige Realisierung des I²C-Bus-Bausteins.
Projektablauf
Anfänglich mußten wir uns in die Grundlagen des I²C-Bus einarbeiten. Während dieser Zeit wurden auch einige andere Aufgaben, wie die Fertigstellung unseres Vorjahresprojekts oder die Programmierung einiger WSI-Chips für das Heinrich-Clausen-µP-Board, erledigt. Anschließend entstanden erste Programmteile, z.B. die Erkennung der Startbedingung, Adresserkennung, usw. Am Ende des ersten Semesters war ein Programm entstanden, bei dem eine I²C-Bus Übertragung softwaremäßig möglich war (hierfür wurde ein "Software-Master" programmiert). Dieses Programm war jedoch nicht zu verwenden, da es die I²C-Bus Spezifikationen nicht einhielt. Der größte Teil des zweiten Semesters wurde dafür verwendet, das Programm so umzuarbeiten, daß ein "Hardware-Master" damit kommunizieren konnte (Einhaltung der Spezifikationen!). Somit entstand ein komplett überarbeitetes Programm, daß bis jetzt ohne Fehler funktioniert und bereits von anderen Klassen verwendet wird. Christian Steinbrecher kümmerte sich ebenfalls um eine 19"-Konstruktion, auf der ein fix verdrahteter I²C-Bus aufgebaut wurde. Ein Teil besteht aus einem Hardware-Master-Transmitter und einem Software-Salve-Receiver, der andere aus einem Hardware-Master-Receiver und einem Software-Slave-Transmitter, also zwei Specon- und zwei Heinrich-Clausen-Boards. Zusätzlich wurde ein Hardware-Slave-IC montiert. Das zweite Problem, die XILINX-Schaltung, wurde anhand eines Zustandsdiagramms (nach mehrmaligem Drängen von Hrn. Prof. Guggenberg) gelöst. Dort wurden die Zustände an der SCL- bzw. SDA-Leitung eingetragen und benötigte Signale hinzugefügt. So entstand eine Schaltung die mit VIEWLOGIC gezeichnet wurde und nun nur noch in das Programm XACT übernommen werden muß, sodaß ein XILINX-Baustein der 3000er Serie programmiert werden kann. Dies ist unsere letzte Aufgabe, somit wird unser Projekt wahrscheinlich rechtzeitig und erfolgreich abgeschlossen werden.
Nähere Informationen zu den einzelnen Projekttagen sind dem Projekttagebuch zu entnehmen.
Prinzipielle Überlegungen (Flussdiagramm)
Impulsdiagramme + Spezifikationen
Timing-Spezifikationen
Parameter |
Symbol |
min. |
Max. |
Einheit |
SCL Taktfrequenz SCL-clockfrequency |
fSCL |
|
100 |
kHz |
Zeit in der Bus frei bis wieder Übertragung starten kann Bus free time |
tBUF |
4,7 |
- |
µs |
Haltezeit nach Startbedingung (Zeit bis erster Takt generiert wird) Start condition hold time |
tHD;STA |
4,0 |
- |
µs |
LOW-Periode des Taktes SCL-LOW period |
tLOW |
4,7 |
- |
µs |
HIGH-Periode des Taktes SCL-HIGH period |
tHIGH |
4,0 |
- |
µs |
Zeitdifferenz zwischen SCL->HIGH u. Startbed. (bei Repeated Start -Bedingung) Start condition set-up time |
tSU:STA |
|
|
µs |
Haltezeit der gültigen Daten nach SCL-Impuls (für C-Bus kompatible Master Data hold time |
tHD:DAT |
0 5 |
- - |
µs µs) |
Vorhaltezeit der gütigen Daten vor SCL-Impuls Data set-up time |
tSU:DAT |
250 |
- |
ns |
Anstiegszeit (SDA und SCL-Flanken) Rise time |
tR |
- |
1 |
µs |
Abfallszeit (SDA und SCL-Flanken) Fall time |
tF |
- |
300 |
ns |
Zeitdifferenz zwischen SCL->HIGH u. Stopbed. Stop condition set-up time |
tSU:STO |
|
|
µs |
START-Bedingung
Kurze Erklärung
START: Clock - Leitung HIGH Datenleitung wechselt von HIGH auf LOW
START Bedingung wird immer vom Master generiert.
An den Bus angeschlossenen ICs (gewisse Geräte) können die START Bedingung leicht erkennen, weil sie das richtige Interface besitzen.
Mikrocomputer ohne ein solches Interface müssen die Datenleitung zwei mal pro Periode abtasten, um den Übergang zu erkennen.
Spezifikationen
tBUF min 4,7µs . BUS FREE TIME Zeit , die der Bus frei sein muß, bevor wieder eine
Übertragung gestartet werden kann
tHD;STA min 4,0µs . START CONDITION HOLD TIME Haltezeit nach Startbedingung (Zeit bis
erster Takt generiert wird)
LOW und HIGH Zustände - Mastertakt
Kurze allgemeine Erklärung
Der Takt beim I²C-Bus hat eine minimale LOW-Periode von 4,7µs und eine minimale HIGH-Periode von 4µs. In diesem Mode kann ein Master einen Takt mit einer Frequenz von bis zu fmax=100kHz erzeugen.
Alle an den Bus angeschlossenen Geräte müssen aber in der Lage sein, diese Frequenz zu verarbeiten - gegebenenfalls muß der Takt synchronisiert werden d.h. der Master wird in einen WAIT STATE gebracht. Dadurch wird die LOW-Periode ausgedehnt. Daraus ergibt sich natürlich eine Verminderung der Frequenz.
Spezifikationen
tLOW min 4,7µs . SCL-LOW period LOW-Periode des Taktes
tHIGH min 4,0µs . SCL-HIGH period HIGH-Periode des Taktes
Zeitspezifikationen bei Datentransfer
Allgemein
Daten dürfen nur während der LOW-Periode des Taktes geändert werden (ausgenommen START- und STOP-Bedingungen).
Spezifikationen
tLOW min 4,7µs . SCL-LOW period LOW-Periode des Taktes
tHIGH min 4,0µs . SCL-HIGH period HIGH-Periode des Taktes
tHD;DAT 0µs . DATA HOLD TIME Haltezeit der gültigen Daten nach einer
(negativen) SCL-Flanke
( 5µs . DATA HOLD TIME Haltezeit der gültigen Daten nach einer
(negativen) SCL-Flanke für C kompatible Master )
tSU;DAT min 250ns . DATA SET-UP TIME Vorhaltezeit der gültigen Daten vor einer
(positiven) SCL-Flanke
STOP Bedingung
Kurze Erklärung
STOP: Clock - Leitung HIGH Datenleitung wechselt von LOW auf HIGH
STOP Bedingung wird immer vom Master generiert.
Auch hier gilt: An den Bus angeschlossenen ICs können die STOP Bedingung leicht erkennen, weil sie das richtige Interface besitzen. Mikrocomputer ohne ein solches Interface müssen die Datenleitung zwei mal pro Periode abtasten, um den Übergang zu erkennen.
Spezifikationen
tSU;STO min 4,7µs . STOP CONDITION SET-UP TIME Zeitdifferenz zwischen positiver Flanke
SCL und der STOP-Bedingung
RISE- und FALL - TIME
Spezifikationen
tR max. 1µs . RISE TIME Anstiegszeiten für SDA- und SCL-Flanken
tF max. 300ns . FALL TIME Abfallzeiten für SDA- und SCL-Flanken
Repeated start
Spezifikationen
tSU;STA min. 4,7µs . SCL HIGH Zeitdifferenz zwischen der (positiven) Flanke des
Taktes und der Startbedingung (Repeated Start
Bedingung !)
Programm:
;############### I2C Slave ###################
;### Christoph Auer,Christian Steinbrecher ###
;############### 5HNA 1997/98 ################
;############## Zuweisungen ##################
hauptpr code 8100h
unter code 8200h
charout code 3000h
binout code 301eh
binbit code 3018h
charin code 302ah
cursor equ 59h
home equ 48h
erase equ 4Ah
esc equ 1Bh
left equ 44h
down equ 42h
auer equ 10000000b ;Adresse des Slave-Receivers
enter equ 3003h
dat bit 01b
sda bit p1.7 ;Port für die softwaresimulierte SDA-Leitung
scl bit p1.6 ; -'- SCL-Leitung
;############# Startbedingung ################
org hauptpr
haupt: jnb scl,haupt ;SCL=HIGH
X1: jnb sda,haupt ;SDA=HIGH
anf: jnb scl,haupt ;SCL immer noch HIGH
jb sda,anf ;SDA HIGH->LOW Übergang
mov R1,#00h ;R1 'leeren'
mov R2,#00h ;R2 'leeren'
mov R3,#8h ;R3 für 8 Durchläufe setzen (1byte)
;############## Adressabfrage ################
X2: setb scl ;SCL freigeben
X3: jnb scl,x3 ;positive Clockflanke zur Datenübernahme
X4: mov c,sda ;Daten übernehmen
nop ;minimale HIGH-Zeit=4µs
clr scl ;Clock auf LOW ziehen ('Master bremsen')
mov A,R2 ;gesicherten Akku laden
rlc A ;Daten (Carry-Bit) bitweise (MSBLSB) in den
;Akku schreiben (rotieren)
mov R2,A ;Akku (Daten) sichern
djnz r3, x2 ;8x wiederholen (8bit=1byte)
X5: mov R4,#auer ;lädt eigene Adresse in R4
mov A,R2 ;gesicherten Akku laden
subb A,R4 ;vergleicht die angelegten Daten=Adresse mit der
;eigenen Adresse
jnz haupt ;bei Übereinstimmung weiter, wenn nicht warten auf neue
;Startbedingung
;############### Acknowledge #################
ack: clr sda ;Daten auf LOW ziehen
setb scl ;Takt freigeben
ack11: jnb scl,ack11 ;warten bis Clock auf HIGH (Acknowledge Bit: Daten=LOW
;während SCL-HIGH-Phase)
ack12: jb scl,ack12 ;halten der Datenleitung auf LOW bis Clockleitung LOW
setb sda ;Datenleitung freigeben
;############### Datenempfang ################
empfang: mov R3,#8h ;R3 für 8 Durchläufe setzen (1byte)
mov R1,#0h ;R1 'leeren'
mov R4,#2h ;Stopbedingung 2x abtasten
X6: setb scl ;SCL freigeben
X7: jnb scl,x7 ;postive Taktflanke (SCL LOW->HIGH) zur Datenübernahme
X8: mov c,sda ;Daten übernehmen
jb sda,x98 ;wenn sda=HIGH, dann sicher keine Stop-Bed.
x99: jnb scl,x98 ;scl=HIGH
jb sda,haupt ;sda:low->high
djnz R4,x99 ;2x abtasten
x98: clr scl ;Clock auf LOW ziehen ('Master bremsen')
mov A,R1 ;gesicherten Akku laden
rlc A ;Daten (Carry-Bit) bitweise (MSBLSB) in den Akku
;schreiben (rotieren)
mov R1,A ;Akku (Daten) sichern
djnz R3,X6 ;8x wiederholen (1byte)
mov A,R1 ;gesicherten Akku laden
call charout ;Ausgabe am Bildschirm
;############### Acknowledge #################
ack2: clr sda ;Daten auf LOW ziehen
setb scl ;Takt freigeben
ack21: jnb scl,ack21 ;warten bis Clock auf HIGH (Acknowledge Bit: Daten=LOW
;während SCL-HIGH-Phase)
ack22: jb scl,ack22 ;halten der Datenleitung auf LOW bis Clockleitung LOW
setb sda ;Datenleitung freigeben
jmp empfang ;Sprung zur Empfangsroutine=Warten auf neue Daten
end
TIMING-DIAGRAMM:
|
|
|
|
|
|
|
|
|
|
|
Programm |
|
|
|
|
Zeit/Befehl |
SDA |
|
SCL |
|
|
|
|
|
|
|
|
|||||
;############# Startbedingung ################ |
|
|
|
|
|
|||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
org |
hauptpr |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
haupt: |
jnb |
scl,haupt |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X1: |
jnb |
sda,haupt |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
anf: |
jnb |
scl,haupt |
|
|
2µs |
|
|
|
|
|
|
jb |
sda,anf |
|
|
2µs |
|
|
|
|
|
|
mov |
R1,#00h |
|
|
1µs |
|
|
|
|
|
|
mov |
R2,#00h |
|
|
1µs |
|
|
|
|
|
|
mov |
R3,#8h |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
;############## Adressabfrage ################ |
|
|
|
|
|
|||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
X2: |
setb |
scl |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X3: |
jnb |
scl,x3 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X4: |
mov |
c,sda |
|
|
1µs |
|
|
|
|
|
|
nop |
|
|
|
1µs |
|
|
|
|
|
|
clr |
scl |
|
|
1µs |
|
|
|
|
|
|
mov |
A,R2 |
|
|
1µs |
|
|
|
|
|
|
rlc |
A |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
R2,A |
|
|
1µs |
|
|
|
|
|
|
djnz |
r3, x2 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X5: |
mov |
R4,#auer |
|
|
1µs |
|
|
|
|
|
|
mov |
A,R2 |
|
|
1µs |
|
|
|
|
|
|
subb |
A,R4 |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jnz |
haupt |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
;############### Acknowledge ################ |
|
|
|
|
|
|||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
ack: |
clr |
sda |
|
|
1µs |
|
|
|
|
|
|
setb |
scl |
|
|
1µs |
|
|
|
|
|
ack11: |
jnb |
scl,ack11 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ack12: |
jb |
scl,ack12 |
|
|
2µs |
|
|
|
|
|
|
setb |
sda |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
;############### Datenempfang ############### |
|
|
|
|
|
|||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
empfang: |
mov |
R3,#8h |
|
|
1µs |
|
|
|
|
|
|
mov |
R1,#0h |
|
|
1µs |
|
|
|
|
|
|
mov |
R4,#2h |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X6: |
setb |
scl |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X7: |
jnb |
scl,x7 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X8: |
mov |
c,sda |
|
|
1µs |
|
|
|
|
|
|
jb |
sda,x98 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x99: |
jnb |
scl,x98 |
|
|
2µs |
|
|
|
|
|
|
jb |
sda,haupt |
|
|
2µs |
|
|
|
|
|
|
djnz |
R4,x99 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x98: |
clr |
scl |
|
|
1µs |
|
|
|
|
|
|
mov |
A,R1 |
|
|
1µs |
|
|
|
|
|
|
rlc |
A |
|
|
1µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
R1,A |
|
|
1µs |
|
|
|
|
|
|
djnz |
R3,X6 |
|
|
2µs |
|
|
|
|
|
|
mov |
A,R1 |
|
|
1µs |
|
|
|
|
|
|
call |
charout |
|
|
1,x ms |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
;############### Acknowledge ################ |
|
|
|
|
|
|||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
ack2: |
clr |
sda |
|
|
1µs |
|
|
|
|
|
|
setb |
scl |
|
|
1µs |
|
|
|
|
|
ack21: |
jnb |
scl,ack21 |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ack22: |
jb |
scl,ack22 |
|
|
2µs |
|
|
|
|
|
|
setb |
sda |
|
|
1µs |
|
|
|
|
|
|
jmp |
empfang |
|
|
2µs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
Zustandsdiagramm (f. XILINX-Schaltung)
Blockschaltbild
Gray-Code-Counter (9 negative Flanken)
Dieser Zähler ist kein richtiger Gray-Code-Zähler, weil sich vom 9. Auf den 1.Zustand 2Bits ändern. Dies ist jedoch unerheblich, da bei diesem Übergang nicht der wichtige Zustand 8 erreicht werden kann (hier wird das Schieberegister ausgelesen und das ACK "gesendet").
|
QN+1 |
QN |
||||||
|
D |
C |
B |
A |
D |
C |
B |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
X |
|
X |
X |
C |
D |
|
|
X |
X |
|
|
X |
X |
|
|
|
|
|
|
B |
|
A=/B*/C*/D+C*D
|
|
A |
|
|
|
|
|
|
|
|
|
|
X |
|
X |
X |
C |
D |
|
|
X |
X |
|
|
X |
X |
|
|
|
|
|
|
B |
|
B=A*/B*/C+B*/D
|
|
A |
|
|
|
|
|
|
|
|
|
|
X |
|
X |
X |
C |
D |
|
|
X |
X |
|
|
X |
X |
|
|
|
|
|
|
B |
|
C=/B*D
|
|
A |
|
|
|
|
|
|
|
|
|
|
X |
|
X |
X |
C |
D |
|
|
X |
X |
|
|
X |
X |
|
|
|
|
|
|
B |
|
D=/A*B+/A*/B*D
komplette Schaltung (Viewlogic)
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen