Timing-Spezifikationen
r /
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 4,7 - µ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 4,7 - µ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 !)
1.2 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 (MSB...LSB) 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 (MSB...LSB) 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
1.3 TIMING-DIAGRAMM:
Programm Zeit/Befehl SDA SCL
;###########################################
0 1
0 1
;############# 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
1.4 ZUSTANDSDIAGRAMM (F. XILINX-SCHALTUNG)
1.5 BLOCKSCHALTBILD
1.6 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
1 0 0 0 0 0 1 0 1
2 0 0 0 1 0 0 0 0
3 0 0 1 1 0 0 0 1
4 0 0 1 0 0 0 1 1
5 1 0 1 0 0 0 1 0
6 1 0 0 0 1 0 1 0
7 1 1 0 0 1 0 0 0
8 1 1 0 1 1 1 0 0
9 0 1 0 1 1 1 0 1
A
2 3 4 5
1
C
D 8 9
7 6
B
A
1 1 0 0
X 0 X X
C
D 1 1 X X
0 X X 0
B
A=/B*/C*/D+C*D
A
0 1 1 1
X 0 X X
C
D 0 0 X X
0 X X 0
B
B=A*/B*/C+B*/D
A
0 0 0 0
X 0 X X
C
D 1 1 X X
1 X X 0
B
C=/B*D
A
0 0 0 1
X 0 X X
C
D 1 0 X X
1 X X 1
B
D=/A*B+/A*/B*D
|