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:
- Slave-Komponenten hätten 2 Bytes nichtflüchtigen Speicher, um ihre Adressen dauerhaft zu behalten.
- Slaves haben eine Standardadresse (z. B. 0x01).
- 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).
- 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).
- 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
- Gibt es ein Adresszuweisungsprotokoll, das Anbieter bereits in i2c implementieren
- Wenn nicht, was wäre an diesem Protokoll falsch?
- 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).
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.
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.
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.
Das Photon
Passant
but weren't we choosing and using i2c for simplicity (like fewer routes on board, flexibility etc) in the first place?
Das Photon
Passant
feier
feier
Benutzer53863
niedergeschlagen
davidcary