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)
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 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/177111Vielleicht 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:
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.
Kellenjb
Ping gefegt
Markieren
Chris Gambell