Wie verbinde ich mehrere gleiche Geräte mit I2C mit einem Arduino?

Ich möchte zwei gleiche Magnetometer (HMC5883L) mit meinem Arduino verwenden, aber ich kann den Code nicht herausfinden, um jeden von ihnen separat aufzurufen.

Ich habe online gelesen, dass das Verbinden mehrerer Geräte durchaus machbar ist, solange Sie ihre jeweiligen Adressen anrufen. Das Problem, das ich habe, ist, dass sie, weil ich zwei gleiche Geräte verwende, jeweils dieselbe Adresse haben.

Meine Fragen sind also, kann ich die I2C-Adresse eines meiner Magnetometer ändern, ohne dass es kaputt geht, wie mache ich das, ist es eine dauerhafte Änderung, und wenn ja, kann ich den HMC5883L bei Bedarf auf die Standardeinstellung zurücksetzen?

Ich habe im Moment keine Zeit, eine richtige Antwort zu recherchieren, aber nachdem ich mir das Datenblatt angesehen habe, denke ich, dass es möglich ist, die Adresse einer Einheit zu ändern. Sie erwähnen an einer Stelle ausdrücklich die werkseitig eingestellte Standardadresse.
@AndrejaKo Ich habe das Handbuch durchgesehen und sehe keinen unterstützten Mechanismus zum Ändern der I2C-Adresse. Es gibt 3 Identifikationsregister, aber diese scheinen nichts mit den I2C-Lese-/Schreibadressen zu tun zu haben.
Wo hast du es gekauft? Ist es auf einem Breakout-Board? Sind Adressauswahl-Pins/Widerstände/Pads verfügbar?
@KyranF Ich habe dieses Magnetometer von Sparkfun gekauft (siehe Link), bin mir bei der Adressauswahl nicht sicher, sorry. sparkfun.com/products/10530
Die Tatsache, dass es nicht dokumentiert ist, bedeutet nicht zwangsläufig, dass es nicht implementiert ist. Es könnte sich um eine NDA-Information handeln. Aber es gäbe immer noch ein Problem, wie kann man die Adresse eines Geräts ändern, wenn sich zwei am selben Bus befinden?
Schauen Sie sich diesen I2C-Adressübersetzer LTC4316 an . Es kam vor relativ kurzer Zeit heraus.

Antworten (4)

Ich habe gerade das Datenblatt gelesen, ohne externe Hardware (wie eine Art Multiplex-Puffer mit Kanalauswahl und Chipaktivierung) können Sie nicht zwei dieser Geräte auf demselben I2C-Bus haben.

Das von Ihnen verwendete Gerät hat eine feste, werkseitig eingestellte Adresse. Es gibt keine Möglichkeit, die Adresse per Software oder sogar durch externe Pins zu ändern, um die 7-Bit-I2C-Busadresse anzupassen.

Komplexere ATMEL 8-Bit AVR wie die XMEGAs haben mehrere I2C-Schnittstellen, sodass Sie mit diesen zwei Geräte haben könnten, eines pro Kanal. Dasselbe gilt beispielsweise für den einfachen und kleineren ARM Cortex M0 -> M3, alle haben mehrere Busschnittstellen, die dieses Problem lösen können.

Etwas, das mit ein wenig Hardware und Software zu tun hat, besteht darin, einen IC zu haben, der die I2C Serial Clock (SCL) entweder zum einen oder zum anderen blockiert und abwechselt, welcher die Taktsignale empfängt und daher in der Lage ist, Befehle zu empfangen und darauf zu reagieren. Ich denke, ein einfacher Dual-MOSFET mit XOR-Steuerung an den Gates könnte dies mit einer einfachen Schaltung tun. Andernfalls können Sie mit einer Art Leitungstreiber / Pufferchip mit einem Aktivierungspin und einem Zweikanal- / Multiplexausgang umschalten, welcher Ausgang das SCL-Signal erhält.

So oder so ist es nicht schön. Sie können immer ein zweites, aber ähnliches IC/Modul-Magnetometer finden, das eine andere hartcodierte I2C-Adresse hat oder zumindest die Möglichkeit hat, sie zu ändern (normalerweise externe Pin-Konfigurationen/Widerstände), um mehrere auf demselben Bus zuzulassen.

BEARBEITEN: Texas Instruments hat ein I2C-Fehlerbehebungsdokument , das auf Seite 8 eine Möglichkeit zeigt, das Multiplexen einfacher als von mir beschrieben durchzuführen, um den I2C-Bus in Unterabschnitte aufzuteilen, um mit widersprüchlichen Slave-Adressproblemen wie dem, was Sie haben, umzugehen.

viel Glück!

Danke für die Antwort. Ich tendiere zur Multiplexing-Lösung, da sie mir am einfachsten erscheint (ohne eine neue Schnittstelle zu kaufen). Würde so etwas wie der 74HC4051 gut funktionieren, oder haben Sie andere Empfehlungen?
@ user2222956 - Suchen Sie im Internet nach "I2C Multiplexer" oder "Bidirectional I2C Buffer" und Sie werden viele Optionen finden. Der 74HC4051 ist ein analoger Multiplexer, also zum Umschalten zwischen Audiosignalen. Ich habe das Datenblatt überflogen und es sieht so aus, als ob es funktionieren könnte. Wenn dies jedoch nicht der Fall ist, kann es schwierig sein, Fehler zu beheben.

Gemeinsame Wege:

  • Verwenden Sie zwei i2c-Kanäle. Entweder Hardware oder Bitbanged/Software i2c. Es ist kein kompliziertes Protokoll und es gibt viele Bibliotheken dafür.

  • Verwenden Sie einen Hardware-i2c-Puffer/Busschalter/Multiplexer usw. Es gibt viele Namen für dasselbe. Einige werden von einem externen GPIO gesteuert, andere können über ihre eigene i2c-Adresse gesteuert werden.

  • Wie @Jjones erwähnte, würde eine Brücke auch funktionieren. Dedizierte oder Ersatz-Mikrocontroller könnten in eine Protokollbrücke umgewandelt werden, wie i2c-spi oder serial-i2c oder was auch immer.

  • Schließlich haben viele Hersteller alternative Adressversionen derselben Chips.

Komischerweise hat dieser Sensor viele unbenutzte Pins, die zum Einstellen einer Adresse hätten verwendet werden können, aber sie haben sich aus irgendeinem Grund dagegen entschieden.

Der LT4316 ist Ihre Antwort. http://cds.linear.com/docs/en/datasheet/4316fa.pdf

Dieser erstaunliche kleine Chip ist eine nahezu passive Lösung. Ich habe es gerade auf einem Board verwendet (habe meine Verschiebung tatsächlich auf Null gesetzt und sie als Puffer verwendet). Was ich mit fast passiv meine, ist, dass Sie Ihre i2c-Adressverschiebung einfach mit Widerständen einstellen können und die Änderung für Ihren Code unsichtbar ist.

Die Verschiebung gilt nur für die Adresse selbst und durchläuft die Daten dann unverändert.

Geben Sie hier die Bildbeschreibung ein

Sie könnten 2 Arduino verwenden und über SPI mit jedem Host-I2C-Slave-Gerät kommunizieren.

Hoffentlich meinst du ein Bare-Bones-Arduino anstelle eines 30-Dollar-Uno oder was auch immer, denn das muss für die Brieftasche schmerzhaft sein.