Forum: Mikrocontroller und Digitale Elektronik I2C/TWI - Wann liest Master Daten / Acknowledge?


von Timm T. (Gast)


Lesenswert?

Leider habe ich dazu in den Datenblättern zu I2C-Chips und zum I2C beim 
AVR nichts gefunden: Wann liest ein I2C / TWI Master üblicherweise die 
Daten beim Read bzw. das Acknowledge beim Write ein?

- am Anfang SCL Pulses?
- in der Mitte des SCL Pulses?
- am Ende des SCL Pulses?

Letzteres scheint mir am sinnvollsten.

von Klaus (Gast)


Lesenswert?

Wenn SCL High ist, muß SDA stabil sein. Das ist eine gute Zeit, das 
Signal einzulesen, egal ob Master oder Slave.

MfG Klaus

von Timm T. (Gast)


Lesenswert?

Klaus schrieb:
> Das ist eine gute Zeit, das
> Signal einzulesen, egal ob Master oder Slave.

Das ist schon klar, nur ist SCL ja bei 100kHz für 5µsec stabil. Ne Menge 
Zeit, da etwas auszulesen.

Also wenn ich einen Software-Master programmiere:

SCL high
SDA / ACK lesen
Delay 5µsec
SCL low

oder

SCL high
Delay 5µsec
SDA / ACK lesen
SCL low

oder

SCL high
Delay 2.5µsec
SDA / ACK lesen
Delay 2.5µsec
SCL low

von Klaus (Gast)


Lesenswert?

Timm T. schrieb:
> Also wenn ich einen Software-Master programmiere:
>
> SCL high
> SDA / ACK lesen
> Delay 5µsec
> SCL low

Besser so:

SCL high/open
wait while SCL not high
read SDA
.
.

Das Warten bis SCL wirklich high ist, erledigt lame Pullups, kapazitive 
Buslasten und Clock-Stretching.

Der Ablauf ist ja so: Der Slave erkennt, daß SCL low geworden ist und 
hält es jetzt selbst auf low, legt seine Daten auf SDA und läßt SCL los. 
D.h. SDA ist immer etwas früher als SCL. Und solange SCL und SDA nicht 
beliebig elektrisch unterschiedlich aufgebaut sind, hat sich SDA 
eingeschwungen, bevor SCL high geworden ist. Ist der Slave wesentlich 
schneller als deine 5µs, bekommst du das garnicht mit. Du hälst ja in 
dieser Zeit SCL selbst auf low.

MfG Klaus

von Timm T. (Gast)


Lesenswert?

Klaus schrieb:
> SCL high/open
> wait while SCL not high
> read SDA

Im Prinzip ja, aber das hat meiner Meinung nach den Nachteil, daß ein im 
Clock Stretch hängender Slave nicht nur den Bus, sondern gleich den 
Master lahmlegt.

Dann lieber Busfehler... Oder man muß halt noch ein Timeout einbauen.

von Klaus (Gast)


Lesenswert?

Timm T. schrieb:
> Dann lieber Busfehler... Oder man muß halt noch ein Timeout einbauen.

Hängt vom Gerät ab. Ob ein Temperaturregler hängt und den Heizer nicht 
ausmacht oder den Heizer nicht ausmacht, weil er die falsche Temperatur 
ließt ..?

Viele von den neueren Slaves sind in Wirklichkeit µCs. Da muß man immer 
mal mit Clock stretching rechnen. Der Raspi hat einen HW-Bug im Chip, 
der den Master unter bestimmten seltenen Bedingungen das Stretching 
nicht erkennen läßt. Von vielen wird daher aus praktischer Erfahrung das 
I2C-Interface als komplett unbrauchbar bezeichnet.

Ich find es schon fein, was mit I2C so alles geht. Ich hab mal ein 
Master-Slave Paar bei 800kHz so richtig an die Grenze gebracht. Dann hab 
ich den Bus auf ein paar Meter verlängert und es ging immer noch. Durch 
die Kabelkapazität verlangsamt sich zwar die High Flanke von SCL, durch 
das Warten auf High wird das aber wieder in Ordnung gebracht. Die 
Busfrequenz ging dabei automatisch runter, hat sich quasi dem Kabel 
angepasst. So ist das halt mal designed worden (als man 3 stellige kHz 
für schnell hielt) ;)

MfG Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.