Hallo,
Ich habe ein I²C Gerät (SCL ~5kHz) das etwa sekündlich ein paar Werte
ausgibt. Dieses arbeitet ausschließlich als Master. Der μC der die Werte
empfangen soll arbeitet auch als Master da da noch diverse Sensoren
dranhängen. Der Empfänger ist zwar ein SAMD21, ich habe jedoch keine
SERCOMs mehr frei zum als Slave konfigurieren.
Wie kriege ich die Werte in den μC rein? Gibt es Umsetzer die einfach
alles auf ner Slave Adresse Empfangene wieder auf einem anderen I²C Bus
als Slave verfügbar machen können?
Oder muss ich selbst einen Umsetzer mittels zusätzlichem μC realisieren?
Andere Ideen?
Vielen Dank,
MfG,
Lex
Ich würde das einfach mit einem kleinen Zusatz-µC machen.
Kann zwar sein, dass es fertige Chips dafür gibt, aber solche
Spezial-Chips sind meist unnötig komplex und haben oft ihre Eigenheiten.
Wenn es ein echter I2C ist, dann sollten beide Master Multimastermode
kennen. Da kann dann einer der Master zum Slave werden, falls
erforderlich.
Oliver
Lex schrieb:> Oder muss ich selbst einen Umsetzer mittels zusätzlichem μC realisieren?
Wenn du in deinem SAMD noch zwei Pins frei hast, könntest du eine
Software-I2C implementieren, entweder für den Master oder den Slave.
Du könntest auch zwei I2C-Portexpander (z.B. PCF8574) Rücken-an-Rücken
zusammenschalten, dann hättest du zwei Slave-Interfaces mit den gleichen
Daten, welches du vom µC aus sekündlich pollen kannst. Hängt aber davon
ab, ob du die Slave-Adresse deines Gerätes konfigurieren kannst.
Oliver S. schrieb:> Wenn es ein echter I2C ist, dann sollten beide Master Multimastermode> kennen. Da kann dann einer der Master zum Slave werden, falls> erforderlich.
Nein, ein I2C Device kann Slave, Master oder Master/Slave sein. Ein
Master sollte zwar multimaster-fähig sein, das hat aber nichts damit zu
tun, ob er auch als Slave laufen kann, das ist völlig
implementierungsabhängig.
Oliver S. schrieb:> Wenn es ein echter I2C ist, dann sollten beide Master Multimastermode> kennen.
Leider habe ich die Erfahrung gemacht, daß außer Philips/NXP keiner den
I2C-Multimastermode wirklich verstanden hat.
Die Atmel AVR/8051 hatten schwerwiegende Bugs. Ohne Timeout mit Retry
geht da garnichts.
Auch hatte ich mal versucht, den P89C668 durch den Tekmos Nachbau
TK89C668 zu ersetzen, dessen I2C hängte sich schon im Slave-Scan auf.
Wenn es aber läuft, ist Multimaster-I2C eine feine und elegante Lösung.
Guido Körber schrieb:> Ein> Master sollte zwar multimaster-fähig sein, das hat aber nichts damit zu> tun, ob er auch als Slave laufen kann, das ist völlig> implementierungsabhängig.
Ein I2C-Multimaster wird automatisch Slave, sobald er die Arbitration
verliert. Etwas anderes ergäbe auch keinen Sinn.
Wie Zeitkritisch sind denn die Messwerte? Am einfachsten wäre es den I2C
zu muxen und einfach alle paar Sekunden umzukonfigurieren zwischen
Master/Slave
...oder einfach zwei I2C-Portexpander Rücken-an-Rücken
zusammenzuschließen. Dann hat man auf beiden Seiten einen I2C-Slave -
auf den einen schreibt man, vom anderen liest man. Fertig.
Nimm einfach ein I2C-RAM oder EEPROM als Zwischenspeicher,den der eine
Master beschreibt und der andere ausliest. Beide Master müssen natürlich
aufeinander achten, dh Multimasterfähig oder synchronisiert sein.
Lex schrieb:> Der Empfänger ist zwar ein SAMD21
Der kann schonmal kein Multimaster.
Man kann aber leicht einen I2C-Singlemaster mit Bit-Banging mit 2
beliebigen IO-Pins realisieren.
Moin,
Ich weiss nicht, ob's ein Einzelfall war, aber ich hab' mal ziemlich
Malheur mit I2C Multimaster gehabt. Wuerde ich nicht einsetzen. Das war
so ein oller Coldfire, bei dem muss wohl irgendein SAP-Informatiker die
I2C Hardware gestrickt haben.
IIRC war da die Multimasterfaehigkeit nicht abschaltbar. Und leider
irgendwie auch arg nervoes, d.h. der hat andauernd gedacht, ein anderer
(tatsaechlich nicht vorhandener) Master haette den Bus uebernommen und
er muesste jetzt warten, bis er ihn wieder kriegt (Was natuerlich nie
passiert ist...).
Deshalb wuerd' ich auch fuer den schon vorgeschlagenen Zweit-µC aus dem
Zweit-Post plaedieren.
Gruss
WK
S. R. schrieb:> Du könntest auch zwei I2C-Portexpander (z.B. PCF8574) Rücken-an-Rücken> zusammenschalten, dann hättest du zwei Slave-Interfaces mit den gleichen> Daten, welches du vom µC aus sekündlich pollen kannst.
Das wäre elegant, gute Idee! Mein Slave muss die Adresse 0x34 haben, den
PCF8574 kann ich leider nicht darauf konfigurieren. Ich werde mal
nachforschen ob es sonstige Port Expander gibt die ich auf die Adresse
einstellen kann.
Fabian F. schrieb:> Am einfachsten wäre es den I2C> zu muxen und einfach alle paar Sekunden umzukonfigurieren zwischen> Master/Slave
Auch eine Idee, danke!
Vielen Dank euch, das hilft mir schon mal weiter :)