[Bericht] I2C Pullup

Hi...

Hier gibts öfter mal Diskussion um die Pullups beim I2C. Von einigen wird die Notwendigkeit angezweifelt, andere haben Probleme bei der Bemessung. Der leider falsche Schluss aus solchen Problemen: I2C ist Mist.

Hier ein Foto von meinem Testaufbau.

Und im Anhang 2 PDF Dateien.
Einmal der komplette Aufbau, also mit FRAM, EEPROM und RTC, und einmal der gleiche Aufbau, nur RTC gezogen.

Wie man sieht, wenn man die Beiden vergleicht, sind die Pegel bei gesteckter RTC viel höher und auch deutlich rechteckiger.

Der logische Schluss:

  1. Die RTC hat Pullups auf dem Board
  2. Die internen Pullups des UNO sind zu groß um ordentliche Signale zu bekommen.
  3. Ohne extra Pullups ist die Sache ein reines Glücksspiel.

Ein Logikanalysator zeigt das nicht, in dieser Form.
Der ist also bei der Analyse der Flanken wenig hilfreich.
Im Gegenteil. Er verbirgt das Problem, da er einen Schmitt Trigger Eingang hat, und so saubere Rechtecke zeigt.
Für eine Analyse der übertragenen Daten ist er dagegen sehr hilfreich.

Tipps zur Fehlersuche:

-> Nutze den I2C Scanner!
Wenn ein I2C Modul nicht vom Scanner gefunden wird, dann hat man ein Problem, welches behoben werden will, bevor man im Programm rum doktert.
Genauso, wenn der Scanner Mist zeigt.

-> Prüfe auf Erfolg!
Werte das Ergebnis von Wire.endTransmission() oder/und Wire.requestFrom() aus.

-> Vermeide Race Conditions!
Race Conditions treten in Multitasking und Multimaster Umgebungen auf.
Sie sind recht schwer zu finden.
Im Multitasking System muss der Ausschluss per Semaphor erfolgen.
Um diese Race Conditions in Multimaster Umgebungen zu vermeiden haben einige Methoden den stop Parameter.

  • Wire.endTransmission(stop)
  • Wire.requestFrom(address, quantity, stop)
    Setzt man diesen auf false, dann kann sich kein anderer Master zwischen zwei Zugriffe, auf ein und denselben Baustein, drängeln. Der Bus bleibt belegt.

-> Beachte die Regeln für ISRs (z.B. auf den AVR Arduinos)
onReceive() und onRequest() werden von einer Interrupt Service Routine aufgerufen. Achte darauf, dass alle davon veränderten Daten das volatile Attribut bekommen und von der Hauptanwendung atomar gelesen werden.

Links:
Wikipedia zu I2C
I2C Spezifikation
I2C Bus Pullup Resistor Calculation
I2C Level Shifter
I2C Multiplexer TCA9548A
LTC4311 aktiver Pullup

Arduino Wire
Race Conditions
Atomically Executed Code Blocks

eeprom_fram_rtc.pdf (117 KB)

eeprom_fram.pdf (119 KB)

Hallo combie,

danke für diesen Beitrag.
Das sollten sich alle Zweifler "hinter die Ohren schreiben". :wink:

Ich plädiere dafür Pullups auf den Breakout Boards grundsätzlich zu verbieten!!!

Der eine Hersteller verbaut 4,7kΩ, der nächste 10kΩ und der übernächste verbaut keine Pullupwiderstände.

Ganz furchtbar wird es wenn der I²C Bus dann noch über einen Levelshifter in einen HV und LV Teil geteilt wird und diese Levelshifter dann selbst auf beiden Seiten wieder Pullups mitbringen.

Also Breakout Boards am besten alle ohne Pullupwiderstände, dann weiß man was man hat und muss sich immer selbst darum kümmern.

Hat man mehrere Breakout Boards mit 4,7kΩ internen Pullups an einem Bus läuft man auch schnell Gefahr den den Mindestwert zu unterschreiten und den kennt man in der Regel nicht.
Der hängt nämlich von der Treiberleistung von dem Breakout Board ab das am wenigsten schalten kann.

Gruß Peter

Danke für deine Mühe combie! :slight_smile:

peter_de:
Also Breakout Boards am besten alle ohne Pullupwiderstände, dann weiß man was man hat und muss sich immer selbst darum kümmern.

Ich wäre auch dafür!!!

hi,

auch danke.

wie bist Du mit diesem hantek zufrieden? ich kann mit oszis nicht umgehen, aber um das geld könnte man sich schon mal ein wenig einarbeiten. vor allem ist die berührungsangst am pc bei weitem kleiner.
würdest Du es wieder nehmen oder inzwischen was anderes empfehlen?

für den vorschlag ohne widerstände bin ich absolut. wird nur nix nutzen. mit kann jeder die rtc an den arduino änhängen und fertich, ohne braucht's schon mal ein steckbrett.

gruß stefan

wie bist Du mit diesem hantek zufrieden?

Halb und halb...

Ich habe die Variante mit Logikanalysator.
Den Aufpreis hätte ich mir sparen können!

Erstmal zum 2 Kanal Oszi:
Durchaus brauchbar!
Immer schön darauf achten, dass die Masse nicht Potential getrennt ist.
USB Masse ist Klemmen Masse. Bis jetzt hat das bei mir noch keine Probleme gemacht.....
(habe aber auch einen Trenntrafo neben dem Oszi stehen)

Die Software zum Oszi, ist gut brauchbar, bis schon fast genial.
Damit bin ich sehr sehr zufrieden!

Der 16 Kanal LA:
Tuts!
Die Software ist allerdings unter aller Sau.
Die kann nix.
Aber zum Glück hat das Ding einen Knopf, um in einen Saleae 8 Kanal kompatiblen Modus zu schalten.
Dann kann man das Ding mit "Sigrok PulseView" betreiben.
Tuts prächtig!
Leider sind dann 8 Kanäle tot, aber die Anderen voll brauchbar.

würdest Du es wieder nehmen oder inzwischen was anderes empfehlen?

Das Oszi: Gut!
Den LA, da würde ich mir so ein Billgding beschaffen.

hi,

danke.

ja, so ein billigding hab' ich und finde es großartig (allerdings mit saleae-software).

was wäre die variante ohne LA? ich hab' nix gegen geld ausgeben, solange es spaß bringt, und hab' nach Deinem ersten post auch die größeren geräte (6XX4BD) gesehen.

aber wenn's dann halt wieder das risiko gibt, das ding aus blödheit zu zerstören (zitat: "Immer schön darauf achten, dass die Masse nicht Potential getrennt ist.") sollte ich vielleicht doch was nehmen, bei dem ich mich im fall des falles NICHT so ärgern muß.

gruß stefan

(zitat: "Immer schön darauf achten, dass die Masse nicht Potential getrennt ist.")

Das musst du sowieso.
Bei jedem Oszi.

Nur bei einem USB Dingen, "könnte" man den PC mit schrotten, wenn einem die Probeschaltung um die Ohren fliegt.

ja, so ein billigding hab' ich und finde es großartig (allerdings mit saleae-software).

Da hast du auch dieses Potential Trennungsproblem!
Identisch.
Und damit kommst du ja auch klar.

(ich wollte dir keine Angst machen)

was wäre die variante ohne LA?

Hantek 6022BL, mit LA
Hantek 6022BE, ohne LA

hi, combie,

Hantek 6022BL, mit LA
Hantek 6022BE, ohne LA

dann hatte ich ja nach dem richtigen gesucht. Du hast in Deiner software das BE eingestellt, deswegen die verwirrung...

Das musst du sowieso.
Bei jedem Oszi.

naja, darum geht*s ja. Du meinst sicher, daß eine GND-leitung des saleae mit GND des zu messenden geräts verbunden sein muß. das kapiert man sogar als nicht-elektroniker wie ich sehr schnell. deswegen hab' ich es auch immer gemacht, aber nicht, um das ding nicht zu schrotten (auf die idee bin ich nicht gekommen), sondern weil mir klar war, daß ich ohne diese verbindung keine vernünftige messung hinbekommen kann.

das spräche jetzt dafür, die 280 euronen zu löhnen. andererseits: vorgestern mit dem saleae gearbeitet, und diese clips (egal, ob haken oder klemmen) hüpfen so sch...-leicht runter. ich hab' die verbindung zu gnd mit einem anstreifen des "sweatshirt-kapuzen-bändchens" getrennt. hieß für mich: ok, kann nicht mehr gehen, wieder anschließen, messung wiederholen, und es hat dem saleae auch nicht geschadet. und wenn, sind ja nur acht euro...

also entweder über das ding nachdenken (80 oder 280 euro).

oder noch drei bier, dann bestell ich sowieso das teure.

danke für die infos und

gruß, stefan

gut.

zwei bier hab' ich. vernunft ist also noch da...

mit "einen knopf zum umschalten" meinst Du wohl hardwaremäßig, also sollte das saleae-programm auch funktionieren, und ich erspar mir das umstecken zwischen digital und analog.

acht analoge kanäle brauch ich sicher nicht, für mich ist "digital", also das signal wichtig. analog grad mal zum untersuchen der signalqualität.

bevor ich jetzt noch ein bier trinke, bestell ich das ding um 70 euro.

danke für Deine tips, und gruß, stefan

und ich erspar mir das umstecken zwischen digital und analog.

Nicht wirklich!
Die analogen sind mit BNC Buchsen.

mit "einen knopf zum umschalten" meinst Du wohl hardwaremäßig, also sollte das saleae-programm auch funktionieren,

Ja, meine ich.
Aber ob das Saleae Programm auch funktioniert, habe ich nicht getestet

Du hast in Deiner software das BE eingestellt, deswegen die verwirrung...

Nein, das habe ich nicht.
Die Software macht da keine Unterscheidung.
Und einzustellen ist da nichts.

hi,

Aber ob das Saleae Programm auch funktioniert, habe ich nicht getestet

war mir klar, Du scheinst ja linux zu sein.

ok, umstecken muß also sein. hab grade auf'm bild gesehen, daß es da pinleisten gibt.

werde es trotzdem bestellen, ich "hab' gern sachen". naja, Du weißt schon: arme kindheit nach dem krieg, jetzt kompensiere ich....

noch ein danke, noch ein gruß,

stefan

combie:
... Der leider falsche Schluss aus solchen Problemen: I2C ist Mist. ...

Danke für diesen Beitrag!

Ich finde nur, dass das mit dem „leider“ nicht stimmt. Dass diese Folgerung falsch ist, ist nicht schade, sondern gut.

Aber ich weiß, was Du meinst :slight_smile:

Gruß

Gregor

Danke für Messung und Erfahrungsbericht!

Danke für die Blumen...

Du scheinst ja linux zu sein.

Auch....
Aber Win 10, an meinem Bastelplatz.

naja, darum geht*s ja. Du meinst sicher, daß eine GND-leitung des saleae mit GND des zu messenden geräts verbunden sein muß. das kapiert man sogar als nicht-elektroniker wie ich sehr schnell. deswegen hab' ich es auch immer gemacht, aber nicht, um das ding nicht zu schrotten (auf die idee bin ich nicht gekommen), sondern weil mir klar war, daß ich ohne diese verbindung keine vernünftige messung hinbekommen kann.

Ich muss auch manchmal Geräte messen, welche keine galvanische Trennung haben, also deren Masse eben nicht mit PC Masse verbunden sind, wie es immer bei USB der Fall ist. Auch nicht verbunden werden darf.
z.B. Geräte mit Kondensatornetzteil. Oder alte Röhrengeräte.
Da kann/wird der Geräte GND mit der Phase des Netzes verbunden sein.
Dann knallt es, wenn du den Oszi GND mit Geräte GND verbindest.
Darum der Trenntrafo.

gregorss:
Danke für diesen Beitrag!

Ich finde nur, dass das mit dem „leider“ nicht stimmt. Dass diese Folgerung falsch ist, ist nicht schade, sondern gut.

Aber ich weiß, was Du meinst :slight_smile:

Mit diesem Artikel/Bericht beziehe ich mich ausschließlich auf die physikalische Schicht. (siehe dazu auch OSI-Schichtenmodell)
Hier im speziellen, die Erscheinungen bei zu großen Pullup.
Wenn man die physikalische Schicht schon nicht richtig modelliert, wird man bei der Nutzung höherer Schichten sicher versagen.
Und dummer Weise, sind wir/ich Arduino Bastler von unseren technischen Möglichkeiten und auch oft vom Wissen her, begrenzt. Dabei haben wir doch, im Grunde, den gleichen Anspruch, wie die Profis. Die fertige Schaltung soll am Ende stabil laufen.

Und wie die anderen schon sagten...
Bei dem typischen Arduino Bastelkram, wird einem das ein oder andere Beinchen gestellt.
Der Pullup Wildwuchs lässt grüßen..
Wenn man da nicht genau weiß, was man tut, baut man sich schnell einen Zufallsgenerator.


Mir ist daran gelegen, dass jeder gut mit dem I2C zurecht kommt.