Sinnvoller Standard-Verdrahtungstyp für Langstrecken-I2C

Ich plane die Verbindung mit einigen Sensorgeräten über I 2 C über einen langen Bus, wobei die Geräte alle 2 m oder so verkettet sind, insgesamt bis zu 16 m. Ich habe hier andere Fragen gesehen , die sich darauf beziehen, von "Welches Protokoll soll ich verwenden?" Winkel, aber ich interessiere mich mehr für die tatsächliche Verkabelung.

Meine Hauptanforderungen sind:

  • Die Verkabelung muss etwas sein, das eine technisch nicht versierte Person bei einem allgemeinen Einzelhändler wie Amazon oder eBay erwerben kann. Vorzugsweise etwas Offensichtliches und Bekanntes wie USB, CAT5 oder S-Video.
  • Stecker sollten so günstig wie möglich sein - ich versuche die einzelnen Sensorplatinen so günstig wie möglich zu machen.
  • Maximale Stabilität, wenn möglich.
  • Ich versuche, das Hinzufügen zusätzlicher Teile zu vermeiden, daher sollten Fälle, in denen ich Dinge wie differenzielle Leitungstreiber benötige, nach Möglichkeit vermieden werden.

Die Geräte werden wahrscheinlich mit 5-V-Logik betrieben.

Gibt es einen idealen Verkabelungstyp für so etwas?

2m ist nicht so schlimm, aber ich frage mich, ob Sie I2C-Pufferchips auf jedem Gerät bekommen können, die die Kette in nur 2m-Blöcke mit voller Treiberpufferung bei jedem Schritt aufteilen?
und in dieser Situation würde ich CAT5-Ethernet oder Telefonkabel verwenden
Ihre Wahl von I2C hat Konsequenzen. Wenn ich wollte, dass dies wirklich kostengünstig ist, würde ich zuerst nach billig verfügbaren Kabeln / Steckern suchen, dann nach einem billig implementierbaren Protokoll. CAt5-Verkabelung einschließlich Stecker ist billig, aber ich würde I2C nicht als optimales billiges/zuverlässiges Protokoll für solche Entfernungen wählen.
@WoutervanOoijen Leider sind meine einzigen zwei Möglichkeiten für den Sensor I2C und SPI, und letzteres würde aufgrund der großen Reichweite 13 Drähte erfordern. Die Umstellung auf alternative Protokolle ist mühsam, da zusätzliche Komponenten erforderlich sind, was die Kosten pro Platine erhöht.
@KyranF Die I2C-Puffer sehen vom Leistungsstandpunkt aus ideal aus, und ich habe sie in Betracht gezogen, aber das Hinzufügen eines auf jeder Platine würde meine Kosten um mindestens 30% erhöhen. Ich versuche sie zu vermeiden, um die Kosten zu senken.
Ich habe einige für 1,7 CAD oder 0,73 CAD in Einheiten von 1000+ gefunden, und die Vorteile, sie für Dinge wie elektrische Isolierung (Sie können auch optoisolierte bekommen) und Pegelverschiebung zu bekommen, sind großartig ... für eine hervorragende Störfestigkeit können Sie Führen Sie einige davon mit 15 V I2C aus und schalten Sie dann nach unten
oh und hast du One Wire untersucht? 1-Draht-Strings von Geräten sind cool, und Sie können mit FETs ziemlich starke Klimmzüge machen, um sehr große Entfernungen zu erreichen, aber ich bin mir nicht sicher, wie hoch die Datenraten sind
@polynomial Was versuchen Sie zu erkennen, dass nur I2C und SPI verfügbar sind, und woher wissen Sie, dass ein uC auf jedem Board teurer ist als andere Lösungen, wenn Sie die anderen Lösungen noch nicht kennen? Beispielsweise ist ein kleiner uC billiger als ein I2C-Puffer. Beim Systemdesign sollten Sie nicht zuerst „kleine“ Entscheidungen treffen: Machen Sie sich ein Gesamtbild für alle Alternativen, dann können Sie entscheiden.
Ich musste einen I2C-Bus weit über die Größe und den Anwendungsfall hinausschieben, für den er vorgesehen ist. Es war schwer, zuverlässig Zuverlässigkeit zu erreichen: Erinnerungen an einen überwucherten I2C-Bus . Beim nächsten Mal verwende ich einen Differentialbus für lange Reichweiten.
@NickAlexeev Ich habe dieses Problem in einem anderen Projekt gelöst, indem ich einige billige bidirektionale LVDS-Puffer-ICs verwendet habe. Bei SPI ist es sogar noch billiger, da Sie nur ein Paar unidirektionaler LVDS-Puffer benötigen.

Antworten (2)

I2C ist in gewisser Weise ein sehr ordentliches Protokoll, aber sein Designzweck besteht darin, Geräte auf einer einzigen Platine miteinander zu verbinden. Sogar über Probleme der Signalisierungspegel hinaus gibt es einige Protokollprobleme, die Probleme bei der Verwendung für Multi-Board-Kommunikation aufwerfen können.

Nehmen wir beispielsweise an, dass zwei Slave-Geräte angeschlossen sind, die es einem Master ermöglichen würden, eine beliebige Anzahl von Bytes zu lesen, und die für eine beliebige Anzahl dieser Bytes Null zurückgeben können. Wenn, während ein Gerät Daten an den Master sendet, ein zweites Gerät einen Teil der Daten fälschlicherweise als "START"-Folge gefolgt von seiner Leseadresse interpretiert, wäre es möglich, dass für jeden nachfolgenden Taktzyklus mindestens eines der Geräte fehlt um ein Datenbit "0" auszugeben. Ein solches Szenario würde es dem Master unmöglich machen, jemals wieder die Kontrolle über den Bus zu erlangen. Während es möglich ist, Single-Board-Kommunikation so zu gestalten, dass Streuimpulse "einfach nicht passieren", ist dies oft nicht machbar, wenn viele Geräte angeschlossen werden. Man kann versuchen, die Wahrscheinlichkeit des Auftretens von Streuimpulsen zu minimieren, Sie sollten jedoch nicht erwarten, sie vollständig zu vermeiden. Es kann akzeptabel sein, dass ein Sensormesswert einmal im Monat aufgrund eines Streuimpulses beschädigt wird, aber wenn das System einmal im Monat gesperrt wird, ist dies wahrscheinlich weniger der Fall.

Wenn Sie ein Single-Master-Setup verwenden, würde ich vorschlagen, dass es sich lohnen könnte, separate Drähte für den SDA-Ausgang zu den Slaves und den SDA-Return zu verwenden. Wenn die Slaves Handshaking verwenden, kann es sich lohnen, dasselbe für SCK zu tun. Der Ausgang des Masters könnte dann aktiv hoch und niedrig getrieben werden (anstatt aktiv niedrig getrieben und passiv hoch gezogen zu werden). Wenn die Anschlüsse "Ein"- und "Aus"-Seiten bezeichnet hätten, könnte jede Platine in der Kette die Rückkehr vom vorherigen Gerät mit dem Pin-Zustand ihres eigenen Geräts "UNDen" und aktives High-and-Low in der Rückkehrrichtung ausgeben sowie. Ein solches Design würde wahrscheinlich die Verwendung eines Bit-Bang-Masters anstelle eines Hardware-Masters erfordern, aber angesichts der Tatsache, dass Software-Master-Implementierungen oft eine bessere Fehlerwiederherstellung leisten können als Hardware-Master, die das nicht sollten.

Zusätzlich zu der verbesserten Robustheit, die sich aus dem Active-High/Active-Low-Antrieb ergibt, vermeidet die Verwendung separater Ausgangs-/Rückleitungsdrähte für SDA die Möglichkeit, dass ein Slave-Gerät die Versuche des Masters stört, ein anderes Gerät zum Schweigen zu bringen, da selbst wenn alle aber ein Slave-Gerät wollte Low auf SDA ausgeben, der Master hätte kein Problem damit, einen Low-to-High-Übergang am SDA-Pin des letzten verbleibenden Slaves zu erzeugen.

Wenn Sie die zusätzlichen Drähte nicht verwenden möchten, um den SDA-Ausgang von der SDA-Rückgabe zu trennen, wäre es möglich, die Slaves so zu verdrahten, dass ihre Pulldown-Stärke auf SDA begrenzt ist, und den Master so zu verdrahten, dass er den sicher überwältigen kann Sklaven. Dies würde im Falle einer Slave-Fehlfunktion eine saubere Wiederherstellung ermöglichen, aber nicht die Vorteile der Signalreinheit bieten, die die Verwendung separater Drähte mit sich bringt. Außerdem würde es nur dann gut funktionieren, wenn kein Handshaking verwendet wird. Ein robuster I2C-Betrieb erfordert, dass die Übergänge auf SCK und SDA um eine Zeit getrennt werden, die über dem ungünstigsten Übertragungsversatz liegt. Wenn der Master die alleinige Kontrolle über SCK hat, kann er dies sicherstellen. Slaves, die Handshaking verwenden, können jedoch asynchron Ereignisse auf SCK und SDA generieren, ohne dass der Master deren Trennung steuern kann.

Meine bevorzugte Wahl, um eine solche Blockierung zu vermeiden, wäre, den Master periodisch oder vielleicht bei Erkennung eines solchen Problems oder sogar zu Beginn jedes Messzyklus die Stromversorgung unterbrechen zu lassen.
@WoutervanOoijen: Die Eignung eines solchen Ansatzes kann von der Art der Sensoren und dem, was sie melden, abhängen. Beispielsweise kann von einem Rotationssensor erwartet werden, dass er die Gesamtstrecke meldet, die sich eine Welle gedreht hat; Das Abschalten eines solchen Sensors würde dazu führen, dass er alle Zählwerte verliert, die aufgetreten sind, während er ausgeschaltet war. Während I2C ohne Handshake in einer Multidrop-Konfiguration robust gemacht werden kann, indem der Master das relative SDA/SCK-Timing steuert, würden die meisten prozessorgesteuerten I2C-Slave-Implementierungen Handshaking erfordern.
Dies zu akzeptieren, weil es mich veranlasste, mich in die Zeitdiagramme und andere Lösungen für Fernbusse einzulesen. Am Ende war es möglich, die Busgeschwindigkeit auf etwa 50 kHz zu senken und ein paar Meter zuverlässig über USB-Kabel zu erreichen, solange ich an jedem Gerät bidirektionale Logikpegelumsetzer hatte, um sicherzustellen, dass Spannungsabfall kein Problem wurde. In einem späteren Projekt habe ich bidirektionale LVDS-Puffer-ICs für eine bessere Signalintegrität verwendet, wobei CAT5 verwendet wurde, um die differentiellen Paare zu übertragen. Dies kann auch auf SPI angewendet werden.

Folie 68, Seite 25 aus AN10216:

Blatt68

Obwohl es vielleicht nicht ideal ist, wird dies von Philips empfohlen (meine Version des Dokuments ist vom März 2003). Twisted-Pair-Telefonkabel.