Verwalten von I2C-Adressenkonflikten mit mehreren MCP23017 auf demselben Bus

Ich verwende einen Raspberry Pi mit dem I2C-Master und habe erfolgreich 8 verschiedene MCP23017-Chips mit ihren jeweiligen Adressen verdrahtet, indem ich die letzten 3 Bits ihrer 7-Bit-Adressen gesetzt habe. Sie funktionieren alle einwandfrei.

Mein Problem ist, dass die Grundadressierung der Chips fest auf 0x20 bis 0x27 eingestellt ist, was seltsam erscheint. Nach der Verwendung i2cdetectsehe ich so viele andere potenzielle Adressen.

Meine erste Frage ist: Wenn die Chips auf den 0x20s gesperrt sind, wird es einen Konflikt geben, wenn ein anderes I2C-Gerät dieselbe Geräteadresse verwendet?

Zweitens: Gibt es eine Möglichkeit, das grundlegende Adressierungsschema (0x3*, 0x4*, 0x5*) zu ändern, um alle diese potenziellen Adressen zu maximieren, oder sind sie für jedes Gerät fest eingestellt?

Antworten (1)

Meine erste Frage ist: Wenn die Chips auf den 0x20s gesperrt sind, wird es keinen Konflikt geben, wenn ein anderes i2c-Gerät dieselben Schemata verwendet?

Richtig. Ein anderes Slave-Gerät, das eine Adresse verwendet, 0x20 - 0x27 würde mit einem bestehenden MCP23017- Gerät, das dieselbe Adresse innerhalb dieses Adressbereichs verwendet, in Konflikt geraten, wenn sie mit demselben I 2 C-Bus verbunden wären. Jeder I 2 C-Slave benötigt eine eindeutige Adresse auf einem I 2 C-Bus.

Zwei Möglichkeiten, einen Slave-Adressenkonflikt zu mildern, wären entweder die Verteilung der Geräte auf mehrere I 2 C-Busse auf dem I 2 C-Master (z. B. der Raspberry Pi) oder die Verwendung eines I 2 C-Multiplexer-Geräts auf einem einzelnen I 2 C-Bus (was erzeugt effektiv selbst mehrere I 2 C-Busse). [Siehe unten für einen anderen Ansatz.]

Zweitens: Gibt es eine Möglichkeit, das grundlegende Adressierungsschema (0x3*, 0x4*, 0x5*) zu ändern, um all diese potenziellen Adressen zu maximieren? Oder sind sie für jedes Gerät fest eingestellt?

Dies hängt vom Gerät ab (dh lesen Sie dessen Datenblatt), aber typischerweise ist die I 2 C-Adresse oder der Bereich der wählbaren I 2 C-Adressen für jedes Modell des Slave-Geräts festgelegt.

Eine Ausnahme ist, wenn ein Slave-Gerät vollständig programmierbar ist (z. B. sind einige I 2 C-Slaves tatsächlich PIC-Geräte, auf denen Firmware ausgeführt wird, um sie zu permanenten I 2 C-Slaves zu machen), und in diesen Fällen habe ich mehr Flexibilität hinsichtlich der programmierbaren Adressen gesehen benutzen.


Bearbeitet, um hinzuzufügen: Ein weiterer Ansatz zur Vermeidung von I 2 C-Bus-Adressenkonflikten, wie freundlicherweise von @DoxyLover kommentiert, ist die Verwendung der I 2 C-Adressübersetzer von Linear Technologies - LTC4316 , LTC4317 , LTC4318 . Diese Geräte schreiben die I 2 C-Adressen "on-the-fly" zwischen ihren Eingangs- und Ausgangs-"Kanälen" um. Tatsächlich erzeugen sie neue I 2 C-Bussegmente mit einem konfigurierbaren Muster einer (theoretisch transparenten) I 2 C-Adressübersetzung zwischen den ursprünglichen und neuen I 2 C-Bussegmenten.

Aus ihren Datenblättern fügen sie auch andere Funktionen hinzu, z. B. eine eingebaute "Stuck Bus"-Erkennung und Spannungspegelumsetzung. Obwohl sie allgemeine I 2 C-Funktionen unterstützen, gibt es einige, die sie nicht unterstützen, z. B. 10-Bit-Adressierung und Geräte-ID. Lesen Sie wie immer die Datenblätter.

Im Zusammenhang mit der ursprünglichen Frage sieht ein LTC4316 so aus, als könnte er ein neues I 2 C-Bussegment erstellen, an das ein weiterer Satz von (bis zu) acht MCP23017-Geräten angeschlossen werden könnte. Nehmen wir an, dass I 2 C-Adressen auf dem direkt mit dem Master verbundenen I 20x30 - 0x37 C-Bus frei sind , aber der neue Satz von MCP23017-Geräten ihre festen Adressen verwenden muss . Der LTC4316 würde mit einem „Übersetzungsbyte“-Wert von konfiguriert .0x20 - 0x270x10

Auf dem „Ausgangs“-I 2 C-Bussegment des LTC4316 „sieht“ der neue Satz von acht MCP23017-Geräten ihre üblichen 0x20 - 0x27I 2 C-Adressen, wie sie es benötigen. Auf dem „Eingangs“-I 2 C-Bussegment, an dem der I 2 C-Master angeschlossen ist, würde der I 2 C-Master sie jedoch mit I 2 C-Adressen adressieren 0x30 - 0x37, wobei der LTC4316 eine Adresse von 0x3nam „Eingang“ (Master-Seite) übersetzt. Bussegment, an 0x2ndas Bussegment "Ausgang" (Slave-Seite) [wobei n= 0 - 7].

Es gibt auch I2C-Adressübersetzungschips, die zwischen dem Bus und einem (oder mehreren) Geräten platziert werden, die die Adressbits im laufenden Betrieb neu schreiben. Zum Beispiel linear.com/product/LTC4317
Danke @DoxyLover - die sind so neu, dass ich sie nicht gesehen habe! Ich werde diese Antwort mit Ihren Informationen aktualisieren - nochmals vielen Dank :-)
@Robotometry - Falls Sie den Kommentar noch nicht gesehen haben, kann die oben von DoxyLover erwähnte Gerätefamilie das tun, was Sie wollen. Ich habe meine Antwort mit Links und einem vorgeschlagenen Szenario für die Verwendung des LTC4316 als Beispiel aktualisiert, falls das hilft.