Forum: Mikrocontroller und Digitale Elektronik I2C Leitungen schalten


von Mathias O. (m-obi)


Lesenswert?

Hallo,

ich hab folgendes vor. An einem AVR (Master) sind mehrere andere AVR's 
(Slaves) angebunden per I2C. Das ganze ist Modulartig auf einer 
Hutschiene aufgebaut. Die Kommunikation soll dabei über einen 
Rückwandbus laufen. Am Anfang haben alle Slaves die Adresse 0. Nun 
sollen die Slaves die I2C-Weiterleitung zum nächsten Slave unterbechen 
können. Damit der Master nacheinander die neuen Adressen zuweisen kann. 
Und damit er auch weiß, an welcher Stelle wer sitzt.
Kann man nun die Leitung des I2C einfach über Mosfets schalten oder gibt 
es da spezielle Sachen von TI oder NXP?

von Peter D. (peda)


Lesenswert?

Analog Schalter 74HC4066

von Ulrich F. (Gast)


Lesenswert?

Sorry, ich halte die Idee für ziemlich XXXX....

Verpass jedem Ding einen Dipschalter,
Oder mach die Codierung in den Steckern...

I2C ist ein Bussystem, und wenn du da drin rumfurwerkst, mit FETs und 
so, solltest du dir überlegen, ob I2C überhaupt das richtige für diesen 
Zweck ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mathias O. schrieb:
> oder gibt es da spezielle Sachen von TI oder NXP?

Natürlich.

Such Dir was aus:

http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_multiplexers_switches/#products

von (prx) A. K. (prx)


Lesenswert?

Mathias O. schrieb:
> Kann man nun die Leitung des I2C einfach über Mosfets schalten

Im Grunde schon, und es sollte ausreichen, SDA abzuschalten, da es ohne 
SDA keine Start Condition gibt.

Beachte, dass MOSFETs aufgrund der Body-Diode nur in eine Richtung 
abtrennen. Was dabei rauskommt ist die als I2C-Pegelwandler bekannte 
MOSFET-Schaltung, die hier mit Gate auf GND abkoppelt: 
http://www.nxp.com/documents/application_note/AN10441.pdf

Wirst allerdings verteilte Pullups brauchen, da jedes Segment einen 
eigenen benötigt.

von Frank (Gast)


Lesenswert?

Bei Bussystemen gibt es das Problem der Auto Adressierung doch öfters.
Kenne mich da zwar nicht aus, auf die schnelle habe ich das hier 
gefunden:
https://de.m.wikipedia.org/wiki/ALOHA

von (prx) A. K. (prx)


Lesenswert?

Frank schrieb:
> https://de.m.wikipedia.org/wiki/ALOHA

Da geht es nicht um die Adressierung, sondern um einen 
Multimaster-Zugriffsverfahren. Was ich bei I2C nicht empfehlen würde.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Hi Mathias
die Idee hatte ich auch schon, aber jeder sagt, so wie Ulrich auch, das 
das nicht geht.

Ich wollte mir so ein Chip mit Enable nehmen, wie PCA9515A.
Es gibt ja auch welche mir Rückmeldung zum 2. Bus, wie der PCA9510A da 
erkennt der im 2. Bus, ob er mit dem Ersten verbunden ist.

Oder einen Hub wie PCA9516A (5x) wo die anderen Geräte dran kommen.
Hier ist die Adressvergabe sehr einfach. :-)

Habs leider nie testen können.

von (prx) A. K. (prx)


Lesenswert?

Stephan schrieb:
> sagt, so wie Ulrich auch, das
> das nicht geht.

Hat er nicht geschrieben. Er hält es nur für Unsinn.

von Stephan (Gast)


Lesenswert?

ok, Unsinn halt, sorry

von Mathias O. (m-obi)


Lesenswert?

Danke erstmal für die hilfreichen! Antworten.

Ulrich hat nur gesagt, dass er es für XXXX.... hält. Das kann auch 
genial heißen ;).

Aber wenn Jeder sagt, dass es nicht geht. Dann müssen die das ja auch 
getestet haben.

Also da ich nur I2C und 24V/GND durchschleife, muss jedes Modul seine 5V 
selber erzeugen, somit muss auch jedes Modul seine eigenen Pullups 
drinhaben. Ist das soweit richtig?

Ich denke mal der PCA9515A reicht bei mir. Nur steht da, das ich den 
nicht in Serie betrieben kann. Heißt das, das der doch nicht für mich in 
Frage kommen kann?

von Ulrich F. (Gast)


Lesenswert?

Stephan schrieb:
> ok, Unsinn halt, sorry

Yes!
Unsinn ist eine freundliche Übersetzung meiner XXXX.

Wenn dir die Position im Netz soooo wichtig ist, dann versuche es doch 
mal mit Token Ring.
Ist über die UARTs der AVR recht einfach machbar, und die "Position" ist 
fest eingebaut.
Es geht doch nix über Ringelrein, Händchen an Händchen, nur nicht los 
lassen...

von Tcf K. (tcfkao)


Lesenswert?

Im Prinzip kannst Du über einen guten, niederohmigen Analogschalter eine 
der Leitungen (z.B. SDA) zum nächsten Slave per Power-On-Default 
abtrennen.
Dem ersten Slave nach Power-On die Adresse zuteilen, und dezidiert den 
Analogschalter auf diesem Board einschalten. Dann dem nächsten Slave 
usw.
Das Problem ist nur dass Du dann eigentlich auf jedem Board einen Pullup 
brauchst und dann wird es recht niederohmig. Abgesehen davon dass das 
wie schon bemerkt ziemlicher Pfusch ist.

von Mathias O. (m-obi)


Lesenswert?

Ulrich F. schrieb:
> Wenn dir die Position im Netz soooo wichtig ist, dann versuche es doch
> mal mit Token Ring.
> Ist über die UARTs der AVR recht einfach machbar, und die "Position" ist
> fest eingebaut.

Dann erklär mir es doch mal bitte genau.

Das ganze soll halt als Lokalbus dienen. Später beim Master wird es dann 
an den Fernbus gehen z.B. Modbus-RTU und CAN.

Tcf K. schrieb:
> ziemlicher Pfusch

Wie würdest du es dann machen?

: Bearbeitet durch User
von Ulrich F. (Gast)


Lesenswert?

Mathias O. schrieb:
> Dann erklär mir es doch mal bitte genau.

Wie? Genau?
Das ist, glaube ich, eine IBM Erfindung.
Zumindest haben die Jahrzehnte darauf rum geritten.
(wikipedia usw. geben gerne Auskunft)

Aber so komplex (wie die das gemacht haben) brauchst du es ja vermutlich 
gar nicht.

In 2 Punkten ist das Konzept nahezu unschlagbar:
1. Alle Teilnehmer sind fit! (sonst bleibt es stehen)
2. Die Position im Ring ist eindeutig. (unveränderliche Nachbarn)

Ein Ring!
Tx an den Rx des linken Nachbarn.
Rx an den Tx des rechten Nachbarn.
usw.
Ringelrein.

Falls du einen Master definiert(z.B. der mit dem Modbus), ist das der 
Startpunkt im Ring.


Schnell ist es nicht, aber die Position war dir ja wichtig.

von Frank K. (fchk)


Lesenswert?

Mathias O. schrieb:

> Wie würdest du es dann machen?

entweder:
Bus ungeschaltet zu allen Slaves führen und auf jedem Steckplatz 
zusätzlich durch Pull-Ups/Pull-Downs die Steckplatznummer binär 
codieren, so dass der Slave sie auslesen kann.

oder:
keinen Bus, sondern einen Stern aufbauen.
auf die Backplane einen PCA9547 I2C Multiplexer. Der Master schaltet den 
Multiplexer auf den gewünschten Slave und kann dann mit diesem 
kommunizieren. Alle Slaves verwenden die gleiche I2C Adresse. Alle I2C 
Segmente sind voneinander entkoppelt und benötigen ihre eigenen Pullups. 
Eine saubere Sache also.

Das sind technisch saubere Realisierungskonzepte.

fchk

von TK (Gast)


Lesenswert?

Hallo Matthias,

dieses Problem habe ich auch schon einmal vor ca. 10Jahren gehabt.
Die Lösung ist relativ einfach gewesen. Ich habe dem IIC Bus noch eine
zusätzliche CTRL/Select Leitung spendiert. Am Anfang haben alle SLAVES 
die ADR 0. Nach dem Reset des MASTERS setzt dieser seine CTRL-Leitung, 
die nur zum 1. SLAVE geht und vergibt diesem dann eine Adresse (0x01). 
Alle anderen SLAVES ignorieren das Telegramm, da deren CTRL-Leitung eben 
noch auf L liegt. Nachdem der 1.SLAVE seine Adr quittiert hat, setzt 
dieser nun seine CTRL-Leitung, die zum nächsten SLAVE geht. Der MASTER 
vergibt die nächste Adr (0x02). Der 1. SLAVE reagiert nicht mehr, da 
dieser ja bereits mit 0x01 initialisiert ist, aber SLAVE2 übernimmt nun 
die Adresse. Das ganze geht so weit, bis ein SLAVE auf die Adressvorgabe 
nicht mehr reagiert. Damit weiss der MASTER auch gleich, wie viele 
Teilnehmer vorhanden sind.
Das ganze geht also ohne zusätzliche Bausteine wie MOSFET oder PCA.
Lediglich eine weitere Leitung wird benötigt.

Vielleicht hilft Dir das ja weiter.

Gruß
TK

von Mathias O. (m-obi)


Lesenswert?

Du wirst lachen. Genau das ist mir heute morgen um kurz vor 6 beim 
Aufstehen auch eingefallen. Aber ist deins Hot-Swap-fähig?

von Walter T. (nicolas)


Lesenswert?

Mathias O. schrieb:
> Also da ich nur I2C und 24V/GND durchschleife, muss jedes Modul seine 5V
> selber erzeugen, somit muss auch jedes Modul seine eigenen Pullups
> drinhaben. Ist das soweit richtig?

Hmmm..... also jedes Modul erzeugt selbst aus 24V seine 5V für die 
interne Logik?

1. Sagt das nichts aus, ob Pull-Ups eingebaut sind (normalerweise nicht 
- denn wie soll der Erbauer der ICs wissen, wieviele der ICs Du an einen 
I2C-Bus anschließen willst).

2. Handelt es sich hier um TMC222-Schrittmotortreiber? Die müssen nur 
ein einziges Mal neu mit der Adresse beschrieben werden, nicht bei jedem 
Start. Da wäre der Zusatzaufwand mit dem Adressdecoder sinnlos.

von (prx) A. K. (prx)


Lesenswert?

Wenn man schon eine geografische Adressierung will, dann wärs eigentlich 
am einfachsten, mit dem Slot selbst auch die Adresse vorzugeben. Dass 
also ein paar Leitungen am Stecker auf der Backplane die Slotnummer 
definieren. Wenn man an Anschlüssen knapp ist, aber in jeder Node einen 
ADC oder mindestens einen Analog-Comparator drin hat, dann kann man das 
auch in einem einzigen Slotanschluss per individuellem Widerstand 
realisieren.

: Bearbeitet durch User
von TK (Gast)


Lesenswert?

Hallo Matthias,

Hot-Swap Fähigkeit hat immer auch was mit dem MASTER zu tun. In meiner 
Anwendung habe ich es nicht benötigt. Aber ich kann mir vorstellen, dass 
das geht. Der MASTER muss dann zyklisch eine unbenutzte Adresse 
initialisieren. Und wenn eine Antwort kommt, ist ein neues Modul 
dazugekommen. Um zu erkennen, ob welche aus der Kette abgekoppelt wurden 
müssen alle initialisierten SLAVES abgefragt werden (alle Adr. 
durchwobbeln und auf Antworten warten).

Gruß
TK

von Mathias O. (m-obi)


Lesenswert?

Walter T. schrieb:
> 1. Sagt das nichts aus, ob Pull-Ups eingebaut sind

Versteh ich jetzt nicht. Der Hersteller der ICs muss es ja auch nicht 
wissen. Reicht ja wenn ich es weiß, dass ich welche in mein Modul 
einbaue.

Walter T. schrieb:
> 2. Handelt es sich hier um TMC222-Schrittmotortreiber? Die müssen nur
> ein einziges Mal neu mit der Adresse beschrieben werden, nicht bei jedem
> Start. Da wäre der Zusatzaufwand mit dem Adressdecoder sinnlos.

Ne. Eigene Slaves auf der Basis eines Mega88. Alles Slaves haben am 
Anfang die Adr. 0. Nacheinander werden dann die Slaves von dem vorigen 
Slave freigeschaltet damit sie vom Master eine Adresse zugewiesen 
bekommen.

A. K. schrieb:
> Wenn man schon eine geografische Adressierung will, dann wärs eigentlich
> am einfachsten, mit dem Slot selbst auch die Adresse vorzugeben. Dass
> also ein paar Leitungen am Stecker auf der Backplane ...

Kann ich nicht, da ich fertige Installationsgehäuse von Phoenix Contact 
nutze und auch deren HBus.

TK schrieb:
> Hot-Swap Fähigkeit hat immer auch was mit dem MASTER zu tun. In meiner
> Anwendung habe ich es nicht benötigt. Aber ich kann mir vorstellen, dass
> das geht. Der MASTER muss dann...

Es werden ja eh alle Slaves zyklisch abgefragt um deren Werte in die 
jeweiligen Registern beim Master einzutragen. Dann kann man ja auch 
vorher den Status abfragen. Und auch ob es ein Modul gibt mit der Adr. 
0.

von Frank K. (fchk)


Lesenswert?

Mathias O. schrieb:

> A. K. schrieb:
>> Wenn man schon eine geografische Adressierung will, dann wärs eigentlich
>> am einfachsten, mit dem Slot selbst auch die Adresse vorzugeben. Dass
>> also ein paar Leitungen am Stecker auf der Backplane ...
>
> Kann ich nicht, da ich fertige Installationsgehäuse von Phoenix Contact
> nutze und auch deren HBus.

Diese Entscheidung wirst Du dann wohl noch einmal revidieren müssen.

fchk

von Mathias O. (m-obi)


Lesenswert?

Frank K. schrieb:
> Diese Entscheidung wirst Du dann wohl noch einmal revidieren müssen.

Mit Sicherheit nicht. Soll schließlich ordentlich in eine 
Unterverteilung passen. Für alles gibt es eine Lösung und die 
softwarebasierte Adressierung macht da schon Sinn. Somit sind alle 
Module gleich und auch die einzelnen HBus-Segmente. Der Anwender muss 
dann nicht darauf achten, welche er braucht und die auch in der 
richtigen Reihenfolge zusammenzustecken.

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.