Forum: Mikrocontroller und Digitale Elektronik TCA9548A Dynamische Addressbits für I²C Expander


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Robin U. (ulro)


Angehängte Dateien:

Lesenswert?

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
von Dirk U. (Firma: ----) (dirk_u)


Lesenswert?

Mit 8 Teilnehmern kann man die doch hart addressieren?

von Robin U. (ulro)


Lesenswert?

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.

von Clemens L. (c_l)


Lesenswert?

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.

von IQ140 (Gast)


Lesenswert?

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.

von mIstA (Gast)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

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
Noch kein Account? Hier anmelden.