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.
Wenn SCL High ist, muß SDA stabil sein. Das ist eine gute Zeit, das Signal einzulesen, egal ob Master oder Slave. MfG Klaus
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.