i2C : Pull-up-Widerstände "Designmuster", geschirmtes Kabel und Stecker?

Ich entwerfe ein Arduino-basiertes Board, das häufig den I2C-Port verwendet. Ich möchte in der Lage sein, mehrere Slave-Geräte anzuschließen und/oder mehrere Hauptplatinen miteinander zu verbinden (mindestens 4 wären großartig). Der I2C läuft mit 400 kHz bei 3,3 V. Das Flachkabel zwischen den Platinen kann bis zu 2 Meter lang sein.

Bearbeiten: Wenn ich sage, dass ich vorhabe, 4 Hauptplatinen gleichzeitig zu verwenden, wird nur 1 von ihnen der Master / Host sein.

  • Widerstände hochziehen

Mein Problem besteht nicht wirklich darin, den richtigen Wert des Pullup-Widerstands zu wählen (dafür habe ich diesen interessanten Artikel gefunden ). Es geht eher um "Designmuster".

Gemäß dem oben genannten Artikel sollte ich einen Widerstand zwischen 4,7 kR und 1,5 kR verwenden. Solange ich nur eine Hauptplatine mit ihren Pullups und Slaves ohne Pullups habe, ist das ok, aber wenn ich mehrere Hauptplatinen miteinander verbinde, ist der Pullup-Widerstand parallel und dann zu niedrig.

Sollte ich einige Jumper hinzufügen, um die Pull-up-Widerstände zu aktivieren/deaktivieren? Diese Lösung gefällt mir überhaupt nicht, sie nimmt Platz auf der Platine ein und ist nicht handlich. Und ich möchte, dass mein Board einfach zu bedienen ist, einfach Dinge zusammenstecken und alles funktioniert.

Wenn ich 4,7-kR-Widerstände verwende und 4 Hauptplatinen zusammenschließe, habe ich einen äquivalenten Pullup von 1,2 kR, was ziemlich niedrig ist, und dann verbraucht es mehr Strom (mein Gerät ist batteriebetrieben), die Geräte müssen sinken all dieser Strom (ich kann die Senkenfähigkeit der Slaves, die an den I2C-Port angeschlossen werden, nicht vorhersagen).

  • Abgeschirmtes Kabel

Sollte ich ein abgeschirmtes Kabel zwischen den Geräten verwenden, da es ziemlich lang ist (bis zu 2 Meter) und die Spannung ziemlich niedrig ist (3,3 V)?

  • Verbinder

Schließlich habe ich keinen "normalen" I2C-Anschluss gefunden. Der gebräuchlichste scheint ein 4-poliger SIL-Anschluss mit Pins in dieser Reihenfolge zu sein: GND, VCC, DATA, CLOCK ( z. B. auf Seed's Grove oder Tinkerkit). Klingt gut für mich, aber jeder Vorschlag ist willkommen.

  • Benennung

Bonusfrage: Soll ich "I2C" oder "TWI" auf meine Platine schreiben? Laut Wikipedia scheint TWI eine unvollständige Implementierung des I2C-Protokolls zu sein. Tinkerkit verwendet "TWI", aber "I2C" scheint in der Elektronik häufiger zu sein.

I2C ist nicht wirklich dafür gemacht, mehrere Initiatoren miteinander zu verbinden. Dafür müssen Sie wirklich das SMBus-Protokoll anpassen, für das ein Vermittlungsprotokoll definiert ist.
Meine Frage war nicht sehr klar, eigentlich meinte ich, dass Sie eine Hauptplatine als Master und Erweiterungsplatinen als Slaves verwenden können, oder mehrere Hauptplatinen, von denen aber nur eine Master ist. Danke für deine Antwort, ich werde dem nachgehen. Aber ich denke, ich werde I2C trotzdem verwenden, weil es in der Arduino-Welt beliebter ist.
I2C unterstützt absolut die Arbitrierung mehrerer Busmaster.

Antworten (4)

Drahtkapazität ist das, wogegen Sie kämpfen - Sie können nur so schnell fahren, wie Pullup-Widerstände die parasitäre Kapazität der Drähte aufladen können - in der realen Welt machen Sie eine gute Vermutung und lassen dann, sobald Sie mit der Arbeit an den Schaltkreisen beginnen, ein Zielfernrohr fallen auf der Datenleitung - wenn Sie ein paar schöne Rechteckwellen sehen, können Sie loslegen. Auf der anderen Seite, wenn Sie ein paar Haifischflossen sehen, von denen einige es vor dem Taktrand nicht ganz hoch schaffen, fahren Sie entweder zu schnell oder brauchen einen kleineren Klimmzug

Gepanzertes Kabel hat nichts mit Entfernungen und Spannungen zu tun - wenn jemand wahrscheinlich einen Spaten durch das Kabel steckt, armieren Sie es, andernfalls nicht. Vielleicht meinten Sie ein abgeschirmtes Kabel, was eine ganz andere Sache ist - ein gepanzertes Kabel ist mechanisch geschützt, indem es eine mechanisch starke Barriere um sich herum hat, ein abgeschirmtes Kabel ist elektromagnetisch geschützt, indem es einen leichten, leitfähigen, geerdeten Mantel hat.

Wenn Sie mehrere Master haben möchten, möchten Sie wahrscheinlich kein I2C und könnten stattdessen eines von mehreren anderen Protokollen verwenden, die dies zulassen. So wie ich es verstehe, ist I2C für die Kommunikation zwischen Chips innerhalb einer Leiterplatte konzipiert. Die Annahme ist, dass Sie keine Verbindung zwischen Leiterplatten herstellen, sodass es keinen Standardstecker gibt - die Kabel müssten ziemlich kurz sein (Ihr 2-m-Kabel ist zwei Zeiten zu lang für jede I2C-Implementierung, die ich gesehen habe). Die von Ihnen erwähnten Prototyping-Board-Verbindungen entsprechen nicht wirklich der Funktionsweise von I2C in freier Wildbahn - es befindet sich auf einem einzelnen Board, nicht in einem steckbaren System.

Ja, ich meinte abgeschirmt, und ich denke, 1 m Kabel wäre in Ordnung. Vielen Dank für Ihre Antwort. Ich kann Ihrer Antwort noch kein "+1" geben, da mein Ruf nicht ausreicht.

Die Schreibkapazität oder -induktivität spielt bei 2 m und 400 kbit wahrscheinlich keine Rolle.

I2C spezifiziert Multi-Master-Arbitrierung, sodass Sie mehrere Master haben könnten, wenn Sie wollten. Sie könnten sogar dasselbe Board als Master und Slave verwenden.

I2C ist nicht für lange Laufzeiten spezifiziert. Deshalb gibt es keinen Standardstecker. Es kann immer noch funktionieren. Ich würde STP-Kabel wahrscheinlich mit zwei Paaren versuchen, wenn Sie Strom liefern müssen.

Ich würde etwa 4,7 kOhm Pullup pro Master verwenden. Der Strom, der beim Signalisieren von Nullen verwendet wird, ist dieselbe äußere Hauptplatine, sodass Sie dies in das Leistungsbudget pro Platine einrechnen können. Eine andere Möglichkeit besteht darin, nur hochzuziehen, wenn keine Stromversorgung vom Bus erfolgt, und nur eine Batterie auf eine der Platinen zu legen.

i2c hat Multi-Master, 4x 4,7k wären etwa 3 mA bei 3,3, was für einige i2c-Chips ein Problem sein könnte, aber nicht für viele. Der RasPi verwendet 1,8K-Pullups und scheint sich nicht um Senkenstrom zu kümmern.

Verwenden Sie auf keinen Fall weniger als 4,7 KB, wenn Sie erwarten, bis zu 4 Geräte zu verwenden. Verwenden Sie vielleicht sogar Widerstände mit einer Genauigkeit von 1%, da sie nicht wirklich viel teurer sind als die üblichen 10%.

Kabel der Kategorie 5 kosten nur 52pf pro Meter. Wenn Sie abgeschirmte verseilte Cat5 verwenden, könnten Sie wahrscheinlich mit 14-25K-Widerständen gut auskommen. Grundsätzlich bildet die Kabelkapazität mit dem Pullup-Widerstand einen RC-Tiefpassfilter, und die Kapazität multipliziert mit dem Widerstand sagt Ihnen, wie lange es dauern wird, bis es auf etwa 63% seiner Endspannung aufgeladen ist. Die meisten i2c-Chips verwenden TTL-Pegel, die sogar 1 Volt als logisch hoch betrachten, und es gibt keinen Widerstand außer dem Serienwiderstand des Chip-Pins, der begrenzt, wie schnell er heruntergezogen werden kann.

Bei i2c möchten Sie sicher sein, dass die ansteigende Taktflanke den Empfänger erreicht, bevor sich die Daten auf der Datenleitung ändern können, und Sie möchten sicher sein, dass sich die Datenleitung stabilisiert hat, bevor die ansteigende Taktflanke eintrifft.

Wenn Ihre Leitungen die gleiche Kapazität haben, verschwindet das zweite Problem meistens, da der Takt etwas nach den Daten gesendet wird. Wenn Sie cat5 verwenden, verwenden Sie vielleicht die beiden Leiter in einem Paar für SDA und SCL? Es wird wahrscheinlich kein Problem sein.

Da beim Herunterziehen kein Widerstand vorhanden ist, können sich die Daten am Ende fast augenblicklich ändern. Die erste Sorge bedeutet, dass Sie wahrscheinlich möchten, dass Ihre Zeitkonstante höchstens etwas mehr als die Hälfte Ihrer Bitzeit beträgt.

Langstrecken-i2c wird nicht als "richtiger" Weg angesehen, kann aber gut funktionieren. Probieren Sie zuerst einen Prototyp aus, probieren Sie 18K oder so mit Cat5 oder einem ähnlich guten Kabel aus und sehen Sie, wie weit Sie gehen können. Stellen Sie sicher, dass i2c alle Funktionen bietet, die Sie benötigen.

Beachten Sie auch, dass Sie, wenn Sie jemals einen aufgelöteten i2c-Slave an das Motherboard anschließen möchten, eine separate i2c-Schnittstelle von den verwendeten oder zwischen den Motherboards kommunizierenden benötigen, da Sie sonst möglicherweise Adresskonflikte zwischen den Slave-Geräten auf den beiden Motherboards haben .