I²C - Bus fragen zu Pull - up Widerstände und Befehle

Hallo Zusammen,

hab mal wider ein paar Fragen:

  1. Für was brauch ich den Befehl Wire.endTransmission(false)
    Kann ich nicht einfach mit Wire.beginTransmission(Adress) die Kommunikation starten und dann auch 2 Bytes senden oder
    brauch ich nach dem ersten Byte ein manuelles Repeat - Start mit dem Befehl?

  2. Wie kann ich die Geschwindigkeit auf dem Bus bestimmen?
    Ich hab ja meine Pull up Widerstände die je nach kleinerem Widerstand die Geschwindigkeit erhöhen
    (wenn ich das das so Richtig verstanden hab =D)
    Hat da jmd ne Tabelle dazu welcher Widerstand welche Geschwindigkeit?

Diese Seite hab ich schon durchforstet bin aber nur auf den Signalverlauf gekommen der super beschrieben ist aber nicht auf
die Geschwindigkeit...

Hoffe mir kann jmd helfen =)

Gruß
Da_Sepp

Senden:

Wire.beginTransmission(deviceAdr);
Wire.write(register);
Wire.write(data);
Wire.write(data);
...
Wire.endTransmission();

Empfangen:

Wire.beginTransmission(deviceAdr);
Wire.write(register);
Wire.endTransmission();
Wire.requestData(deviceAdr, numberOfBytes);
Wire.read();
Wire.read();
...

zu1) Wo hast Du das "false" im Wire.endTransmission(false) her? Hast Du es in einem Beispiel gefunden?

zu2) Wüßte nicht wie Du über Arduino die Geschwindigkeit bestimmen kannst außer mit einem zweiten der im richtigen Moment die Frequenz des SCL Signals mißt.
Die Geschwindigkeit hängt nicht vom Pullupwiderstand ab.
Der Pullupwiderstand muß nach einem LOW Signal die Leitungskapazität Laden und glaichzeitig den Strom liefern damit die Eingänge die Leitungen HIGH sehen (auch ein Cmos Eingang hat einen minimalen Eingangsstrom wenn der Logikpegel wechselt, weil die Gate-Source-Kapazität auch geladen werden muß). Wenn die Leitungskapazität und die Eingangskapazitäten wegen langer Verbindngen und vieler I2C Bausteine größ ist ( wir reden jetzt von ca 400 pF als max- Wert für den I2C BUS ) kann der Pullupwiderstand die Leitung nicht in der möglichen Zeit (zwischen 2 HIGH - Zuständen des SCL bzw einem HIGH - Wert nach einem LOW -Wert auf SDA) wieder laden sprich auf HIGH bringen.
Die Bilder auf Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino zeigen die Spannungsverläufe bei verschiedenen Pullupwiderständen. Nick gibt leider nicht die Leitungslänge an, sondern nur die I2C Devices (2 Arduinos, einer wahrscheinlich als Slave programmiert.) Er mißt den Takt des I2C Busses (SCL).

Beim ersten Bild kommt die Spannung während des 5µS langen HIGH-Signals gerade mal auf 4,4V. Die Busfrequenz wird 100kHz sein (nehme ich mal an)
Beim 2. Bild wirds schon besser. Beim 5. Bild ist es perfekt.

Jetzt kann ich Dir nicht sagen ab wann dieser Signalverlauf Probleme geben wird da es vom Eingang abhängt ab welcher Spannung HIGH gesehen wird und auf welcher Spannung in diesem Moment das SDA Signal ist.

Man kann es mit dem Pullupwiderstand auch übertreiben.
Nick macht Versuche auch mit 1kOhm und 470 Ohm (5mA und 10mA Strom den ein LOW Ausgang durch den Pullupwiderstand auf Masse ableiten muß)
Die Bilder zeigen daß der Ausgangstransistor einen Innenwiderstand hat der mit dem Pullupwiderstand einen Spannungsteiler bildet und der Spannungwert nicht ganz auf 0V abfällt. Nun 0,2 und 0,5V sind nicht viel und der Bus wird funktionieren aber wir überbeanspruchen den Ausgangstransistor.

Grüße Uwe

Die verschiedenen I2C Device können mit mehreren Busfrequenzen arbeiten. Je kleiner die Frequenz ist desto größer kann die Leitungslänge sein. Die Frequenz wird vom I2C Master durch den SCL Takt vorgegeben. Arduino benutzt standartmäßig die kleinste übliche Frequenz: 100kHz.
400kHz und 1200kHz sind als maximale Busfrequenzen definiert.

Nick beschreibt einen Wechsel der I2C Busfrequenz in Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino
Die höchste Standart-Frequenz ist mit Arduino nicht möglich /sinnvoll

Grüße Uwe

Zu 1.) also des Wire.endTransmission(false) hab ich eig aus der Referenz wenn man als Stop - Parameter ein False eingibt

zu 2.) ah ok jetzt hab ich es verstanden =) danke
Ich kann also die Geschwindigkeit verändern indem ich das entsprechende Register beschreibe oder?

Gruß
Sepp

zu1) ein False ist eigentlich nur bei MultiMaster Betrieb notwendig und somit nicht gebraucht.
zu2) ja kannst Du, aber laß es lieber bleiben. Du verschärft die Probleme mit den Pullupwiderständen. Alle Devices müssen außerdem für die höhere Busfrequenz geeignet sein.
Grüße Uwe

Guten Morgen,

Danke für deine Hilfe, hast mir sehr geholfen :slight_smile:

Gruß

Sepp