Kann ich auf I²C-Pullup-Widerstände verzichten?

Ich versuche, eine kleine Schaltung zu produzieren, und ich versuche, die Anzahl der Teile zu reduzieren. Ich habe kürzlich ein I²C- EEPROM hinzugefügt, das einmal verwendet wird, wenn das System hochfährt, zusammen mit diesem EEPROM habe ich zwei Widerstände für Pullups hinzugefügt.

Auf diese möchte ich nach Möglichkeit verzichten und nur auf interne Pull-up-Widerstände setzen.

Diese Frage scheint darauf hinzudeuten, dass es möglich ist, aber nicht empfohlen wird: Was passiert, wenn ich die Pullup-Widerstände in I2C-Leitungen weglasse?

Ich verwende einen ATmega328 und das EEPROM befindet sich neben dem Gerät mit Trancen von etwa 10 mm.

Hat jemand an einem Projekt gearbeitet, bei dem die externen Pull-up-Widerstände absichtlich weggelassen wurden, oder ist das eine wirklich schlechte Idee?

Die Chancen stehen sehr gut, dass Sie das Board überarbeiten, um sie hinzuzufügen, wenn Sie die Klimmzüge weglassen.
Prüfen Sie, ob das EEPROM Clockstretching durchführt. Wenn dies nicht der Fall ist, können Sie einen normalen (Push-Pull) Ausgang für die Uhr verwenden. Wenn Sie Pins übrig haben, wechseln Sie alternativ zu einem SPI-EEPROM.
-1 : ein weiteres "Was passiert, wenn ich etwas mache, das nicht vom Standard unterstützt wird?" Frage, wobei die offensichtliche Antwort "Sie erhalten ein Verhalten, das nicht vom Standard unterstützt wird" in den Sinn kommt. Es kann unter bestimmten Umständen funktionieren, während es in den meisten Fällen schlecht oder überhaupt nicht funktioniert. Dasselbe gilt z. B. für das Übertakten von uC-Geräten – wenn Sie sich zu 100 % sicher sind, dass Sie mieses, fehlerhaftes und unvorhersehbares Verhalten wollen – machen Sie weiter, niemand wird Sie wirklich aufhalten. Außerdem - wenn jemand Platinenplatz oder Konstruktionsaufwand sparen möchte, indem er zB zwei Widerstände weglässt, würde ich tatsächlich sagen, dass er viel zu lernen hat.
Hinweis: "Ich versuche, die Anzahl der Teile zu reduzieren" - dies nicht durch Vereinfachen der funktionalen Idee oder Einführen von Integration, sondern durch Weglassen notwendiger passiver Komponenten zu tun, ist meiner Meinung nach die Essenz schlechter Elektrotechnik .
Ich hatte gehofft, jemand würde Glück haben und jemand würde sagen, dass es in Ordnung ist, wenn man vorsichtig ist. Es sieht so aus, als würden die Widerstände nirgendwo hingehen!
Ich war daran interessiert herauszufinden, ob es angesichts der Bedingungen, der Nähe, eines Slave-Geräts usw. eine erledigte Sache ist. Ich verstehe, warum sie benötigt werden. Ich wollte wissen, ob die internen Klimmzüge ausreichen würden. Die Reduzierung der Anzahl der Teile bezieht sich auf meinen aktuellen Bauprozess, bei dem jedes zusätzliche Teil Zeit kostet.

Antworten (3)

I²C erfordert Pullups auf den Daten- und Taktleitungen. Wie Sie diese Klimmzüge bereitstellen, liegt bei Ihnen.

Klimmzüge sollten im Bereich von 3,3 KΩ liegen, aber der genaue Wert ist nicht so wichtig, solange er irgendwo in der Nähe liegt.

Sie können die internen Pullups der MCU verwenden, wenn und nur wenn Sie sehr wenige (ein oder zwei) Elemente auf dem I²C-Bus haben und die Buslänge sehr kurz ist (nur wenige Zentimeter).

Sie sollten in dieser Situation auch sicherstellen, dass der Bus nicht zu viele Störungen aufnimmt, da die Rauschunterdrückung der schwächeren Klimmzüge schlechter ist. Stellen Sie sicher, dass alle Gleise, die Ihren Bus kreuzen, dies in einem Winkel von 90° tun, um die Geräuschinduktion zu reduzieren. Stellen Sie eine Massespur bereit oder gießen Sie zwischen den Takt- und Datenleitungen, um das Übersprechen zwischen den Takt- und Datenleitungen zu reduzieren.

Das heißt, zwei Widerstände sind nicht wirklich eine große Ausgabe ...! 0402- oder 0603-Widerstände nehmen fast keinen Platz ein. Ich würde bei den richtigen Klimmzügen bleiben.

Es sind nicht so sehr die Kosten, sondern der Platz, den sie einnehmen, und die zusätzliche Zeit, die es braucht, um sie zu bestücken. Ich baue die Platinen derzeit von Hand, also möchte ich so viel wie möglich reduzieren. Ich werde mir die Spuren ansehen und sehen, welche Verbesserungen am Layout und Abstand vorgenommen werden können.
Könnte ich vorschlagen, die Fußabdrücke hinzuzufügen, aber nicht zu füllen? So verlierst du nur wenig Platz und wenn es nicht klappt, kannst du sie immer noch anziehen.
Wenn Sie genug Bretter machen, dass Sie den Zeitunterschied bemerken, haben Sie genug Übung, dass es keinen großen Zeitunterschied geben wird!
Ich habe gerade eine Platine mit 0402s gebaut und es dauerte nur etwa 30 Sekunden pro Stück, um die Widerstände und Kappen zu löten. Sie können wirklich nicht 1 Minute erübrigen, um eine ordnungsgemäße Leistung sicherzustellen? Sie werden weit mehr als eine Minute damit verbringen, zu debuggen, warum die Dinge nicht wie erwartet funktionieren.
Bei der Verwendung von Bit-Bang-I2C mit Geräten, die kein Handshaking erfordern, kann man den Pull-up auf SCK weglassen, wenn Software die Leitung aktiv hoch und niedrig treibt. Ich bin mir nicht sicher, warum Hardware-I2C-Implementierungen keine Option bieten, um den Takt aktiv hochzutreiben, da dies die Geschwindigkeit verbessert und oft keine Nachteile hat, wenn, wie es oft der Fall ist, keines der anderen Geräte im System jemals ziehen wird SCK aus irgendeinem Grund niedrig.
@supercat Tatsächlich können Sklaven SCK niedrig ziehen. Das nennt man Clock-Stretching. „Ein I2C-Slave darf den Takt festhalten, wenn er die Busgeschwindigkeit reduzieren muss. Der Master hingegen muss das Taktsignal zurücklesen, nachdem er es auf den High-Zustand freigegeben hat, und warten, bis die Leitung tatsächlich hat hoch gegangen." von I2C-bus.org
@Blup1980: Ich sagte "...mit Geräten, die kein Handshaking erfordern". Viele Geräte geben an, dass sie auf I2C-Transaktionen immer entweder ohne Verzögerung oder gar nicht reagieren. Ein Design, bei dem der Master den Takt ohne Pull-up blind hoch und niedrig treibt, wäre mit Geräten inkompatibel, die Handshaking erfordern, aber in vielen I2C-Anwendungen weiß der Designer genau, welche Geräte auf dem Bus sein werden und ob welche vorhanden sind würde Händeschütteln erfordern.

Zuerst müssen Sie verstehen, warum Sie sie brauchen. Dann können Sie klarer beurteilen, ob Sie sie brauchen oder nicht, oder ob Sie die internen verwenden können.

Die I2C-Busspezifikation besagt, dass die an diesen Bus angeschlossenen Dinge in der Lage sein müssen, die Leitungen niedrig zu ziehen. Aber sie sollten nicht in der Lage sein, sie hoch zu ziehen. Dies ist die Rolle des Pull-up-Widerstands auf diesen Leitungen.

Wenn zwei oder mehr Dinge den Bus gleichzeitig benutzen wollen, besteht auf diese Weise kein Risiko, dass einer versucht, die Leitung nach unten zu ziehen, während ein anderer versucht, sie nach oben zu drücken. Was zu einem Buskonflikt, sehr hohen Strömen in den IO der Dinge und einer möglichen Zerstörung derselben führen würde.

Verwenden Sie Pull-up, wenn einer versucht, nach unten zu ziehen, während ein anderer versucht, die Leine zu "lösen". Die Leitung würde niedrig gehen und nichts Ernstes passiert.

Das gleiche Prinzip gilt für das ACK, das ein Slave an den Master sendet. Der Master muss die SDA-Leitung „freigeben“, wenn ein ACK empfangen werden muss. Zu diesem Zeitpunkt zieht der Slave die SDA-Leitung auf Low, um das ACK zu signalisieren.

Stellen Sie sich ein System ohne Klimmzüge vor. Es sollte eine Möglichkeit geben, die Leitungen auf hohem Niveau zu halten. (Eine konstante Low-Level-Leitung hat keinen sehr hohen Durchsatz.... ;-) ) Und wir haben ja schon gesehen, dass die Verwendung von Push-Pull-Ausgängen hier nicht funktioniert, ohne das Protokoll zu verschrauben.

Über die internen Klimmzüge? Ja es könnte funktionieren. Aber angenommen:

  1. Sie benutzen einen sehr langsamen Bus. Der durch die Leitungskapazität gebildete RC und der Pull-up definieren, wie lange es dauert, bis die Leitung von Low auf High übergeht. Wenn die Widerstände groß sind. Was normalerweise bei eingebetteten Klimmzügen der Fall ist, dann kann die Zeit sehr groß sein. Oder Sie sorgen, wie von @Majenko erklärt, dafür, dass die Kapazität Ihres Busses sehr gering bleibt. (sehr kurze Leitungen, keine 10+ Slaves verwenden, etc.)

  2. Sie überprüfen, ob die Slaves und der Master in Ordnung sind, um mit einem sehr langsamen Bus zu arbeiten. Einige akzeptieren beliebige Busgeschwindigkeiten, sobald sie unter dem maximal zulässigen Wert liegen. (dasselbe gilt für die Anstiegszeit der Leitung)

  3. Sie benutzen keinen sehr langen Bus in einer lauten Umgebung.

  4. Sie akzeptieren, dass der Bus, den Sie benutzen, außerhalb der Spezifikationen liegt. Ich meine, es wird keine Bedingung sein, gegen die die von Ihnen verwendeten I2C -Dinge getestet wurden. Ohne eigene Tests an einem Prototypen unter allen Betriebsbedingungen können Sie nicht sicher garantieren, dass es funktioniert.

Aus dem ATmega328-Datenblatt:

Die einzige externe Hardware, die zur Implementierung des Busses benötigt wird, ist ein einzelner Pull-up-Widerstand für jede der TWI-Busleitungen.

Wie später im selben Abschnitt über TWI mit dem 328 angegeben wird:

beide Busleitungen sind über Pull-up-Widerstände mit der positiven Versorgungsspannung verbunden. Die Bustreiber aller TWI-konformen Geräte sind Open-Drain oder Open-Collector. Dies implementiert eine verdrahtete UND-Funktion, die für den Betrieb der Schnittstelle wesentlich ist. Ein Low-Pegel auf einer TWI-Busleitung wird erzeugt, wenn ein oder mehrere TWI-Geräte eine Null ausgeben. Ein High-Pegel wird ausgegeben, wenn alle TWI-Geräte ihre Ausgänge im Tristate-Zustand befinden, wodurch die Pull-Up-Widerstände die Leitung auf High ziehen können.

Die Pullup-Widerstände sind notwendig, um die notwendigen Logikwerte zu erzeugen, um mit dem EEPROM-Gerät zu sprechen.

Mir ist klar, dass Sie das tun sollen, ich schaue, womit ich davonkomme!
Nun, was das Atmel-Datenblatt mir sagen würde, ist, dass Sie nicht davonkommen können, die Pullup-Widerstände nicht zu verwenden und trotzdem eine zuverlässige Kommunikation zu haben.