Ich möchte viele identische I²C-Sensoren, sagen wir 32, mit einer MCU verbinden, die nur 2 I²C-Busse hat.
Ich kann jeden Sensor so konfigurieren, dass er bis zu 8 verschiedene Adressen hat. Daher kann ich 8 Sensoren pro Bus oder 16 Sensoren insgesamt haben, was für meine Anwendung nicht ausreicht.
Ich plane, einen Multiplexer oder eine Art I²C-Puffer (beschrieben in diesem Dokument , Seite 8) zu verwenden, um die Anzahl der Sensoren zu erhöhen, die ich anschließen kann.
Allerdings muss ich mich jetzt zwischen mehreren Optionen entscheiden:
Das sind nur Beispiele, es gibt viele andere Konfigurationen, aber die Frage ist dieselbe:
Gibt es einen Grund, mehr Kanäle mit jeweils weniger Sensoren gegenüber weniger Kanälen mit jeweils mehr Sensoren zu bevorzugen?
Ich habe versucht herauszufinden, ob es eine Änderung in der max. Aktualisierungsrate meiner Sensoren in jeder Konfiguration, aber ich kann keinen Unterschied feststellen.
Wenn einige von Ihnen bereits mit diesem Dilemma konfrontiert waren und / oder eine Antwort haben, würde ich mich freuen, es zu hören!
BEARBEITEN: Der fragliche Sensor ist der TLV493D , ein 3-Achsen-Magnetometer. Eine Beschreibung des Busses mit bis zu 8 Sensoren finden Sie auf Seite 24 des zuvor verlinkten Benutzerhandbuchs.
Ich habe noch keine genaue Vorstellung von Multiplexern, aber es wird wahrscheinlich etwas Ähnliches wie die PCA954*-Familie sein.
Bei näherer Betrachtung der von Ihnen verwendeten Geräte scheint es, dass Sie zum Konfigurieren ihrer Adresse jedes Gerät einzeln einschalten können müssen, was bedeutet, dass Sie einen E / A-Pin pro Gerät benötigen, um es einstellen zu können die Adresse.
Um 8 Adressen konfigurieren zu können, müssen Sie zusätzlich die Spannung am SDA-Pin einstellen können, wenn das Gerät eingeschaltet ist. Diese Bedingung wird mit I2C-Multiplexern schwer zu erfüllen sein. Um dies zu erreichen, müssten Sie ein Paket über den I2C-Bus senden und sicherstellen, dass die SDA-Leitung für 200 us entweder hoch oder niedrig gehalten wird. Während dieser 200 us müssen Sie ein Gerät einschalten.
Aus diesem Grund ist es möglicherweise besser, einen anderen Satz von Optionen als meinen ursprünglichen Vorschlag zu wählen:
Die einfachste Methode wäre die Verwendung eines Paares von I2C-Multiplexern, von denen einer mit jedem I2C-Master verbunden ist. Jeder E/A-Expander hätte 4 Downstream-Busse mit 4 Geräten.
Da an jedem Bus nur 4 Geräte vorhanden sind, bedeutet dies, dass das LSB der Adresse (eingestellt durch die SDA/ADDR-Pin-Spannung beim Einschalten) immer auf 1 gesetzt werden kann (der Leerlaufwert des I2C-Busses). Dadurch entfällt die Schwierigkeit, die SDA-Spannung beim Einschalten der Geräte auf den richtigen Pegel einzustellen.
Zweitens können Sie sich darauf beschränken, nur 3 I/O-Pins zum Einschalten der Geräte zu benötigen. Die Einschaltsequenz kann wie folgt aussehen:
Das erste Gerät an jedem Bus wird mit VCC eingeschaltet. Nach dem Einschalten schreiben Sie in jeden Bus, um das MOD1-Register auf b11 zu ändern.
Sie verwenden eine E/A-Leitung, um das zweite Gerät an jedem Bus einzuschalten. Wieder können Sie jetzt auf jeden Bus schreiben und das MOD1-Register auf b10 ändern.
Sie verwenden eine zweite E/A-Leitung, um das dritte Gerät an jedem Bus einzuschalten. Schreiben Sie in jeden Bus, um MOD1 auf b01 zu ändern.
Sie verwenden Ihre dritte E/A-Leitung, um das vierte und letzte Gerät an jedem Bus einzuschalten.
Damit haben Sie nun 8 Busse, die jeweils aus 4 Geräten mit einer eindeutigen Adresse bestehen. Es besteht keine Notwendigkeit, den SDA/ADDR-Pin auf eine bestimmte Spannung einzustellen.
Die zweite Möglichkeit besteht darin, für jedes Gerät einen I2C-Puffer/Isolator (z. B. PCA9515a) zu verwenden. Sie verbinden eine 16er-Gruppe über Isolatoren mit einem Master und die andere 16er-Gruppe über Isolatoren mit dem zweiten Master.
Sie würden dann 16 E/A-Pins benötigen, um die Aktivierungspins der Isolatoren zu steuern. Jeder I/O-Pin steuert einen Isolator auf jedem I2C-Master.
Um von einem Gerät zu lesen, aktivieren Sie einfach den entsprechenden Isolator und lesen zwei Geräte gleichzeitig mit Ihren beiden Mastern. Das Aktivieren von I/O-Pin 0 ermöglicht das Lesen von Gerät 0 auf jedem Master, I/O-Pin 1 ermöglicht das Lesen von Gerät 1 auf jedem Master und so weiter.
Um E/A-Pins zu sparen, könnten Sie einen 74HC154 oder einen ähnlichen 4:16-Zeilendecoder verwenden, da Sie immer nur einen Isolator zu einem bestimmten Zeitpunkt ausgewählt haben. Dies reduziert Ihren I/O-Pin-Bedarf von 16 auf 4.
Alte Antwort (gilt für Geräte, die die Adresse mit Axx-Pins festlegen):
Wenn Sie einen I2C-Multiplexer verwenden, müssen Sie einen Befehl an den Multiplexer schreiben, um zu ändern, welcher Downstream-Bus gerade aktiv ist. Das braucht Zeit.
Wenn Sie weniger Downstream-Busse zum Umschalten haben (dh die Anzahl der Geräte auf jedem Bus maximieren), reduzieren Sie die Anzahl der zum Lesen aller Geräte erforderlichen Befehle – Sie können alle Geräte auf einem Bus lesen und dann zum nächsten Bus wechseln.
Der schnellste Weg, alle Geräte zu lesen, ist die Option, die mehr Geräte pro Downstream-Bus und weniger Downstream-Busse hat.
In Ihrem Fall haben Sie zwei Upstream-Busse. Verbinden Sie diese jeweils mit einem I2C-Multiplexer. Zu jedem I2C-Multiplexer führen zwei Downstream-Busse mit 8 Geräten.
Während Sie sich für einen 1:2-Mux entscheiden können, der Ihnen gerade genug Adressraum bietet, könnten Sie immer noch einen 1:4-Mux verwenden, bei dem zwei Downstream-Busse auf jedem Mux ungenutzt bleiben. Dies gibt Ihnen die Möglichkeit, bei Bedarf später zusätzliche Geräte hinzuzufügen.
Aus Programmiersicht:
Höchstwahrscheinlich werden alle Ihre Magnetometer von einem einzigen Thread verwaltet. Reservieren Sie am besten einen I²C-Bus für diesen Thread, damit Sie die isochrone Abtastung problemlos implementieren können. Dadurch wird es einfacher, eine zeitdiskrete Regelung zu realisieren.
Der andere I²C kann dann von einem anderen Thread gesteuert werden und sammelt alle anderen Sensoren, die Sie möglicherweise benötigen.
Ich kann jeden Sensor so konfigurieren, dass er bis zu 8 verschiedene Adressen hat. Daher kann ich 8 Sensoren pro Bus oder 16 Sensoren insgesamt haben, was für meine Anwendung nicht ausreicht.
Laut Datenblatt werden zum Einstellen von 8 Slaves mit unterschiedlichen Adressen 7 zusätzliche IO-Leitungen benötigt. Um den Bus (über einen Multiplexer) zu 32 Slaves zu routen, sind 5 zusätzliche IO-Leitungen und kein Durcheinander beim Einrichten der Slave-Adressen erforderlich.
Sie können wahrscheinlich einen Standard-Multiplexer (1:16 oder 2 x 1:8) verwenden, um die Stromversorgung auf 1 von 16 Slave-Geräten (oder 2 Slaves auf verschiedenen I2C-Bussen) zu schalten, und daher müssen die Busse nicht gemultiplext werden. Ich weiß nicht, wie hoch die Startzeit aus einem ausgeschalteten Zustand für die Slaves ist, daher könnte dies am Ende etwas langsam sein.
Ich sage sicherlich nicht, dass dies die optimale Lösung für Ihre spezifische Anwendung ist, aber es sollte als Option in Betracht gezogen werden, wenn IO-Pins gefragt sind.
Andi aka
brhans
JK
JK
Chris Knudsen
Rohr
Rohr
JK
JK