Frage:
Hilfe bei der Geräteidentifikation in einer Kette
Chris Gammell
2010-10-14 07:46:03 UTC
view on stackexchange narkive permalink

Ich arbeite also an einem neuen Projekt, in dem ich versuche, Geräte in einer Art geschlossenem Protokoll "Netzwerk" zu identifizieren. Ich versuche festzustellen, wie viele Geräte es gibt und welche eindeutigen IDs für jedes Gerät vorhanden sind. Ich werde wahrscheinlich einen Eprom oder ähnliches haben, um die eindeutige Kennung zu speichern. Die Frage, die ich für das Forum hätte, wäre: Ist eine Daisy Chain der beste Weg, um die Geräte zu identifizieren? (wie unten gezeigt)

alt text

Ich dachte, ich könnte versuchen, auch einzelne Steuerleitungen zu den Geräten zu leiten, aber ich weiß nicht unbedingt, wie viele Geräte insgesamt aus sind Dort. Ich kann i> das endgültige Gerät wieder an eine Rückleitung anschließen (physisch mit einem Jumper und hier durch den blauen Punkt gekennzeichnet).

Meine Frage lautet also: Gibt es einen besseren Weg, dies zu tun?

Danke!

Es kann hilfreich sein, mehr über Gerät 1 2 und 3 zu erfahren. Wenn sie bereits ein definiertes Protokoll haben, müssen Sie sie genau so anschließen, wie es das Gerät wünscht.
Hallo Chris. Über wie viele Geräte sprechen wir? Ich weiß, dass Sie sagen, Sie werden die Summe nicht kennen, aber sprechen wir über 10, 1000 oder mehr? Was für eine Umgebung werden Sie auch sein - ahnungsvolle Benutzer oder nicht so sehr? Wie wichtig ist Robustheit?
Was ist der PHY? I2C? SPI? etwas anderes?
Der Phy wurde noch nicht bestimmt, dies ist noch früh im Prozess. Ich denke, es wird momentan um 4 Uhr maximal sein, könnte aber in Zukunft mehr sein. Die andere Sache ist, dass es das Potenzial gibt, dass die 4 Geräte jedes Mal anders sind. Dies sind im Grunde austauschbare Geräte.
Sechs antworten:
Toby Jaffey
2010-10-14 13:31:40 UTC
view on stackexchange narkive permalink

Es wäre hilfreich zu wissen, welche Phy-Ebene Sie verwenden. Im Folgenden finden Sie einige allgemeine Informationen:

Wenn Sie I2C verwenden, sollte Ihr Bus ungefähr so ​​aussehen:

(von Societyofrobots.com übernommen)

Zur Laufzeit können Sie die I2C-Adressen erkennen, indem Sie den Bus scannen, indem Sie an jede Adresse eine START-Bedingung senden und nach einer Bestätigung suchen.

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, einen Trend zur SPI-Lösung machen. 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 hin und wieder auswechseln)
Eine andere Sache, an die ich gedacht habe. Da ich versuche, die Geräte austauschbar zu machen, hatte ich auch gehofft, dass sie dieselbe Karte sind (Layout, bei dem nur die programmierte eindeutige ID unterschiedlich ist). Dies ist ein weiteres Problem, da die CS-Leitungen nicht unbedingt nur auf einem der Geräte ausgeführt werden müssen. Ich bin wirklich besorgt, dass ich mich auf ein "selbstorganisierendes Netzwerk" einrichte, das viel komplizierter ist als ich will.
Wenn Sie in jedem Gerät eine MCU haben, können Sie möglicherweise auf die Auswahl des Chips verzichten. Alle Geräte überwachen die Daten + Taktleitungen und reagieren nur bei Adressierung (z. B. erstes empfangenes Byte). Jedes Gerät muss eine eindeutige Adresse haben. Wenn Sie versuchen, Kabel zu reduzieren (auf Kosten der Geschwindigkeit), schauen Sie sich den 1-Draht-Mikrolan-Bus von Maxim an.
AdamShiemke
2010-10-14 19:47:00 UTC
view on stackexchange narkive permalink

Vielleicht möchten Sie sich LIN ( http://en.wikipedia.org/wiki/Local_Interconnect_Network) ansehen, das zur Laufzeit mithilfe von SNPD Adressen erkennen und Knoten zuweisen kann. Im Wikipedia-Artikel werden drei Methoden vorgestellt, und jede würde funktionieren, aber einige sind anscheinend patentiert. Seien Sie also vorsichtig.

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

Robert
2010-10-14 17:58:36 UTC
view on stackexchange narkive permalink

Senden Sie einen Befehl an das erste Gerät, das seine Adresse sendet, 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 inkrementell ein und geben Sie den Zähler aus.

Lesen Sie dann alle vorherigen Adressen ein und senden Sie sie.

Senden Sie dann die Adresse.

Wenn jedes Gerät den Befehl erhält, Die Adresse wird an die Antwort angehängt.

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

  CMDCOUNT ENTDECKEN = 3ADRESSE 1ADRESSE 2ADRESSE 3  
Tim Williscroft
2010-10-15 02:48:21 UTC
view on stackexchange narkive permalink

Wenn Sie nicht zu schnell sprechen müssen, schauen Sie sich Dallas One-Wire für Ihren Bus an.

1 Draht (und eine implizite Masse)

adressierbar, 250 Aus pro Bus, routingfähig 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 verwenden und Geräteerkennung, dann etwas anderes (wie) jindi für die Kommunikation.

Ich empfehle von ganzem Herzen etwas mit einem Metaprotokoll, damit Sie später Änderungen vornehmen können.

Mark
2010-10-15 06:19:50 UTC
view on stackexchange narkive permalink

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

Wenn das System wirklich wie gezeichnet verkettet ist, rufen Sie jedes Gerät der Reihe nach auf. Werkseitiges Programm an die "Broadcast-Adresse", falls der PHY eine hat (wie I2C). 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 die Kette entlang bewegt.

Wenn Sie 8-Bit-UIDs verwenden, erhalten Sie Bonuspunkte, zumindest von mir, wenn Sie etwas Komisches in ASCII mit den folgenden Adressen buchstabieren:

Master: "Hey Gerät 1, wählen Sie eine Adresse "Gerät 1:" M ", hey Gerät 2 wählen Sie 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 Rückwandplatine verwendete Es konnten bis zu 4 Karten eingesteckt werden. Am Ende habe ich einen I2C-basierten GPIO-Expander auf der Rückwandplatine platziert (eigentlich war es ein Lüftersteuerungs-IC, den ich sowieso brauchte. Ich habe nur einen mit I2C-Schnittstelle und einige GPIOs ausgewählt ).

Ich habe einen GPIO über jeden Kartenrandanschluss zum Reset-Pin des DSP auf jeder Einsteckkarte geleitet. Alle DSPs wurden werkseitig auf 1 Adresse programmiert. Der Systemcontroller brachte die Steckplätze jeweils aus Reset 1 heraus, es wurde ein I2C-Befehl gesendet. Wenn etwas bestätigt wurde, wurde angenommen, dass der Steckplatz gefüllt war, und es wurde ein Befehl gesendet, seine I2C-Adresse in eine UID für diesen Steckplatz zu ändern. Dies wurde für jeden Steckplatz mit einem angemessenen Antwortzeitlimit durchgeführt.

Wenn es sich um einen gemeinsam genutzten Bus handelt, der Slaves initiieren kann, 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 nur die nächste Adresse in der Zeile, denken Sie an DHCP. Gleiche Bonuspunkte wie oben.

Wenn der PHY ein einzelner Master ist und Sie eine völlig unbekannte Anzahl von Geräten haben ... verketten Sie einen GPIO durch diese und steuern Sie damit, 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 Zeile? 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 aufrufen. Sollte funktionieren, denke ich.

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

davidcary
2011-02-22 09:19:34 UTC
view on stackexchange narkive permalink

Zu den Möglichkeiten für die Haupt-CPU, festzustellen, wie viele Geräte mit ihr verbunden sind - und die ID jedes einzelnen - gehören:

  • Daisy-Chain-Systeme erfordern keine eindeutige "Adresse "- Jedes Gerät wird implizit durch seine Entfernung (Hop Count) von der Haupt-CPU angesprochen. Sobald Sie herausgefunden haben, dass es 7 Geräte gibt, können Sie jedes an Position 1, 2, 3, 4, 5, 6 und 7 ansprechen.
    • Systeme mit einer globalen Taktleitung, wie z. B. Daisy- verketteter 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 N Taktbits getaktet hat und jedes Gerät eine 16 hat Bitregister, dann müssen sich N / 16 Geräte in der Kette befinden.
    • 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, verarbeitet es diese Nachricht. Andernfalls wird die Nachricht unverändert an das nächste Gerät weitergeleitet - außer dass die Adresse dekrementiert wird. Wenn die Haupt-CPU eine Nachricht mit einer unglaublich großen Zieladresse sendet, beansprucht keines der Geräte diese, und die Haupt-CPU kann anhand der gesamten Schleife erkennen, wie viele Geräte sich auf dem Bus befinden (die Anzahl der Hops).
  • Geräteauswahlsysteme erfordern keine eindeutige "Adresse" - jedes Gerät wird implizit von welcher der Geräteauswahlleitungen von der Hauptleitung angesprochen CPU aktiviert es. Aktivieren Sie für jede Geräteauswahlzeile die Geräteauswahlleitung und senden Sie ein einfaches "Wer sind Sie?" Nachricht, und prüfen Sie, ob sich am Ende dieser Zeile ein Gerät befindet, das eine Antwort gibt.
  • Bussysteme, die nur "globale" ("gemeinsame") Signale haben, bei denen jedes Gerät über eine eindeutige Festverdrahtung verfügt Adresse.
    • Bei einigen Systemen, wie z. B. CANbus und einigen RFID-Protokollen, kann die Haupt-CPU nach nur wenigen hundert Befehlen erkennen, dass hundert Geräte daran angeschlossen sind, und die eindeutige ID jedes einzelnen, selbst wenn Millionen vorhanden sind von möglichen Adressen - Singulationsprotokolle. Auf diese Weise kann jedes Peripheriegerät eine eindeutige Adresse haben, selbst wenn Millionen von ihnen hergestellt wurden, und die Haupt-CPU kann dennoch schnell die relativ wenigen Geräte erkennen, die tatsächlich mit ihm sprechen.
    • Einige Protokolle, wie I2C unterstützen kein schnelles Singulationsprotokoll, erlauben jedoch 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 Millionen möglicher Adressen vorhanden sind.)
  • Bussysteme, bei denen jedem Gerät (eventuell) eine Adresse zugewiesen wird, die jeweils unterschiedlich sein kann Mal, wenn Sie es einschalten: wie 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 dies zutrifft, dann Was ist ein guter Name für dieses andere Protokoll, für das keine Chip-Auswahlleitung pro Gerät erforderlich ist, nur feste 4 Pins auf der Haupt-CPU, selbst bei Dutzenden von Peripheriegeräten - dh dem von Geräte, die Wikipedia "Daisy-Chain-SPI" nennt?

Anstatt ein weiteres quadratisches Rad neu zu erfinden, sollten Sie sich die Liste der gängigen eingebetteten Systeme ansehen Protokolle, damit Sie die meisten Fallstricke vermeiden, die häufig Menschen 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 geringen Anpassungen verwenden.

Der Begriff "SPI" umfasst nahezu jede getaktete serielle Schnittstelle, bei der ein einzelnes Master-Gerät die Uhr exklusiv steuert und bei der der Status einer Datenleitung außer bei einer bestimmten Taktflanke irrelevant ist (bei einigen Geräten die relevante Flanke steigt; für andere fällt). Die meisten Dinge, die als SPI-Geräte bezeichnet werden, erfordern eine individuelle Chipauswahl, aber es gibt viele Geräte, die für die Kommunikation mit einem SPI-Bus (z. B. 74HC595- oder 74HC165-Chips) angepasst werden können, der verkettet werden kann. Ich würde eine Kette von sechs 74HC595 mit einem gemeinsamen Latch-Signal als ein einziges SPI-artiges Peripheriegerät betrachten.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 2.0-Lizenz, unter der er vertrieben wird.
Loading...