Ändern der I2C-Adresse

Ich muss zwei Si114x-Lichtsensoren an einen I2C-Bus anschließen. Ich habe sie körperlich noch nicht. Jeder Sensor hat dieselbe I2C-Adresse, daher würde eine Verbindung mit den Standardeinstellungen einen Konflikt bedeuten. Das Datenblatt ( http://www.silabs.com/Support%20Documents/TechnicalDocs/Si114x.pdf ) erwähnt jedoch einen BUSADDRBefehl, der die Adresse ändert, und der Standardwert des geänderten Registers ist 0x00(nicht 0x5Adas als Slave angegeben wird Adresse, das ist etwas seltsam).

Meine Frage ist: Behält der Sensor die Adresse in einem nichtflüchtigen Speicher? Das Datenblatt sagt es nicht explizit. Kann ich einfach einen Sensor zuerst als einzigen Sensor an den Bus anschließen, seine Adresse neu programmieren und dann den zweiten Sensor hinzufügen? Ist es eine Art Muster in I2C-Geräten? Wenn nicht, würde der Adressänderungsbefehl für mich keinen Sinn ergeben.

Ich würde meinen untersten Dollar verwetten, dass es keinen NVM hat
Zweitens müssen Sie, wenn Sie mehrere Sensoren anschließen möchten, mehrere I2C-Busse verwenden (in SW nicht so schwierig) oder einen einzelnen Bus in Hardware muxen (Muxen nur des SCLK, der unidirektional ist, reicht aus).

Antworten (3)

Auf Seite 54 heißt es im Datenblatt:

I2C-Adresse[7:0] Gibt eine neue I2C-Adresse an, auf die das Gerät antworten soll. Die neue Adresse wird wirksam, wenn ein BUSADDR-Befehl empfangen wird.

Das bedeutet so ziemlich, dass Sie zuerst diesen RAM-Wert setzen und dann den Befehl BUSADDR aufrufen.


Wie auch immer, ich denke, Ihre einzige Chance besteht darin, einen der Sensoren irgendwie zu trennen. Dies könnte einen Transistor bedeuten, der die SCL-Leitung hoch hält, während Sie die Adresse des anderen Sensors programmieren. Nach der Initialisierung können Sie diesen Transistor leitend halten.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

... Ich hoffe, ich habe die Ausrichtung des MOSFET nicht durcheinander gebracht ...

Dies erfordert natürlich ein separates Signal. Und ich glaube nicht, dass du darauf verzichten kannst.

Dies beantwortet Ihre Frage möglicherweise nicht direkt, aber eine andere Möglichkeit, das Problem zu umgehen, bei der die Geräteadressen nicht geändert werden müssen, besteht darin, einen CD4066 zu verwenden, um jeweils einen der beiden Sensoren anzuschließen, wie im Arduino Video Game Shield von Wayne und Layne . Scrollen Sie nach unten zum Abschnitt mit dem Titel Nunchakus . Es gibt auch Links zu Schaltplänen und Firmware.

Wii-Nunchakus (der drahtlose Controller des berühmten Videospiels) zeigen das gleiche Problem: Sie verbinden sich mit dem drahtlosen Hauptcontroller über I2C, aber sie haben alle dieselbe Adresse von 0 (Null).

Was die Autoren dieses Geräts geschickt gemacht haben, war, einen bidirektionalen Schalter-IC (den CD4066) zu verwenden, um mit jeweils einem Controller zu kommunizieren, und dabei den anderen von den Datenleitungen zu trennen. Unten ist ein Diagramm, das die allgemeine Idee hinter ihrem Design zeigt.

Diagramm zur Auswahl zwischen zwei I2C-Geräten mit derselben Adresse mit CD4066

Ich habe ein solches Gerät mit ihren Open-Source-Schaltplänen gebaut und es funktioniert perfekt, wenn beide Controller gleichzeitig angeschlossen sind. Vielleicht ist das eine Option, die Sie in Betracht ziehen sollten, wenn das Setzen der Adressen (wie von Dzarda vorgeschlagen ) fehlschlägt.

Wenn Sie Software-Bit-Banging für den I2C-Master verwenden und die von Ihnen verwendeten Teile kein Clock-Stretching verwenden, besteht ein einfacher Trick zur Verwendung von zwei I/O-Pins zum Verbinden zweier identischer I2C-Teile darin, einen Pin mit SCL von zu verbinden den ersten Teil und über den Widerstand an den SDA des anderen, und lassen Sie den anderen Pin das Gegenteil tun. Die einzige Sache, auf die man achten muss (und der Grund, warum Software-Bit-Banging erforderlich ist), ist, dass das Gerät, dessen SDA/SCL-Verbindungen von dem Gerät, mit dem man sprechen möchte, umgekehrt ist, die Kommunikation, für die man sprechen möchte, möglicherweise falsch interpretiert, wenn man nicht aufpasst das andere Gerät als Aufforderung, mit ihm zu sprechen. Wenn der für ein Gerät bestimmte SCL eine fallende Flanke hat, während SDA hoch ist (was beim Senden eines „1“-Bits normal wäre), sieht das andere Gerät dies als „Start“-Bedingung. Jedes Mal, wenn SDA von niedrig nach hoch geht, während Daten an das erste Gerät gesendet werden, wird eine "0" zum zweiten getaktet; eine "Stopp"-Bedingung für das erste Gerät taktet eine "1" für das zweite ein. Das Senden bestimmter Datensequenzen gefolgt von einer Stoppbedingung an ein Gerät könnte dazu führen, dass das andere eine Startbedingung gefolgt von einer gültigen Adresse sieht. Bit-Bang-I2C-Implementierungen können dies verhindern, indem sie zu bestimmten Zeiten redundante Impulse auf SDA senden, während SCL niedrig ist, aber Hardware-I2C-Master-Implementierungen können dies nicht tun. Das Senden bestimmter Datensequenzen gefolgt von einer Stoppbedingung an ein Gerät könnte dazu führen, dass das andere eine Startbedingung gefolgt von einer gültigen Adresse sieht. Bit-Bang-I2C-Implementierungen können dies verhindern, indem sie zu bestimmten Zeiten redundante Impulse auf SDA senden, während SCL niedrig ist, aber Hardware-I2C-Master-Implementierungen können dies nicht tun. Das Senden bestimmter Datensequenzen gefolgt von einer Stoppbedingung an ein Gerät könnte dazu führen, dass das andere eine Startbedingung gefolgt von einer gültigen Adresse sieht. Bit-Bang-I2C-Implementierungen können dies verhindern, indem sie zu bestimmten Zeiten redundante Impulse auf SDA senden, während SCL niedrig ist, aber Hardware-I2C-Master-Implementierungen können dies nicht tun.

Danke für die Idee, aber in meinem speziellen Fall muss ich DMA verwenden, also berücksichtige ich Bit-Banging nicht.