Hilfe bei der Geräteidentifikation in einer Kette

Ich arbeite an einem neuen Projekt, bei dem ich versuche, Geräte in einer Art "Netzwerk" mit geschlossenem Protokoll zu identifizieren.

Ich versuche festzustellen, wie viele Geräte es gibt und welche eindeutigen IDs jedes Gerät hat. Ich werde wahrscheinlich ein EPROM oder etwas Ähnliches haben, um die eindeutige Kennung zu speichern.

Die Frage, die ich an das Forum hätte, wäre: Ist eine Daisy-Chain der beste Weg, um die Geräte zu identifizieren? (Wie nachfolgend dargestellt)

Alt-Text

Ich dachte, ich könnte versuchen, auch einzelne Steuerleitungen zu den Geräten zu führen, aber ich werde nicht unbedingt wissen, wie viele Geräte es insgesamt gibt. Ich kann das letzte Gerät wieder an eine Rückleitung anschließen (physisch mit einem Jumper und hier durch den blauen Punkt gekennzeichnet).

Also noch einmal meine Frage: Gibt es einen besseren Weg, dies zu tun?

Es könnte hilfreich sein, mehr über Gerät 1, 2 und 3 zu wissen. Wenn sie bereits ein definiertes Protokoll haben, müssten Sie sie genau so anschließen, wie es das Gerät will.
Hallo Chris. Von wie vielen Geräten reden wir? Ich weiß, Sie sagen, Sie würden die Gesamtsumme nicht kennen, aber reden wir von 10, 1000 oder mehr? Außerdem, in welcher Art von Umgebung werden Sie unwissend sein oder nicht so viele Benutzer? Wie wichtig ist Robustheit?
Was ist die PHY? I2C? SPI? etwas anderes?
Die Phy wurde noch nicht bestimmt, das ist noch am Anfang des Prozesses. Ich denke, es wird im Moment bei 4 auf einmal maximal sein, könnte aber in Zukunft mehr sein. Die andere Sache ist, dass die Möglichkeit besteht, dass die 4 Geräte jedes Mal anders sind. Dies werden im Grunde austauschbare Geräte sein.

Antworten (6)

Es wäre hilfreich zu wissen, welche Phy-Schicht Sie verwenden. Aber hier sind einige allgemeine Informationen:

Wenn Sie I2C verwenden, sollte Ihr Bus in etwa so aussehen:

(entnommen von societyofrobots.com)

Zur Laufzeit können Sie die I2C-Adressen erkennen, indem Sie den Bus scannen , indem Sie eine START-Bedingung an jede Adresse senden und auf ein ACK prüfen.

Wenn Sie SPI verwenden, benötigen Sie eine Chipauswahlleitung pro Gerät. Wenn Ihnen die Pins ausgehen, können Sie eine Art Multiplexer verwenden. Möglicherweise können Sie den Bus scannen, indem Sie nacheinander jede Chipauswahlleitung aktivieren und versuchen, zu kommunizieren.

http://kkamagui.springnote.com/pages/422905/attachments/177111
Ich denke, ich würde aufgrund der Art der Geräte, an denen ich arbeite, zur SPI-Lösung tendieren. Ich werde in der Lage sein, bis zu einem Punkt fest zu verdrahten, aber dann wäre es nach diesem Punkt unbekannt (die Geräte werden sich von Zeit zu Zeit ändern).
Eine andere Sache, an die ich dachte. Da ich versuche, die Geräte austauschbar zu machen, hatte ich auch gehofft, dass es sich um dasselbe Board handelt (Layout, bei dem nur die programmierte eindeutige ID unterschiedlich ist). Das ist ein weiteres Problem, da die CS-Leitungen nicht unbedingt nur zu einem der Geräte laufen würden. Ich mache mir wirklich Sorgen, dass ich mich für ein "selbstorganisierendes Netzwerk" einrichte, das viel komplizierter ist, als ich möchte.
Wenn Sie in jedem Gerät eine MCU haben, können Sie möglicherweise auf die Chipauswahl verzichten. Alle Geräte überwachen die Data+Clock-Leitungen und antworten nur, wenn sie angesprochen werden (z. B. erstes empfangenes Byte). Jedes Gerät müsste eine eindeutige Adresse haben. Wenn Sie versuchen, Kabel einzusparen (auf Kosten der Geschwindigkeit), werfen Sie einen Blick auf den 1-Draht-Microlan-Bus von Maxim.

Vielleicht möchten Sie sich LIN ansehen , das etwas namens SNPD verwenden kann, um Knoten zur Laufzeit zu erkennen und Adressen zuzuweisen. Es gibt drei Methoden, die im Wikipedia-Artikel vorgestellt werden, und jede würde funktionieren, aber einige sind anscheinend patentiert, also seien Sie vorsichtig.

Das LIN-Protokoll selbst ist ein ziemlich einfaches SCI-basiertes Protokoll mit einigen zusätzlichen Zuverlässigkeitsmerkmalen, aber die SNPD-Techniken könnten auf jede serielle Datenübertragung angewendet werden.

Senden Sie einen Befehl an das erste Gerät, um seine Adresse zu senden, gefolgt von einem Zähler (Null zum Starten). Jedes Gerät liest den Befehl ein und gibt den Befehl aus.

Lesen Sie dann den Zähler ein, inkrementieren Sie ihn und geben Sie den Zähler aus.

Lesen Sie dann alle früheren Adressen ein und senden Sie sie ab.

Dann senden Sie seine Adresse.

Wenn jedes Gerät den Befehl erhält, hängt es seine Adresse an die Antwort an.

Wenn die Geräte mit 1, 2, 3 nummeriert sind, lautet die resultierende Antwort:

DISCOVER CMD
COUNT = 3
ADDRESS 1
ADDRESS 2
ADDRESS 3

Wenn Sie nicht zu viel schnelles Reden machen müssen, schauen Sie sich Dallas One-Wire für Ihren Bus an.

1 Draht (und eine implizite Masse)

adressierbar, 250 Stück pro Bus, routebar, und die Schnittstellengeräte sind sehr billig.

Wirklich nützlich als Systemverwaltungsbus, weil er so entbehrlich ist. Ich habe eine Familie von Systemen, die 1-Draht für die Systemverwaltung und Geräteerkennung verwenden, dann etwas anderes (wie) Jindi für die Kommunikation.

Ich empfehle von ganzem Herzen etwas mit einem Metaprotokoll, damit Sie die Dinge später ändern können.

Sie können hier wirklich nicht einmal eine Wahl treffen, ohne die PHY-Schicht zu bestimmen, aber einige Ideen:

Wenn das System wirklich wie abgebildet verkettet ist, rufen Sie jedes Gerät der Reihe nach auf. Werksprogramm an die "Broadcast-Adresse", wenn der PHY eine hat (wie es I2C tut). Lassen Sie dann einfach jedes Gerät eine Adresse auswählen und diese Adresse an das nächste Gerät senden, während es sich in der Kette nach unten bewegt.

Bei Verwendung von 8bit UIDs bekommt man, zumindest von mir, Bonuspunkte, wenn man bei den Adressen etwas Komisches in ASCII buchstabiert:

Master: „Hey Gerät 1, wähle eine Adresse“ Gerät 1: „M“, hey Gerät 2 wähle eine Adresse Gerät 2: „y“ Gerät 3: „B“ Gerät 4: „o“ Gerät 5: „s“ Gerät 6 : „s“ Gerät 7: „S“ Gerät 8: „u“ Gerät 9: „c“ Gerät 10: „k“ Gerät 11: „s“

Alternativ, wenn Ihr Design eine feste Anzahl von Geräten hat: Ich hatte ein Design, das eine Backplane verwendete, in die bis zu 4 Karten eingesteckt werden konnten Lüftersteuerungs-IC, den ich sowieso brauchte, ich habe gerade einen mit einer I2C-Schnittstelle und einigen GPIOs darauf ausgewählt).

Ich habe einen GPIO durch jeden Kartenrandanschluss zum Reset-Pin des DSP auf jeder Steckkarte geleitet. Alle DSPs wurden werkseitig auf 1 Adresse programmiert. Der Systemcontroller brachte die Steckplätze gleichzeitig aus Reset 1 heraus, ein I2C-Befehl wurde gesendet, wenn etwas ACK gab, wurde angenommen, dass der Steckplatz belegt war, und es wurde ein Befehl gesendet, um seine I2C-Adresse in eine UID für diesen Steckplatz zu ändern. Dies wurde für jeden Schlitz mit einer angemessenen Antwortzeitüberschreitung durchgeführt.

Wenn es sich um einen gemeinsam genutzten Bus handelt, der in der Lage ist, Slave-Übertragungen zu initiieren, auch bekannt als Multi-Master. Lassen Sie einfach das Slave-Gerät die Kontrolle über den Bus übernehmen und fragen Sie den Master nach einer Adresse. Der Master gibt ihm einfach die nächste Adresse in der Reihe, denken Sie an DHCP. Gleiche Bonuspunkte wie oben.

Wenn der PHY Single-Master ist und Sie eine völlig unbekannte Anzahl von Geräten haben .... ein GPIO durch sie verketten und damit steuern, ob sie auf eine werkseitig programmierte Adresse reagieren? Wenn der Slave dann seine Adresse erhält, deaktiviert er das nächste Gerät in der Reihe? Auf diese Weise benötigen Sie nur 2 GPIO-Pins pro Gerät und 1 für den Master, und Sie können Geräte einzeln hochfahren. Sollte funktionieren denke ich.

Wie auch immer, ehrlich gesagt alle Spekulationen, bis Sie sich für einen PHY entscheiden und uns mehr darüber erzählen können, wie das Gesamtsystem verbunden ist.

Möglichkeiten für die Haupt-CPU, herauszufinden, wie viele Geräte mit ihr verbunden sind – und die ID jedes einzelnen – umfassen:

  • Daisy-Chain-Systeme benötigen keine eindeutige „Adresse“ – jedes Gerät wird implizit durch seine Entfernung (Hop-Anzahl) von der Haupt-CPU adressiert. Sobald Sie herausgefunden haben, dass es 7 Geräte gibt, können Sie jedes an den Standorten 1, 2, 3, 4, 5, 6 und 7 adressieren.
    • Systeme mit einer globalen Taktleitung, wie z. B. Daisy-Chained SPI: Die Haupt-CPU verschiebt sich in einem eindeutigen Muster, gefolgt von vielen "0"-Bits, und zählt, wie viele Takte es dauert, bis dieses Muster zur Haupt-CPU zurückkehrt: wenn es getaktet ist N Taktbits ausgibt und jedes Gerät ein 16-Bit-Register hat, dann muss es N/16 Geräte in der Kette geben.
    • Systeme ohne globale Taktleitung, nur lokale Busse, wie Token-Ring-Netzwerke: Jede Nachricht von der Haupt-CPU an ein Peripheriegerät enthält eine Zieladresse. Wenn ein Gerät eine an "1" adressierte Nachricht erhält, arbeitet es mit dieser Nachricht. Andernfalls leitet es die Nachricht unverändert an das nächste Gerät weiter – außer dass es die Adresse dekrementiert. Wenn die Haupt-CPU eine Nachricht mit einer unmöglich großen Zieladresse aussendet, beansprucht keines der Geräte diese, und die Haupt-CPU kann erkennen, wie viele Geräte am Bus sind, indem diese Adresse um die Schleife herum dekrementiert wurde (die Hop-Anzahl).
  • Geräteauswahlsysteme benötigen keine eindeutige "Adresse" - jedes Gerät wird implizit dadurch adressiert, welche der Geräteauswahlleitungen von der Haupt-CPU es aktivieren. Aktivieren Sie für jede Geräteauswahlzeile die Geräteauswahlzeile und senden Sie ein einfaches "Wer sind Sie?" Nachricht, und prüfen Sie, ob am Ende dieser Zeile ein Gerät vorhanden ist, das eine Antwort gibt.
  • Bussysteme, die nur "globale" ("gemeinsame") Signale haben, bei denen jedes Gerät eine eindeutige festverdrahtete Adresse hat.
    • Einige Systeme wie CANbus und einige RFID-Protokolle ermöglichen es der Haupt-CPU, nach nur wenigen hundert Befehlen zu erkennen, dass hundert Geräte daran angeschlossen sind, und die eindeutige ID jedes einzelnen, selbst wenn es Millionen möglicher Adressen gibt -- Vereinzelungsprotokolle . Dadurch kann jedes Peripheriegerät eine eindeutige Adresse haben, selbst wenn Millionen davon hergestellt wurden, und es der Haupt-CPU dennoch ermöglicht, die relativ wenigen Geräte, die tatsächlich mit ihr kommunizieren, schnell zu erkennen.
    • Einige Protokolle, wie z. B. I2C, unterstützen kein schnelles Vereinzelungsprotokoll, erlauben aber das Scannen: Die Haupt-CPU kann ein „Hallo, , können Sie mich hören?“ senden. an jede mögliche Adresse. (Dies kann sehr lange dauern, wenn es Millionen möglicher Adressen gibt).
  • Bussysteme, bei denen jedem Gerät (irgendwann) eine Adresse zugewiesen wird, die bei jedem Einschalten anders sein kann: z. B. DHCP. Dies ist wahrscheinlich eine unnötige Komplexität für Ihre Anwendung.

Viele Leute behaupten: "Wenn Sie SPI verwenden, benötigen Sie eine Chipauswahlleitung pro Gerät." Wenn das stimmt, was ist dann ein guter Name für dieses andere Protokoll, das keine Chipauswahlleitung pro Gerät benötigt, sondern nur feste 4 Pins auf der Haupt-CPU, selbst mit Dutzenden von Peripheriegeräten – dh das von Geräten verwendete Protokoll dass Wikipedia "Daisy-Chain-SPI" nennt ?

Anstatt ein weiteres quadratisches Rad neu zu erfinden, sollten Sie sich vielleicht die Liste der gängigen Protokolle für eingebettete Systeme ansehen, um die meisten Fallstricke zu vermeiden, die häufig Leute beißen, die Protokolle von Grund auf neu entwerfen. Vielleicht haben Sie Glück und können eines dieser Protokolle unverändert oder mit relativ geringfügigen Änderungen verwenden.

Der Begriff „SPI“ umfasst inzwischen so gut wie jede getaktete serielle Schnittstelle, bei der ein einzelnes Master-Gerät die exklusive Kontrolle über die Uhr hat und bei der der Zustand einer Datenleitung außer an einer bestimmten Taktflanke (bei einigen Geräten die relevante Flanke ist steigend, für andere fallend). Die meisten Dinge, die als SPI-Geräte bezeichnet werden, erfordern individuelle Chipauswahlen, aber es gibt viele Geräte, die angepasst werden können, um mit einem SPI-Bus zu kommunizieren (z. B. 74HC595- oder 74HC165-Chips), die verkettet werden können. Ich würde eine Kette von sechs 74HC595 mit einem gemeinsamen Latch-Signal als ein einzelnes SPI-artiges Peripheriegerät betrachten.