i2c automatische Adressvergabe

Ich habe die Frage hier gestellt und jemand hat angeboten, hier zu fragen, um bessere Antworten zu bekommen, also hier ist sie:

Geschichte:

Ich beschloss, eine Schaltung mit einigen peripheren ICs zu entwerfen. Obwohl SPI aufgrund seiner Master-Slave-Architektur und der Anforderung eines separaten Chip-Select-Pins große Datenraten erreichen kann, habe ich mich aufgrund seines Multi-Master- und echten seriellen Designs für I2C entschieden. (SPI ist kein vollständig serielles Protokoll, eher ein Hybridprotokoll: serieller Port für den Datenaustausch, paralleler Port für Chip-Select-Leitungen)

Problem:

Ich habe geplant, einem Mikrocontroller einige Adc-, Dac- und GPIO-ICs hinzuzufügen, aber diese Module werden mit einigen verfügbaren Slave-Adressen hergestellt. Hersteller betten die Adressen von Slaves in die IC-Hardware ein. Was für eine schlechte Idee! Ich bin also mit dem Adressierungsproblem des i2c-Protokolls konfrontiert.

Einige der aktuellen Adresszuweisungspins des IC (3 Pins, was bedeutet, dass ich nicht mehr als 7 davon verwenden würde). Das reicht in meinem Fall nicht.

Einige Leute bieten das Scannen von Adressen von 0x00 bis 0xff an, aber das ist kein guter Ansatz, weil es Zeit verschwendet (glaube ich). Jemand sagt "Es gibt i2c-Puffer oder i2c-MUXs, die Sie verwenden können" oder sogar einen anderen Mikrocontroller für die Adressübersetzung (NAT-ähnlicher Ansatz), aber haben wir uns nicht aus Gründen der Einfachheit (wie weniger Routen an Bord, Flexibilität usw.) im ersten Fall für i2c entschieden und verwendet Ort?

Es gibt Leute, die dieses Adresszuweisungsproblem haben (z. B. http://www.linkedin.com/groups/Methods-enumerating-I2C-slaves-autoassigning-4023060.S.113408032 )

Anregung:

Die automatische Adresszuweisung könnte mit einem Algorithmus in etwa wie folgt erfolgen:

  1. Slave-Komponenten hätten 2 Bytes nichtflüchtigen Speicher, um ihre Adressen dauerhaft zu behalten.
  2. Slaves haben eine Standardadresse (z. B. 0x01).
  3. Wenn dem Slave beim Einschalten keine andere als die Standardadresse zugewiesen wurde, werden die Slaves zum Master und fragen nach einer Adresse vom Host (z. B. bei Adresse 0x00).
  4. Unser eigentlicher Master-Knoten (Mikrocontroller, der Host) (in diesem Beispiel mit der Adresse "0x00") fungiert natürlich als Slave, da sich ein anderer Master auf dem Bus befindet und dem Slave die nächste verfügbare Adresse antwortet (zuweist).
  5. 0x01-Adresse wird für Broadcasting reserviert. Der Master kann diese Adresse verwenden, um die Slaves dazu zu bringen, ihre zugewiesenen Adressen zurückzusetzen.

Das würde für eine automatische Adressvergabe reichen.

Ja, ich kenne SMbus. Es hat ein automatisches Adressauflösungsprotokoll, aber es hat andere Einschränkungen (Geschwindigkeit, Zeitüberschreitung usw.), weshalb ich SMbus nicht I2C vorziehen möchte.

Dieses Adresszuweisungsprotokoll kann optional sein und könnte durch einen einzelnen Pin auf dem IC-Paket aktiviert werden. Es wird also abwärtskompatibel sein.

Frage:

Wahrscheinlich bin ich nicht die klügste Person im Universum, aber

  1. Gibt es ein Adresszuweisungsprotokoll, das Anbieter bereits in i2c implementieren
  2. Wenn nicht, was wäre an diesem Protokoll falsch?
  3. Wenn nichts falsch ist, warum fangen sie dann nicht an, ein solches Protokoll zu implementieren (wiederum weiß ich, dass ich nicht die klügste Person bin, also hätten sie über dieses Problem unterrichten sollen und sie hätten bereits einen solchen Algorithmus entdecken sollen).
Warum nicht SPI für Ihre Anwendung verwenden? Die Datenübertragung ist schneller und Sie können auf viele verschiedene Arten beliebig viele Chip-Select-Signale erzeugen.
@ThePhotonbut weren't we choosing and using i2c for simplicity (like fewer routes on board, flexibility etc) in the first place?
@Passerby, Einfachheit und Flexibilität sind normalerweise konkurrierende Ziele.
OP, denken Sie daran, dass i2c so wie es ist ein 31 Jahre alter (inzwischen abgelaufener) patentierter Standard mit offiziellen "i2c"-Teilen ist, die alle NXP/Phillips für die Adresszuweisung durchlaufen. Die automatische Zuweisung von Adressen wäre eine große Änderung für i2c und lohnt sich nicht, da selbst smbus ARP nicht allzu beliebt war (so sagt zumindest Wiki).
@ThePhoton Warum nicht SPI für meine Anwendung verwenden? Weil ich meine Platinenzeichnungen später wiederverwenden möchte, wenn ich einen weiteren ADC oder GPIO hinzufügen muss. Wenn ich SPI verwende, muss ich eine Linie für den CS-Pin der neuen Komponente zeichnen. Auch wenn es derzeit nicht zwingend erforderlich ist, unterstützt SPI keine Interrupts. Da SPI zehnmal schneller ist als die meisten I2C-Implementierungen, ist die zyklische Überprüfung auf Änderungen eine sinnvolle Option. Vielleicht muss ich, wie Sie vorschlagen, SPI für den Datenaustausch und einen Low-End-Mikrocontroller mit eigenem seriellen Protokollstapel für Chipauswahlleitungen verwenden ...
... und nur SPI erlaubt keine modularen Schaltungen.
Siehe Patentnummer US 6629172 B1 . Sie können dies mit einem zusätzlichen I/O tun.
Dies ist keine großartige Frage (sie "erzeugt Diskussionen"), also kommentiere ich sie, anstatt sie zu beantworten. Es hört sich so an, als wüssten Sie die Antwort auf Ihre Frage bereits: Ja, es gibt ein Standard-SMBus-Adressauflösungsprotokoll (ARP), aber Sie mögen es einfach nicht. Ein Hauptproblem bei Ihrem Konzept besteht darin, dass Slaves einen nichtflüchtigen Speicher haben müssen. Das ist für den IC-Designer und -Anbieter ärgerlich und fügt jedem Teil sowie dem Design nicht unerhebliche Kosten hinzu. Ohne nachzusehen, würde ich vermuten, dass das SMBus-ARP keine solche Anforderung hat (ich sage dies, ohne etwas über SMBus-ARP zu wissen).
Haben Sie "Daisy-Chain-SPI" oder (praktisch dasselbe) "Daisy-Chained JTAG" in Betracht gezogen , das nur 4 Pins auf der Host-CPU benötigt? (Sie benötigen keine weiteren Pins auf dem Host, egal wie viele Peripheriegeräte hinzugefügt werden).

Antworten (5)

Ihr Problem kann mit SMBus gelöst werden, der logischerweise eine Erweiterung von I2C ist. SMBus unterstützt ein ARP, wobei es mehrere ICs mit derselben Adresse erkennen und ihnen eine andere Adresse zuweisen kann. Der ARP-Prozess liest grundsätzlich eine UUID (eine eindeutige ID pro Gerät; alle verschiedenen Geräte in derselben Charge haben eine andere UUID) von der Slave-Adresse (es können mehrere Geräte an dieser Slave-Adresse vorhanden sein). Aufgrund des Arbirationsprozesses des I2C-Busses ist jeweils nur ein Slave erfolgreich, und der Master liest erfolgreich seine UUID. Dann weist der Master unter Verwendung dieser UUID als Referenz eine eindeutige Adresse zu. Der Vorgang wird wiederholt, bis alle Slaves eine aufgelöste Adresse erhalten.

Gibt es ein Adresszuweisungsprotokoll, das Anbieter bereits in i2c implementieren [?]

Das aktuelle Protokoll lautet: Jeder Gerätehersteller schreibt an NXP und fordert die Zuweisung einer Adresse für jedes von ihm hergestellte Gerät an.

was wäre falsch an diesem [vorgeschlagenen] Protokoll [?]

I2C wird oft auf sehr kostengünstigen Teilen implementiert.

Ihr Vorschlag erfordert das Hinzufügen von nichtflüchtigem Speicher zu Teilen, die ihn meistens noch nicht haben.

Nichtflüchtige Speicher erfordern typischerweise spezialisierte Prozessschritte bei der IC-Herstellung.

Das Hinzufügen von Prozessschritten erhöht die Kosten eines IC.

Ihr Vorschlag ist also nicht mit der Beibehaltung der niedrigen Kosten vieler I2C-Teile vereinbar.

Außerdem erfordert Ihr Vorschlag, dass jedes Master-Gerät ein Protokoll implementiert, um die neuen Adressen auf Anfrage zuzuweisen. Dies erhöht die Komplexität, die viele Benutzer möglicherweise nicht möchten.

Wenn nichts falsch ist, warum fangen sie dann nicht an, ein solches Protokoll zu implementieren?

Dies ist eine Marketingfrage, keine Frage des Elektronikdesigns.

Okay, ich verstehe, dass nichtflüchtiger Speicher enorme Kosten verursacht. Hier noch ein Vorschlag (wieder abwärtskompatibel):
@ceremcem, Stackexchange ist nicht wirklich für Hin- und Her-Diskussionen ausgelegt. Bessere Orte für diese Art von Interaktion wären unser Chat ( chat.stackexchange.com ) oder die Diskussionsforen von allaboutcircuits.com oder die Foren „ECE“ und „AskElectronics“ auf Reddit.
Hmm... Ok, ich darf die Frage gleich verschieben.

Das Problem der automatischen Adressvergabe scheint ein brauchbares Konzept in den Fällen zu sein, in denen Sie die Geräte aus kostengünstigen Mikrocontrollern herstellen.

Der Versuch, dieses Protokoll auf Low-End-Chips wie Port-Expander, Muxes, Temperatursensoren, Eeproms und ähnliche Chips zu legen, bringt wirklich mehr Designaufwand und Siliziumfläche auf den Chip. Dies macht es immer schwieriger, die Kosten einfacher Chips in eine Bereitstellung auf Plattformebene zu implementieren.

Die Zuweisung einer Adresse durch den Master und einige der anderen von Ihnen beschriebenen Funktionen sind einfach nicht Teil des i2c-Standards. Das Ergebnis könnte funktionieren, aber es wäre nicht i2c. Sie verlieren viele der Vorteile der Verwendung eines Standards.

Es ist jedoch Teil des smbus-Standards. Siehe den Abschnitt über das Address Resolution Protocol.

Wenn Sie diese Funktion zum Zuweisen von Adressen nach Host wirklich auf absolut jedem Peripheriegerät benötigen, das Sie verwenden müssen, sollten Sie jedem Peripheriegerät einen Gate-Mikrocontroller hinzufügen und SMBus ARP auf diesen implementieren. Diese Mikrocontroller übersetzen auch die auf dem Bus ausgegebene Adresse in die Adresse, die von dem Gerät erkannt wird, an das sie angeschlossen ist.

Beachten Sie, dass dies dazu führen wird, dass Sie I2C irgendwie schlagen müssen. Da Sie jedoch bereits Mikrocontroller verwenden, die Protokolle übersetzen, können Sie genauso gut Ihren eigenen Protokollstapel entwerfen.