Forum: Mikrocontroller und Digitale Elektronik I2C Bus Switch 2 Master


von Veit Z. (dianaz)


Lesenswert?

Guten Tag,

ich möchte von einem Atmega32 und einem Atmega168 auf ein gemeinsam 
genutztes Eeprom 24C32 zugreifen. Solange sich die 2 Master per 
separatem Handshake einig sind und nicht gleichzeitig den Bus 
aktivieren, ist alles gut. Jetzt möchte ich aber den Bus per Befehl 
aufteilen, so dass der Atmega32 seine eigenen Slaves(Portexpander und 
LCD) hat und der Atmega168 gleichzeitig Befehle aus dem Eeprom 
verarbeitet.
Zur Zeit habe ich das versuchsweise (Steckbrett) mit einem Relais(5V, 
20mA, 2 Wechsler) gelöst. Die Wechsler schalten SCL und SDA um. Für 
diese zugegeben rustikale Lösung suche ich eine elegantere Variante. Zum 
einen möchte ich keine Schaltkontakte in den Busleitungen haben und zum 
anderen ist die Relais-Umschaltzeit von 10 ms nicht prickelnd. Ich hab 
von einem I2C Bus-Switch(PCA9546) gelesen, bin mir aber nicht sicher, ob 
ich damit zwei getrennte Busse realisieren kann.
Wenn jemand Vorschläge oder Hinweise hat - besten Dank!

DianaZ

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

Wenn die I2C Master beide die Arbitrierung sauber implementiert haben, 
bracht man keine Relais/Switches/etc. Man kann beide einfach parallel 
schalten. Der Bus ist extra dafür designt worden.
Mit dem EEProm muß man aber aufpassen, während es speichert erzeugt es 
keine ACKs. Wenn also MasterA grad war geschrieben hat, und MasterB 
sofort danach z.B. lesen will, sieht es für ihn aus, also ob das EEProm 
nicht da wäre.
Lies Dich mal in die I2C Specs ein und finde heraus, ob Deine Master die 
Arbitrierung sauber können. Dann ist das Leben plötzlich ganz einfach!

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@Joerg L.:
Also AVRs können Multimaster I2C.
Der EEPROM gibt zwar kein ACK, abern NACK.
Er ist also nicht in Richtung Mond verschwunden ;)

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

Martin Wende schrieb:
> Der EEPROM gibt zwar kein ACK, abern NACK.

Bist Du Dir sicher, daß das EEPROM beim NACK SDA aktiv auf "1" zieht?
Ich bin davon ausgegangen, daß es einfach nur "nichts" macht, und 
stattdessen den Pullup arbeiten läßt.
Seisdrum, der Master kann eh nicht unterscheiden, ob gerade der Pullup 
oder das EEPROM im NACK-Moment die Leitung nach high ziehen.

von Veit Z. (dianaz)


Lesenswert?

Guten Tag,

Jörg, ich wollte wirklich den Bus auftrennen, um zeitgleiches, 
paralleles Arbeiten der beiden Master am jeweiligen Bus zu ermöglichen. 
Vielleicht hab ich es nicht genau formuliert. Sicher kann man zwei 
Master parallel an einem Bus anschliessen. Bei Multimaster/Arbitrierung 
werden sich zwei Master am gemeinsamen Bus einig, um NACHEINANDER auf 
CLK/SDA zuzugreifen. Also muss unter Umständen ein Master warten. Dieses 
Warten wollte ich vermeiden.
Per "Umschaltung" sollte der Zugriff auf das gemeinsame Eeprom möglich 
sein, etwa bei der Initialisierung oder zum Abspeichern gemeinsamer 
Daten - beides dann im zeitunkritischen Programmteil.
Deshalb dachte ich an die elektrische Aufteilung in zwei unabhängige 
Busse.

DianaZ

von Peter D. (peda)


Lesenswert?

Die einfachste Lösung, nimm für weitere Single-Master ein SW-I2C.

Solange nicht Multi-Master benötigt wird, hat HW-I2C keine Vorteile.
Ich finde SW-I2C sogar einfacher und stabiler.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Gibt auch EEPROM mit zwei Bussen. Eventuell findest du das einfacher in 
deiner Anwendung.

von Veit Z. (dianaz)


Lesenswert?

Peter Dannegger schrieb:
> Die einfachste Lösung, nimm für weitere Single-Master ein SW-I2C.

Ja das würde auch gehen, ich brauch dazu zwei freie Ports. Beim Atmega32 
könnte ich das prüfen. Hast Du für SW-I2C erprobten Code in C parat?

Danke!

DianaZ

von Veit Z. (dianaz)


Lesenswert?

Abdul K. schrieb:
> Gibt auch EEPROM mit zwei Bussen. Eventuell findest du das einfacher in
> deiner Anwendung.

Daran hatte ich noch nicht gedacht, wusste nicht dass es solche Eeproms 
gibt. Das würde mein Problem sicher auch lösen. Hast Du eine 
Typbezeichnung oder Bezugsquelle? Danke!

Oder gibt es nicht doch so eine Art Switch oder "Busweiche" mit Open 
Collector?

DianaZ

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Sowas:
http://ww1.microchip.com/downloads/en/DeviceDoc/21176d.pdf
Hab ich so gefunden:
http://www.google.de/search?hl=de&source=hp&q=DDC2+eeprom+i2c&gbv=1
http://en.wikipedia.org/wiki/Display_Data_Channel

bzw. es gibt auch welche mit einer Seite RFID und die andere Seite i2c.

Ist natürlich ne Preis- und Beschaffungsfrage. Mit Standardbauelementen 
kommt man längerfristig immer besser!

Arbitierung läuft bei i2c über die Master(plural). Den Slaves ist das 
egal! Semaphore mußt du also selbst verwalten!!

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Veit Z. schrieb:
> Hast Du für SW-I2C erprobten Code in C parat?

Anbei meine Lib für die 4 Grundfunktionen.

Das I2C-Start hat noch ein besonderes Schmankerl. Falls ein Slave den 
Bus blockiert, z.B. nach einem Störimpuls oder einem MC-Reset, versucht 
es, den Bus wieder freizuschalten. Ein HW-I2C kann sowas nicht.

SCL wird als Ausgang verwendet, d.h. es braucht keinen Pullup. Das geht 
natürlich nur für "dumme" Slaves, d.h. die kein SCL-Stretching machen.
Für MCs als Slave muß man das SCL-Stretching noch einbauen.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Hast du die Deblocking-Routine auch praktisch getestet oder ist die nur 
hypothetisch entstanden?

von Peter D. (peda)


Lesenswert?

Ich hatte eine Applikation, wo häufig aus einem EEPROM gelesen wurde.
Beim ISP wurde das nun zufällig unterbrochen und manchmal zog der EEPROM 
SDA auf low und der I2C hing nach dem ISP.
Mit dieser Routine wird der hängende Slave nun resettet.

Aber auch, wenn man nicht ständig neu programmiert, erhöht das die 
Zuverlässigkeit. Es kann ja sein, daß ein kurzer Spannungseinbruch zwar 
den MC resettet, aber nicht die I2C-Slaves.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Danke.

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.