Zwei-Wege-Kommunikation zwischen einem Master und mehreren Knoten

Ich habe eine Architektur wie diese:

Die Architektur

Master - Es enthält einen HF-Kommunikationschip. Alle Knoten verlassen sich auf den Master, um Daten zu empfangen und an eine zentrale Einheit zu senden.

Knoten - Es hat einige grundlegende GPIO-Funktionen. Es kann 4-5 verschiedene Arten von Knoten geben, die jeweils eine andere GPIO-Anzahl erfordern. Aus Gründen der Einfachheit des Designs plane ich, einen billigen Mikrocontroller auf jeden Knoten zu werfen und alle GPIO lokal zu handhaben. Auf diese Weise brauche ich nur ein vordefiniertes Steuerdatenpaket vom Master, um eine Aufgabe zu erledigen. In ähnlicher Weise sendet der Knoten ein vordefiniertes Paket, das der Master versteht. Die Paketdefinition enthält den Knotentyp.

Die Anzahl der Knoten kann sich ändern und sollte vorzugsweise Hot-Swap-fähig sein. So funktioniert die Kommunikation:

Zwei Knoten kommunizieren nicht direkt.

Der Master kann ein Datenpaket haben, das er an einen bestimmten Knoten senden möchte.

Jeder Knoten kann ein Datenpaket haben, das er an den Master senden möchte.

Der maximale Abstand zwischen einem Knoten und dem Master beträgt weniger als 50 cm.

Nach einigem Nachdenken kam ich zu folgendem Plan:

Lassen Sie alle Knoten über i2c kommunizieren. 16 Knoten pro Master scheinen eine gute Zahl zu sein, also kann ich einen 4-Bit-DIP-Schalter setzen, um die i2c-Adresse jedes Knotens einzustellen. Grundsätzlich werde ich auf 4 gpio digital lesen und die Adresse entsprechend einstellen.

Dies ist perfekt, wenn der Master Daten auf den Knoten lesen oder schreiben möchte.

Für die Zeit, in der der Knoten Daten senden möchte, benötige ich einen zusätzlichen GPIO pro Knoten, der den Master benachrichtigt, dass einige Daten vorhanden sind. Alternativ kann ich weiterhin alle Knoten in der Schleife lesen und prüfen, ob einige Daten verfügbar sind.

Gibt es eine bessere Lösung für dieses Problem?

Antworten (2)

Als Alternative zu I2C könnten Sie CANbus für diese Lösung in Betracht ziehen. Es ist wohl komplexer, aber Slaves könnten auf demselben Bus mit dem Master zurückkommunizieren, ohne dass ein GPIO benötigt wird, um anzuzeigen, dass sie Daten verfügbar haben. Außerdem ist die Kollisionserkennung in das Design der physikalischen Schicht und des Protokolls integriert.

CAN-Controller sind relativ günstig erhältlich, obwohl Sie für jeden Knoten einen Transceiver benötigen.

Andere gängige Multidrop-Busse, die Sie in Betracht ziehen könnten:

RS-485: Einfach zu verwenden, aber Sie wären für die gesamte Adressierung verantwortlich. I2C baut das zumindest ein.

SPI: Nützlich, wenn Sie E/A für eine Slave-Auswahlleitung für jeden Knoten übrig haben. Basierend auf Ihrer obigen Beschreibung wäre dies wahrscheinlich nicht die beste Route.

Benötige ich zusätzliche CAN-Bus-Transceiver, obwohl mein Mikrocontroller das CAN-Protokoll unterstützt? Ich habe versucht, auf digikey nach CAN-Transceivern zu suchen, und habe herausgefunden, dass die meisten davon vom Typ 5 V sind. Ist es üblich, dass sie mit 5 V betrieben werden? Sind 3,3 V ein seltener Fall für CAN?
@Whiskeyjack Ich bin mir nicht sicher ... es ist möglich, dass einige Mikrocontroller in die Transceiver eingebaut sind. Die von uns verwendeten benötigen noch einen externen Transceiver. In Bezug auf 3,3-V-Transceiver ist TI SN65HVD232DG4 einer. Es ist bei Mouser erhältlich.
Danke. Ich schaue mir das mal an und prüfe die Machbarkeit. :)

Ihre Umfragelösung ist wahrscheinlich die klassischste.

Eine andere Lösung besteht darin, eine Broadcast-Umfrage durchzuführen.

Senden Sie im Grunde eine Nachricht, die jeder hört, was dazu führt, dass sie nach Erhalt der Umfrage einen Impuls mit einer festgelegten Verzögerung senden, wenn sie Daten haben. Die Verzögerungslänge wird durch die Geräteadresse eingestellt.

Der Master kann dann das Rücksignal überwachen und entschlüsseln, wer Daten zu senden hat, und diese direkt anfordern.

Eine andere Technik besteht darin, eine kurze Verzögerung zwischen der Master-Übertragung und der Slave-Bestätigung einzubauen. Verwenden Sie dann dieses Fenster, um den Slaves zu erlauben, einen einzelnen Impuls zu kreischen, der wie ein Interrupt für den Master wirkt. Sie müssten sie dann abfragen.

Broadcast-Sache scheint interessant zu sein. Ich werde noch etwas darüber nachdenken. Übrigens, wie schwierig wird es Ihrer Meinung nach sein, eine benutzerdefinierte Slave-Adresse für einen allgemeinen Mikrocontroller festzulegen? Arduino UNO (atmega328p) ist ziemlich einfach.
@Whiskeyjack ya die Adresse ist immer das Problem. Es gibt Möglichkeiten, wie Sie zufällige Adressen festlegen können, aber es wird schnell kompliziert.
@Whiskeyjack ist normalerweise auch eine Art Kollisionserkennung erforderlich.