Hallo liebe µC-Community, ich arbeite gerade an einem Projekt, für das ich einen µC mit bis zu 8 Zusatzmodulen flexibel per I²C verbinden will. Gefragt ist eure Meinung zur beabsichtigten Umsetzung!: Jedes Modul in sich braucht selbst vier interne I²C-Strecken (doppelte Adressen von Bauteilen), daher war meine Idee jedes Modul mit einem I²C-Expander (z.B. https://www.ti.com/lit/ds/symlink/tca9548a.pdf) auszustatten. Anschließend können alle Module über einen gemeinsamen I²C-Bus parallel verbunden werden. Damit ich nun auf jeden Unterkanal jedes I²C-Expanders zugreifen kann, brauchen die I²C-Expander ja aber je eine unterschiedliche Adresszuweisung, also ihren eindeutigen Wert zwischen 0b000 und 0b111 für die Adresspins A2, A1 und A0. Meine spannende Frage an euch: Wie würdet ihr so etwas umsetzen, um auch den DAU (dümmster anzunehmender User) nicht zu verwirren, sodass dieser nicht selbst in binär rechnen muss und DIP-Switches oder Jumper verändern muss? Insbesondere, da ja eine fehlerhafte Einstellung (Doppelbelegung der Adressbits) zu simultan antwortenden I²C-Expandern führen würde, welche die Kommunikation und Fehlererkennung unmöglich machen? Meine Idee wäre bei der Verkabelung der Module immer drei "Adresspins" mitzuführen, wobei jedes Modul die eingehenden Adresspins direkt an den internen I²C-Expander weitergibt. Um die Adresspins des nächsten Moduls zu bestimmen, werden die eingehenden Adresspins als Binärzahl auswertet und 1 addiert. So bekommt das nächste Modul automatisch die nächsthöhere I²C-Adresse und der Nutzer muss nichts denken. Konkretes Beispiel, wer es nicht abstrakt durchdenken will: Das Mastermodul schickt die Adresspins A0: GND, A1: GND und A2: GND (0b000) an das erste Modul der Reihe raus. Diese Adresspins verwendet Modul 1 als Adresspins für den I²C-Expander (0b000), addiert 1 dazu und gibt den inkrementierten Wert A0: GND, A1: GND und A2: VDD (0b001) an das nächste Modul der Reihe. Die inkrementierten Adresspins verwendet Modul 2 wieder als Adresspins für den I²C-Expander (0b001), addiert wieder 1 dazu und gibt den inkrementierten Wert A0: GND, A1: VDD und A2: GND (0b010) an das nächste Modul der Reihe. So geht es durch, bis Modul 8 als letztes Modul der Reihe die Adresspins A0: VCC, A1: VCC und A2: VCC (0b111) bekommt. -------------------- Nun die zwei konkreten Fragen: 1. Zur Umsetzung der binären Addition würde ich spontan zu Logik-Gates greifen. Je eines für die XOR-Operation (z.B. https://www.ti.com/cn/lit/ds/symlink/sn74ahct86.pdf) und eines für die AND-Operation für den Bit-Overflow (https://datasheet.lcsc.com/lcsc/2006241032_Nexperia-74HC08D-653_C5593.pdf). Das geht, sind aber halt 2 ICs und wirre Verkabelung. Deutlich schöner wäre daher wohl sowas: https://www.ti.com/lit/ds/symlink/cd54hc283.pdf und ich verwende als zweite Binäradresse zum Addieren 0b0001, dann habe ich das Ergebnis. Spricht gegen beide Konzepte etwas in der Praxis? Denkfehler vorhanden? 2. Habt ihr komplett andere Ansätze, wie ihr die Modularisierung und flexible Adressierung in Produkten lösen würdet? Gibt es elegantere Wege? Hoffe ich habe es gut genug beschrieben, Skizze ist jetzt zusätzlich im Anhang. Vielen Dank für Euer Input :-).
:
Bearbeitet durch User
Mit 8 Teilnehmern kann man die doch hart addressieren?
Die Idee ist das Angebot verschiedener Modultypen, die der Anwender flexibel kombinieren kann. Daher nein. Sonst würde die Flexibilität beim Kombinieren der Module (evtl. auch acht mal identischer Typ) verloren gehen.
Es gibt auch I²C-Switches mit vier Kanälen (TCA9544/5/6A). Robin U. schrieb: > 1. Spricht gegen beide Konzepte etwas in der Praxis? Nein. > 2. Gibt es elegantere Wege? Wenn die Module einen Mikrocontroller haben: Die I²C-Verbindung zum nächsten Modul geht auch durch einen Switch (ein freier Kanal, oder SN74LVC2G66). Beim Starten ist die Adresse 0, und die Verbindung zum nächsten deaktiviert. Der Master sendet eine Nachricht, um die Adresse auf eine eindeutige (1-7) zu ändern und die nächste Verbindung einzuschalten. Wenn die Module keinen Mikrocontroller haben, kann man etwas ähnliches mit einem I/O-Expander (z.B. TCA9536/7 oder TCA6408A) bauen.
Das ist doch ein Arduinohirnfurz. Wenn Kollisionen zu befuerchten sind: Nimm einfach einen Controller mit genuegend I2C Ports. Reicht es dann immer noch nicht: Nimm einen FPGA und mach das I2C mit dem. Ansonstren sollte man den I2C-Bus da benutzen wo er hingehoert: Also z.B. bei einem Tuner den Kanal umschalten, oder laut und leise drehen. Oder in einem Servernetzteil in grosszuegigen Intervallen die Spannungen, Stroeme, etc. messen und das Dingens aus- und einzuschalten. Oder als SMBUS in Rechnern irgendwelche Sensoren abzuklappern. Bei all diesen Kontruktion steht bereits nach der Designphase fest, welche Resourcen/Adressen belegt werden. Universell und Modular braucht da keiner.
Robin U. schrieb: > Wie würdet ihr so etwas umsetzen, um auch den DAU (dümmster > anzunehmender User) nicht zu verwirren, sodass dieser nicht > selbst in binär rechnen muss und DIP-Switches oder Jumper > verändern muss? Es gibt so nette kleine Drehschalter, da kann man von 0 bis 7 einstellen und die liefern Dir direkt die Umrechnung nach binär. > Insbesondere, da ja eine fehlerhafte Einstellung > (Doppelbelegung der Adressbits) zu simultan antwortenden I²C- > Expandern führen würde, welche die Kommunikation und > Fehlererkennung unmöglich machen? Wie verhinderst Du, daß Deine Nutzer auch mal eine Kette von neun (oder noch mehr) Modulen anschließen, wenn Du doppelt vergebene Adressen nicht erkennen kannst? Warum nicht gleich am Hauptmodul 8 (5-polige) Steckverbinder, dann ist dieses Maximum sichergestellt und Du kannst jeden Steckverbinder auf eine fixe Adresse einstellen.
8 Module mit jeweils 4 Slaves an längeren Leitungen. Also bis zu 32 Slaves. Das soll alles noch funktionieren? Nach meiner Erfahrung wird das alles sehr unstabil. Da werden elektrische Pegel nicht erreicht, manchmal geht es manchmal nicht. Und der unbedarfte Enduser wundert sich nur. Ich würde das Konzept nicht weiter verfolgen.
Wird der Bus durchgeschleift oder ist ein Bus und die werden Paralell dran gehängt? Wenn durchgeschleift, einfach immer die Adresse um eins erhöhen, das geht problemlos, wie in deinem Bild gezeigt. Oder eben die BCD Switche wie es [mIstA (Gast)] geschrieben hat.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.