Forum: Mikrocontroller und Digitale Elektronik Design eines hotplugfähigen I2C-Bussystems und Auswahl des Steckverbinders


von Stefan W. (sephalon)


Lesenswert?

Hallo zusammen,

ich benötige Hilfe beim Design eines Bussystems für ein Spiel an dem ich 
gerade arbeite. Ich muss dafür zuerst ein bisschen ausholen um meine 
Anforderungen möglichst genau zu beschreiben:

Ich möchte 12 Modulsteckplätze der Größe 130 x 130 x 60 mm in einen 
Koffer einlassen, wobei die Hälfte der Steckplätze vorne und die andere 
Hälfte auf der Rückseite jeweils in einer 2 x 3 Konfiguration angeordnet 
sind. Aufgrund der Größe soll als „Backplane“ keine Leiterkarte, sondern 
Flachband- oder Twisted-Pair-Kabel zum Einsatz kommen.

Der Steckverbinder soll über +5 V und +3,3 V für die Stromversorgung, 
Masse, die eigentlichen Bussignale (dazu später mehr) sowie über eine 4 
Bit breite Adresse verfügen, welche über ein Widerstandsnetzwerk auf 
Backplaneseite eingestellt wird. Das Modul soll diese Adresse auslesen 
und basierend darauf seine eigene Busadresse festlegen. Der „Game 
Controller“, welcher ein Modul wie jedes andere ist und in einen 
beliebigen freien Steckplatz gesteckt werden kann, probiert dann beim 
Spielstart die Adressen der verbliebenen 11 Steckplätze durch und fragt, 
falls der Steckplatz belegt ist, nach der Modul-ID (es gibt verschiedene 
Modultypen, aber das führt hier zu weit). Neben den 12 Steckplätzen gibt 
es eine Reihe weiterer fixer Busteilnehmer (noch unklar wie viele genau, 
aber nicht mehr als ein Dutzend) sowie ein batteriebetrienes 
Energiemodul, welches den Bus mit Strom versorgt.

Die Module müssen hotplugfähig sein, und zwar in dem Sinne dass Module 
ein-/ausgesteckt werden können während der Bus mit Strom versorgt wird. 
Sobald das Spiel gestartet wurde und der Game Controller den Status 
aller Steckplätze abgefragt hat, kann das Ein-/Ausstecken von Modulen 
als Bedienfehler gewertet werden, auch wenn es vorteilhaft wäre, wenn 
das System anschließend nicht in einen undefinierten Zustand geraten 
würde.

Die Last auf dem Bus ist sehr gering, da Aktivität ausschließlich durch 
Benutzerinteraktion getriggert wird und die Nachrichten nur wenige Bytes 
lang sind. Ich brauche allerdings Multi-Master-Unterstützung; während 
der Game Controller zunächst als alleiniger Master agiert und die Bus 
Discovery durchführt, kann nach Spielstart jedes Modul selbst zum Master 
werden und den Game Controller kontaktieren.

Das einfachste und kostengünstigste Bussystem für diese Aufgabe scheint 
erst einmal I2C zu sein. Mir ist bewusst, dass I2C nicht für lange 
Buslängen und Hotplugging geeignet ist, aber es sieht so aus als könnte 
man mit einem hotplugfähigen Bus-Puffer wie dem TCA9511A [1] auf jedem 
Modul diese Einschränkungen überwinden. Mich beunruhigt allerdings ein 
bisschen Abschnitt 9.2.1.2, „Multiple connections to a common node“, der 
relativ schwer verständlich ist und keine wirkliche Aussage darüber 
macht, wie man den beschriebenen Effekt abmildern kann. Gibt es jemanden 
der Erfahrung im Design von hotplugfähighen I2C-Bussystemen hat und eine 
Aussage darüber machen kann ob mein Ansatz funktionieren kann, 
insbesondere wenn ich ein ganzes Dutzend hotplugfähige Modulsteckplätze 
brauche?

Falls I2C aus irgendeinem Grund ausfällt, hätte ich am ehesten an CAN 
als Alternative gedacht. Allerdings habe ich mir dazu noch wenig 
Gedanken gemacht; welches Bussystem wäre sonst noch für meine 
Anforderungen (insbesondere im Hinblick auf Hotplugging) geeignet?

Jetzt zu den Steckverbindern: Es ist wichtig, dass die Modulverbinder 
mindestens einige 1000 Steckzyklen durchhalten, denn jedes Mal wenn das 
Spiel neu gestartet wird werden die Module umgesteckt. AFAIK brauche ich 
für Hotplugging zwingend einen gestaffelten Steckverbinder (so wie in 
Abb. 3 in „I2C Solutions on Hot Swap Applications“ [2] beschrieben). Ich 
würde gerne zwei separate Steckverbinder benutzen – einen für die 
Stromversorgung und die Bussignale, den anderen für die Moduladresse – 
damit die Verbindung mechanisch stabiler wird. Idealerweise hätte die 
Steckverbindung genügend Haltekraft um das Modul gegen die Schwerkraft 
und Rütteln im Steckplatz zu halten, aber ich bezweifle dass das möglich 
sein wird; deswegen werde ich wahrscheinlich noch einen mechanischen 
Rückhaltemechanismus zusätzlich benötigen.

Leider habe ich ziemliche Schwierigkeiten, einen geeigneten 
Steckverbinder zu finden. Meine erste Wahl war Samtecs Edge Rate [3], 
aber es scheint davon keine gestaffelte Version zu geben, oder zumindest 
kann ich sie nicht finden. Eine Alternative wäre, meinen eigenen 
Platinenrandstecker zu entwickeln und diesen z.B. mit einer Edge Card 
[4] Buchse zu kombinieren. Mein bisheriger Wissenstand ist allerdings, 
dass Platinenstecker generell nicht besonders zyklenfest sind, aber 
handfeste Zahlen konnte ich bisher nicht finden. Hat hier jemand 
Erfahrungswerte und/oder Empfehlungen?

Danke und Grüße

Sephalon

[1] https://www.ti.com/lit/ds/symlink/tca9511a.pdf

[2] https://www.ti.com/lit/an/scpa058/scpa058.pdf

[3] 
https://www.samtec.com/connectors/backplane/micro-backplane-systems/edge-rate

[4] https://www.samtec.com/connectors/edge-card

von Route_66 H. (route_66)


Angehängte Dateien:

Lesenswert?

Stefan W. schrieb:
> Das einfachste und kostengünstigste Bussystem für diese Aufgabe scheint
> erst einmal I2C zu sein.

Nein.
Für mich ist es 1Wire von Dallas als iButton.

von Stefan W. (sephalon)


Lesenswert?

Route_66 H. schrieb:
> Nein.
> Für mich ist es 1Wire von Dallas als iButton.

Danke, aus irgendeinem Grund habe ich 1-Wire bisher nicht in Erwägung 
gezogen, obwohl es meine Anforderungen eigentlich fast alle erfüllen 
würde!

Der einzige Wermutstropfen ist, dass Multi-Muster-Betrieb von 1-Wire 
nicht unterstützt wird. Allerdings bin ich bei meinen weiteren 
Recherchen auf PJON [1] (bzw. PJDL [2] im Speziellen) gestoßen, welches 
genau dieses (und noch einiges mehr) kann. Am Osterwochenende werde ich 
mir das mal genauer anschauen; dieses Video [3] macht jedenfalls schon 
mal einen sehr guten Eindruck.

[1] https://www.pjon.org/

[2] https://www.pjon.org/PJDL-specification-v4.0.php

[3] https://www.youtube.com/watch?v=GWlhKD5lz5w

von Stefan F. (Gast)


Lesenswert?

Stefan W. schrieb:
> Der einzige Wermutstropfen ist, dass Multi-Muster-Betrieb von 1-Wire
> nicht unterstützt wird.

Mach dir nichts draus. Bei I²C ist Multi-Master Betrieb so 
problematisch, dass ihn fast niemand nutzt.

von Peter D. (peda)


Lesenswert?

Stefan W. schrieb:
> Ich brauche allerdings Multi-Master-Unterstützung

Da Du ja keine riesen Datenvolumen hast, kann der Master auch leicht 12 
Slaves pollen.
Meine Erfahrung ist, das leider viele MC-Entwickler unfähig sind, den 
I2C-Standard zu lesen, zu verstehen und korrekt zu implementieren.
Bezüglich Multimaster hatte ich nur mit original Philips einwandfreie 
Funktion erzielt (P87C751, P80C652, P89C668), sind aber alle 
ausgelaufen.

Ich würde die Module nur mit einer Spannung versorgen und die 12 Module 
mit einem Widerstand am ADC adressieren. Dann kommt man mit 5 Leitungen 
aus (GND voreilend). Für hohe Steckzyklen eignen sich 
Rundsteckverbinder.

von Patrick C. (pcrom)


Lesenswert?

Es ist mir noch nicht ganz deutlich was ein Module machen soll.
Wenn es nur um identifizierung geht wo was angeschlossen ist, kann man 
wie genennt 1-wire benutzen wobei jeder chip ein unique ID hat. Die 
braucht man nur einmal (bei initalisierung der game) im main prozessor 
fest zu legen.

Was musz das modul witer noch machen ?
Kommen da zB leds oder so auf ?
Warum 3V3 und 5V, warum 4 bit adresse ?

Gruesze Patrick aus die Niederlaende

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.