Gibt es da draußen eine definitive Anleitung zur I2C-Pinbelegung? Nicht auf der Suche nach einem "STANDARD"

BEARBEITEN: Dies wurde mehrmals wiederholt, also obendrauf: Ja, es ist bekannt, dass es keinen "Standard" für I2C-Verbindungen zwischen Geräten gibt, aber diese Community kann sicherlich eine Liste von "Leitlinien" für die Herstellung formulieren solche Verbindungen, basierend auf Signalverhalten, Rauschminimierung und Minderung des Risikos aufgrund falscher Verbindungen.


Soweit ich weiß, hat NXP den I2C-Standard definiert, ohne eine Pinbelegung für I2C-Anschlüsse anzugeben. Die einzige Anleitung von NXP scheint eine Erwähnung zu sein, eine Erdung und / oder Vss zwischen SDA und SCL zu platzieren, wenn Vss / Gnd über die Verbindung übertragen werden.

Der Kauf verschiedener I2C-Module hat mich mit einer Vielzahl von I2C-Pinbelegungen zurückgelassen, und es war eine kleine Aufgabe, den Überblick über die verschiedenen kleinen Flachbandkabel-Schaltscheiben zu behalten, die ich für sie herstellen musste.

z.B

  • Mono-OLED-Modul: SCL, SDA, GND, 5V (offensichtlich nicht optimal, da Takt und Daten nebeneinander liegen.
  • Sensor Shield für Arduino: SDA, SCL, GND, 5V (wieder nicht ideal, plus geschaltete SCL/SDA)
  • Farb-LCD-Modul: SCL, GND, 5V, SDA (Juhu!)
  • No-Name-I2C-Repeater: SCL, 5 V, GND, SDA (autsch, sie haben die Power-Pins vertauscht! Fast hätte die Magie rauchen lassen.)

Meine Frage lautet also :
Gibt es eine endgültige / maßgebliche Richtlinie für die zu verwendende Pinbelegungssequenz des 4-poligen I2C-Anschlusses, bei der sowohl Vss als auch GND vom Host zum Gerät übertragen werden müssen?

Gibt es andernfalls ein Verzeichnis, wenn auch unvollständig, von I2C-Modulen / Geräten, in dem die Pinbelegung aufgeführt ist, die jedes übernommen hat?

Klarstellung: Suchen Sie nach Richtlinien wie "Vss näher an SCL heranführen, weil ..." und nicht nach einem definierten Standard, der eindeutig nicht existiert.

Jedes Gadget, das ich gesehen habe, hat unterschiedliche I2C-Pinbelegungen.
Daher die Frage.
Durch Ihre eigene Frage ist klar zu sehen, dass es keinen Standard gibt ... und wenn es einen gibt, folgen ihm die Leute offensichtlich nicht. Du steckst fest, Shims zu machen. :P
@TobyLawrence Dieser Kommentar hat meinen Tag aufgehellt! :-) Das Shim-Herstellen ist nicht so lästig wie das Shim-Tracking. Ich habe jetzt ganze 12 verschiedene Shims, jeweils zwei, weil ich nie den richtigen finden konnte, als ich ihn brauchte.
@AnindoGhosh heh. Wenn ich es wäre, würde ich wahrscheinlich die vorgekauften Module fallen lassen und meine eigenen Breakout-Boards mit einer standardisierten Pinbelegung und einem polarisierten Header rollen. Wahrscheinlich so etwas wie 6 Pins mit GND neben SDA, SCL und 5 V ... und dann die Verwendung eines Kabels mit drei verdrillten Paaren, um die Masse in der Nähe jedes Signals zu halten, um das Rauschen zu verringern und Interferenzen zu unterdrücken.
@TobyLawrence Für funktionierende Prototypen würden wir es noch besser machen: Verschieben Sie die Teile auf die Hauptplatine, eliminieren Sie die lästigen Zwischenstecker und verwenden Sie I2C wieder wie ursprünglich beabsichtigt für On-Board-Verbindungen. Allerdings stapele ich die Buchstabenblöcke im Vorfeld lieber, als sie zu basteln! :-)
Das wird albern. Ihnen wurde klar gesagt, dass es keinen Standard oder sogar einen allgemein verwendeten gibt. Komm darüber hinweg. Daran wird auch das wiederholte Stellen derselben Frage nichts ändern.
@OlinLathrop Wenn ich (a) wiederholt gestellt habe und (b) dieselbe Frage, ist das interessant. Von Anfang an hieß es in der Frage, dass es keinen Standard gibt, und suchte daher nach Fachwissen in Bezug auf eine Richtlinie (allgemein genug, ignorieren Sie, dass es sich um I2C handelt) ... was nicht "dieselbe Frage" ist, die Sie beantwortet haben. Und es ist eine einzelne Frage, ich habe sie nirgendwo anders gestellt, also kann es nicht "wiederholt" sein. Ich habe gerade ein Kopfgeld hinzugefügt.
Es scheint, dass einige Leute beleidigt sind, dass I2C eine beliebte Standardverbindungsoption für viele Module ist, die für Arduino-Benutzer verkauft werden. Auch wenn es nie für externe Board-Steckverbinder entwickelt wurde, ist es hier und es verkauft sich, und die Bitte um Anleitung, wie der Steckverbinder für neue Geräte besser hergestellt werden kann, ist für uns, nicht für Experten, nützlich, und es ist möglich, dass Experten dies nicht mögen.
@ExcitingProjects Nein, sie haben Recht mit dem, was sie sagen, I2C war nicht dafür gedacht und steht eindeutig vor mehreren Herausforderungen bei der Verbindung zwischen Geräten. Es ist nur Zufall, dass sich Moduldesigner für I2C entschieden haben. Ich wäre auch "beleidigt", wenn ich die Wahl hätte.
samepins.github.io/doc/i2c.html hat gute Vorschläge und Links zurück zu dieser Frage.

Antworten (7)

Ich habe kürzlich meine eigenen so weit wie I2C-Anschlüsse gerollt. Der Stecker selbst ist nicht sehr wichtig, im Moment verwende ich nur einen 100-mil-Pitch-Header (normalerweise weiblich an Bord, damit er nicht so eng ist, wenn er nicht angeschlossen ist), aber jeder 4-Plus-Pin-Stecker reicht aus. Außerdem verwende ich den P82B715von TI als I2C-Bus-Extender. Dies überwindet die Kapazitätsprobleme, die mit dem Laufen langer I2C-Abfälle von Bord verbunden sind, wofür I2C, wie gesagt wurde, ursprünglich nicht vorgesehen war. Ich habe viele verschiedene Kombinationen ausprobiert, wie in den Beispielen, die Sie gegeben haben, und ich habe absolut keinen Unterschied in der Leistung bemerkt. Ich glaube, das liegt daran, dass I2C relativ langsam ist und Interferenzen zwischen SDA und SCL kein großes Problem darstellen. Grundsätzlich ist die Anstiegszeit für Spannungen (wenn Störungen auftreten) auf dem Bus viel viel kleiner als eine Bitlänge. Das ist vielleicht nicht das, was Sie hören möchten, aber es bietet mehr Optionen. Persönlich habe ich mich für [VCC, SDA, GND, SCL] entschieden, um leicht zu / von diesem Chip geroutet zu werden und auch immun gegen eine VCC / GND-Verwechslung zu sein, wenn es rückwärts eingesteckt wird.

+1 +Akzeptieren. Danke, bisher wahrscheinlich die praktischste Antwort: "Interdevice I2C existiert, hier ist, wie ich es benutze und warum". Nützlich ist die VCC/GND-Verwechslungsvermeidung. Guter Punkt, um Pokey-Pin-Header an Bord zu vermeiden, ich habe versehentlich ein paar Pins von einigen Sensormodulen abgerissen.
Dies ist nur eine Antwort, die wirklich hilfreich ist, und wenn ich genug Ansehen habe, würde ich @Samuel dafür einen Bonus geben, und ich bevorzuge diese Frage, weil ich viele, viele I2C-Module habe und eines Tages I2C-Module nach diesen Anleitungen bauen werde.

Als er zum ersten Mal eingeführt wurde, war der I2C-Bus (Inter-Integrated Circuit) nur dazu gedacht, Chips auf einer einzigen PCB-Baugruppe zu verbinden. Es war nie beabsichtigt, auf Kabeln verwendet zu werden, um mehrere Platinen miteinander zu verbinden, und daher wurden keine Steckverbinder für diesen Zweck definiert.

Die einzigen "standardmäßigen" I2C-basierten externen Schnittstellen, die mir bekannt sind, sind der kurzlebige ACCESS.bus zum Anschließen von Benutzerschnittstellengeräten an Computer und der VESA Display Data Channel zum Abrufen von Monitorinformationen über VGA-, DVI- und HDMI-Anschlüsse.

Ich verstehe, dass der ursprüngliche Zweck ein anderer war, aber da I2C jetzt für viele kabelgebundene Module verwendet wird, hoffe ich, dass jemand eine kollaborative Datenbank zum Dokumentieren von Pinbelegungen erstellt hat, die von verschiedenen Produkten verwendet werden, insbesondere von den vielen Produkten, die darauf ausgerichtet sind der Markt für Arduino- und andere Mikrocontroller-Boards.

Viele Leute verwenden eine Art Steckverbinder, um I²C-Signale und Strom zwischen zwei Leiterplatten zu übertragen. Zum Beispiel,

  • der 10-polige UEXT-Anschluss führt I²C und +3,3 V Strom (und SPI);
  • der 10-polige iPack-Anschluss führt I²C und +5 V Strom;
  • der 4-polige Molex SEMCONN ACCESS.bus -Anschluss führt I²C und +5 V Strom;
  • Einige Leute verwenden die 8p8c-Anschlüsse und das CAT5-Kabel, die normalerweise für die physikalische Schicht von Ethernet verwendet werden, um stattdessen differentiell codierte I²C-Signale und +12-V-Strom ( I2C zuverlässig über Cat5 -Kabel senden ) oder verstärkte unsymmetrische I²C-Signale und +12-V-Strom ( der "Pond Electronics Bus" );
  • jeder HDMI- und die meisten DVI- und VGA-Anschlüsse und -Kabel übertragen DDC2-Daten über I²C;
  • ein paar weitere Steckverbinder, die I²C tragen, sind unter "I2C Bus Connectors & Cables" aufgeführt.

Einige allgemeine Tipps zur Übertragung von I²C-Signalen über längere Distanzen:

ps: Ich sehe, dass Wikipedia: I²C Circuit Interconnection diese Frage verlinkt hat.

Keine Standardbelegung, kein Standardstecker. Der I2C-Standard ist für solche Dinge nicht wirklich zugänglich. Es wird auf Busebene angegeben, nicht auf Geräteebene. Wenn Sie beispielsweise ein I2C-Gerät anschließen möchten, wissen Sie per Standard, ob sich die Pullups auf dem Host oder auf dem Gerät befinden? Nein. Viele andere Dinge, die Sie auch nicht wissen, wie z. B. wo Ihre Kabelkapazitäten sind, was Vcc sein muss ....

Tatsächlich gibt es sogar I2C-Geräte, die zusätzliche Leitungen für Interrupts und andere einfache alte digitale E/A benötigen. Wie fügen Sie diese dem Standard hinzu, wenn Sie sich nicht darauf einigen können, wie viele Stifte Sie benötigen?

Fazit: Wenn Sie nach Portabilität und Stabilität in Ihren Verbindungen suchen, sind I2C und SPI nicht das Richtige für Sie.

Was ist, wenn man nach einer Richtlinie für die Herstellung seines eigenen Geräts sucht, die mit all den anderen Modulen für das 'Duino' funktioniert (und gefällt)? Da ist ein Markt, sehe keinen Sinn darin, ihn zu ignorieren. Übrigens sind Klimmzüge laut Spezifikation am Host und optional am Gerät erforderlich.
Das "Schöne" an Standards ist, dass es so viele zur Auswahl gibt! Sie wählen einen Standard mit einem gut definierten Anschluss, wie MIDI, USB, RS232 (abgesehen von diesen dummen Nullmodem-Sachen) und bauen einen Übersetzer in Ihr eigenes Gerät ein. Die andere Möglichkeit besteht darin, eine Arbeitsgruppe für Standards durch eine Standardisierungsorganisation wie IEEE zu bilden. "Optionale" Pullups auf dem Gerät wirken sich auf das Verhalten des gesamten Busses aus und machen genau meinen Punkt. MIDI isoliert standardmäßig jedes Gerät optisch, sodass konforme Geräte diese Probleme nicht verursachen
+1 für den lustigen, aber so wahren Punkt über Standards! :-)

Es gibt zwar keine I²C-Pinbelegung oder einen Steckerstandard, aber es gibt einige Stellen, an denen I²C verwendet wird, die standardisiert sind. Einige, die mir in den Sinn kommen, sind Speichermodule (DIMM, SO-DIMM), Videoanschlüsse ( DDC in DVI , VGA ) und SM-Bus (ja, ihre Webseite sieht aus wie etwas, das ein Kind Mitte der 90er gemacht hat). Insbesondere der SM-Bus-Anschluss ist verschlüsselt und enthält nur I²C und Strom, aber SM-Bus bringt zusätzliche Einschränkungen mit sich, sodass technisch gesehen nicht jedes I²C-Gerät an einen tatsächlichen SM-Bus angeschlossen werden sollte. Es gibt auch einige weitere proprietäre Stecker, wie z. B. Lego NXT-Sensoren.

Es ist eine Selbstverständlichkeit, dass es keinen Standard gibt ... Was ich mir erhoffe, ist eine kanonische Sammlung von Richtlinien, denen Gerätedesigner dann folgen könnten. SMBus hat beispielsweise die +5V-Leitung außen, während NXP empfiehlt, dass sowohl +V als auch GND zwischen den Signalspuren liegen. Welcher Weg ist besser und warum?

Wie üblich für jeden Beitrag, der fragt, warum etwas [nicht] standardisiert ist:
Glücklicherweise wurde das Aufladen jetzt gelöst, da wir alle auf Mini-USB standardisiert sind.  [Oder ist es Micro-USB?  Scheisse.
Von XKCD

Wenn Sie die Frage oder die vielen Kommentarthreads sorgfältiger gelesen hätten, hätten Sie vielleicht bemerkt, dass es sich nicht um einen Standard handelt , sondern um eine Sammlung von Weisheiten in Form von kanonischen Richtlinien.
@AnindoGhosh - Ich sehe nicht, wie das einen Unterschied macht. Wenn Sie im obigen Comic Standard durch Richtlinie ersetzen, ist dies gleichermaßen gültig. Jede Situation, in der es mehrere Möglichkeiten gibt, etwas zu tun, führt im Allgemeinen dazu, dass viele Menschen das Gesagte auf verschiedene Arten tun. Auch wenn es kein formaler "Standard" ist.

Es gibt keine Norm.

Es gibt keine gemeinsame Praxis.

In Bezug auf Probleme, selbst zu entscheiden, was zu tun ist:

  1. Halten Sie die Signale auf einer Platine so, wie sie ursprünglich vorgesehen waren. Die IIC-Leitungen haben eine ziemlich hohe Impedanz, sind unsymmetrisch und daher anfällig für Rauschen und werden Übertragungsleitungen nicht gut abschließen. IIC ist einfach nicht dafür gedacht, von Bord zu gehen.

  2. Wenn Sie sowieso von Bord gehen, halten Sie den Bus kurz. Ein paar Zentimeter sind wahrscheinlich in Ordnung. Ein Meter oder mehr verlangt wirklich nach Ärger.

  3. Halten Sie Off-Board-Linien von Lärmquellen fern. Wickeln Sie sie zum Beispiel nicht um einen Motor und versuchen Sie nicht einmal, sich einem zu nähern.

  4. Verwenden Sie einen Stecker, der nicht rückwärts angeschlossen werden kann. Wenn jemand es rückwärts einstecken kann, wird es jemand tun.

  5. Das Flachbandkabel ist wahrscheinlich am einfachsten zu verwenden. Sie benötigen mindestens drei Drähte, SCL, SDA und Masse. Das Hinzufügen von Strom ist wahrscheinlich eine gute Idee. Stellen Sie in jedem Fall sicher, dass das Erdungskabel zwischen SCL und SDA liegt, um Übersprechen zu vermeiden. Das Stromkabel sollte nicht laut sein, also kleben Sie es auf eine Seite, es spielt keine Rolle, welche.

  6. Nachdem Sie mit Anschlüssen herumgespielt und potenziellen Problemen nachgejagt sind, stellen Sie fest, dass Punkt 1 eigentlich der einzige war, den Sie wissen mussten.

Also müssen wir den Kopf in den Sand stecken für all die Hunderte von I2C-Dingen, die Leute für Anfänger von Arduino und anderen Mikrocontrollern hergestellt und verkauft haben?