Frage:
Multiplexing von UART
David Refoua
2018-04-23 06:51:36 UTC
view on stackexchange narkive permalink

Ich möchte die serielle Hardware-Schnittstelle meines Hauptmikrocontrollers gleichzeitig an mehrere Geräte anschließen. Mein Verständnis ist, dass UART auf meinen Mikrocontrollern auf einer Aktiv-Niedrig-5-V-TTL basiert.

(Ich weiß, was ich hier erkläre, kann technisch erreicht werden, indem geeignetere Protokolle wie SPI und I sup> C sup> C verwendet werden, aber mein Projekt muss only sein, das mit UART implementiert wird.)

Hier ist ein Pseudo-Schaltplan, der zeigt, was ich erreichen möchte:

schematic

simulieren diese Schaltung - Schema erstellt mit CircuitLab sup>

PBitte beachten Sie Folgendes:

  1. I don't möchte eine zweite UART-Schnittstelle auf dem Master oder einem der Slaves verwenden.

  2. Es wird jeweils nur one-Slave Daten auf der Leitung an den Master senden oder senden. (z. B. wenn der Slave 1 Daten überträgt, sollten Slave 2 und 3 inaktiv bleiben.)

  3. Was auch immer the master sendet, kann und sollte von allen Slaves empfangen werden.

  4. Alle Slaves sollten Hot-Plug-fähig sein, dh sie können jederzeit entfernt oder eingefügt werden.

  5. Die RX- und TX-Kabel zum Master verlaufen parallel zwischen den Slaves, sodass keine Verkettung erfolgt.

  6. ol>

    Meine Fragen lauten also wie folgt:

    1. Unter der Annahme, dass die richtige Impedanz berücksichtigt wird, sollte ich keine zusätzliche Schaltung benötigen, um Daten von der TX-Leitung des Masters gleichzeitig an eine der RX-Leitungen des Slaves zu übertragen. Ist das richtig?

    2. Ich verstehe, dass ohne Strombegrenzungswiderstände zwischen der TX-Leitung der Slaves und der RX-Leitung des Masters die Leitung zwischen den Geräten kurzgeschlossen wird und ich die Gefahr habe, sie zu beschädigen. Ist das richtig?

    3. Angenommen, die Punkte 1 und 2 sind korrekt:

      a) Würden nur einige Strombegrenzungswiderstände ausreichen, um sie zu verwenden?

      b) Kann ich anstelle von Widerständen Logikgatter der Serie 74 verwenden?

    4. Welche Route soll ich zwischen den oben genannten Optionen a und b wählen?

    5. Für eine zuverlässige 115200-Baudrate-Verbindung reicht die Schaltfrequenz eines 74HC08 AND-Gatters aus, um eingebaut zu werden?

    6. ol>

      EDIT: Mir sind andere gut geeignete Protokolle wie SPI und I sup> C sup> C bekannt. Es gibt einen Grund, warum ich UART verwende, und das liegt daran, dass der optiboot-Bootloader, der auf der mcu des Masters verwendet wird, über UART kommuniziert, obwohl die offensichtlichen Einschränkungen von UART.

      Während das Verketten von Gänseblümchen definitiv ein kluger Ansatz ist, weil es die 4. Anforderung verletzt, bricht es auch die Bootloader-Funktionalität.

      Die Geräte könnten auch USB-zu-Seriell-Chips sein, und die Verwendung von SPI-zu-USB oder I2C-zu-USB wäre in diesem Projekt nicht möglich.

      Ich würde mich freuen, wenn Sie sich stattdessen auf die 6 hier aufgeführten Fragen konzentrieren und Ihr UART-Wissen teilen könnten.

Nur für 5, ich kann mir nicht vorstellen, dass Sie sich über die 100ns Ausbreitungsverzögerung von diesem und Gate Sorgen machen müssen
Wie stellen Sie sicher, dass nicht zwei Geräte gleichzeitig senden?
@JimmyB Einfach, die Geräte antworten nur auf Anfrage des Masters, und der Master stellt sicher, dass die vorherige Übertragung beendet wurde, bevor er eine neue anfordert.Außerdem kann jeder Client jetzt feststellen, ob die Leitung besetzt ist oder nicht, indem er die Empfangsleitung des Masters prüft und mit LOW vergleicht.
UART oder RS-232?Die beste Lösung, wenn RS-232 verfügbar ist, besteht darin, CTS / RTS-Leitungen zu implementieren und diese für Chipauswahlzwecke zu verwenden.Ein bisschen wie / SS in SPI, wenn Sie so wollen.Und dann brauchen Sie keine ekligen Tore auf den Datenleitungen.
Wenn Sie am Ende die Datenleitungen wechseln, möchten Sie wahrscheinlich kein UND-Gatter verwenden, sondern einen analogen Schalter / Mux.
Einfach Google RS485 und viel Spaß :)
Sechs antworten:
Brett K Smith
2018-04-23 08:31:10 UTC
view on stackexchange narkive permalink

Sind Sie mit UART verheiratet?SPI würde damit besser umgehen, denke ich.Die Slave-Auswahl gibt Ihnen das Multiplexing und Sie können einen Slave mehr als den anderen priorisieren, je nachdem, was der Master von den Slaves tut oder erwartet.Die Geschwindigkeit sollte mindestens genauso hoch sein, wenn nicht schneller als UART. Dieses Beispiel kommt auf die Idee.

SPI ist zufällig mein Lieblingsprotokoll. Das Hauptproblem ist, dass für mein Projekt UART erforderlich ist.da ich nicht derjenige bin, der mit UART verheiratet ist, ist Arduinos Bootloader :)
SPI passt nicht gut zu "Was auch immer der Arduino sendet, kann und wird von allen 3 Geräten empfangen".* Wenn * eine Art Slave-Auswahlmechanismus (Leitung) verfügbar wäre, würde dies genauso gut für die USART-Übertragung funktionieren und das Problem lösen.
Dorian
2018-04-23 15:12:41 UTC
view on stackexchange narkive permalink
  1. Für drei Geräte nein, für mehr überprüfen Sie das Datenblatt hinsichtlich der Eingangskapazität.

  2. Nicht ganz gefährlich, aber sicherlich nicht

  3. a) Nein b) Ja. Mit wenigen Slaves ist es mit kabelgebundenem UND (halbe Verbindungen erforderlich) besser, wenn sich Ihre Slaves nicht auf derselben Karte befinden.

  4. Offensichtlich die funktionierende, b

  5. Ja

    Bearbeitet, um einige Details anzugeben

  6. ol>

    2 und 3a, selbst wenn Sie die Empfehlung "Verbinden Sie nicht zwei Ausgänge miteinander" ignorieren, sind sich alle einig, dass das Ergebnis von zwei Einsen und einer Null für cmos-Ausgänge mit nahezu symmetrischen Eigenschaften niemals Null sein wird.

    3b Sie haben entweder einen Draht von jedem Slave zu einem N-Eingang (sternförmige Konfiguration) oder an jedem Slave haben Sie ein UND von seinem Ausgang und der Kette und verwenden den Und-Ausgang für den nächsten Slave-Ketteneingang.

    schematic

    simulieren diese Schaltung - Schema erstellt mit CircuitLab sup>

    Offensichtlich ist die Kettenkonfiguration kein Hot-Plug.

    Kabelgebunden UND, Sie haben zwei Optionen, abhängig von den Slave-Funktionen.

    Wenn Sie offene Drain- / Kollektorausgänge für TX haben, können Sie diese miteinander verbinden und einen globalen Pull-up-Widerstand hinzufügen.

    Wenn nicht, fungiert eine Diode an jedem Slave als verdrahtet und wie folgt:

    schematic

    simulieren diese Schaltung sup>

    Sie haben auch eine dritte Option: Um den Slave-Tx-Ausgang nach Beantwortung einer Nachricht einfach an HiZ zu senden, wird noch ein Pull-up-Widerstand benötigt.

Dies ist die Art von Antwort, auf die ich gehofft hatte, also danke!Wünschte, Sie könnten auf 2 und 3 näher eingehen. Könnten auch Dioden verwendet werden, um ein UND-Gatter zu bilden?
@DRSDavidSoft Ja, dies ist ein verdrahtetes UND
Ihre zweite Lösung mit ein paar Schottky-Dioden mit BAT54C-Array scheint der richtige Weg zu sein, und als solche markiere ich Ihre Antwort als die akzeptierte.Danke für die Erklärungen!
Henry Crun
2018-04-23 07:20:18 UTC
view on stackexchange narkive permalink

Sie müssen sicherstellen, dass sie nicht gleichzeitig senden.Zum Beispiel durch den Master, der die Slaves abfragt.

Verwenden Sie Dioden, um mehrere TXD miteinander zu verbinden, und ziehen Sie R am Master nach oben.Sie können einfach Firmware verwenden, wenn Sie möchten, und den TXD auf Eingang schalten, wenn Sie nicht auch senden, aber Dioden sind einfacher.

Alle RXD können einfach angeschlossen werden.

Ich habe nicht vor, von mehr als einem Gerät gleichzeitig zu senden, aber außer dass Arduino möglicherweise eine beschädigte Datensequenz empfängt, würde dies meine Chips beschädigen?
Zählt die Verwendung von Dioden auch als Implementierung eines negativen UND-Gatters?
Die Funktion ist ein logisches ODER von negativen (0) Werten.Es wird normalerweise "verdrahtetes ODER" genannt.Es ist natürlich elektrisch dasselbe wie bei Verwendung eines UND-Gatters
Sie müssen jeweils nur einzeln senden, da sonst die Daten beschädigt werden.Kein anderes Problem.Mein Punkt ist, dass Sie eine Möglichkeit haben müssen, um sicherzustellen, dass dies nicht geschieht.Als würde man jeden nacheinander nach Daten fragen (Polling)
Danke für die Information.Ich nehme an, dass diese und @Dorian's zweite Lösung die gleiche Methode ist?
Ja, Dorians Schema ist das, was ich meinte.Gewöhnliche Dioden sind wahrscheinlich in Ordnung
Ein Tipp: Setzen Sie Jumper in die TX-Leitungen ein, damit Sie sie trennen können.Es kann das Debuggen viel einfacher machen, wenn es schief geht oder eines fehlschlägt
supercat
2018-04-25 01:40:06 UTC
view on stackexchange narkive permalink

Für die Leitung, die vom Master angesteuert und von den Slaves empfangen wird, sollte nichts Besonderes erforderlich sein, wenn das kapazitive Laden kein Problem darstellt.

Für die Leitung, die von Slaves angesteuert wird, würde ich vorschlagen, dass Sie, wenn das kapazitive Laden kein Problem darstellt, die TX-Leitung jedes Slaves über einen Vorwiderstand mit dem Bus verbinden und dann den TX-Pin jedes Zustands auf Float setzen im Leerlauf. Stellen Sie den Widerstand so niedrig wie möglich ein, ohne dass im Falle eines Buskonflikts ein inakzeptabler oder schädlicher Strom fließt.

Wenn der erforderliche Serienwiderstand zur Verhinderung von Schäden in Kombination mit der parasitären Kapazität die Geschwindigkeit unannehmbar langsam begrenzen würde, würde ich einen strombasierten Ansatz empfehlen, bei dem die Slaves Strom liefern, wenn sie senden möchten. So etwas wie:

schematic

simulieren diese Schaltung - Schema erstellt mit CircuitLab sup>

Die linke Hälfte ist der Sender und die rechte Hälfte ist der Empfänger. Es ist zu beachten, dass, wenn die Schottky-Diode weggelassen wird (oder wenn eine Nicht-Schottky-Diode ersetzt wird), die Empfängerschaltung nicht annähernd so gut funktioniert, da Q2 in die Sättigung getrieben wird und es eine Weile dauern wird, bis sie herauskommt. Durch Hinzufügen der Schottky-Diode wird verhindert, dass Q2 vollständig eingeschaltet wird, sodass es schneller ausgeschaltet werden kann.

Rokta
2018-04-23 13:01:35 UTC
view on stackexchange narkive permalink

Wenn Sie an einem UART-Port bleiben möchten, können Sie diese einfach hintereinander schalten (die Ausgabe eines UART erfolgt zur Eingabe eines anderen).Bei diesem Ansatz benötigen Sie keine zusätzliche Hardware, sondern müssen Code hinzufügen, um die Kommunikation von einem Arduino zum nächsten weiterzuleiten.

BEARBEITEN Ich habe die Hot-Swap-Anforderung verpasst, sodass dies nicht funktionieren konnte.Wenn Sie jedoch garantieren können, dass Sie nicht mitten in der Kommunikation tauschen oder den Verlust einiger Pakete tolerieren, können Sie nur eine kurze Stelle an der Stelle angeben, an der Sie eine der UART-Schnittstellen von Arduino platziert haben, und nach dem Tausch eine kurze Verbindung für den normalen Betrieb entfernen.

Sie möchten UART also in SPI umwandeln?Denn so funktioniert verkettetes SPI.
Das ist eine clevere Art, damit umzugehen, aber leider bricht es die angeforderten Notizen und funktioniert mit Regel 4 sicherlich nicht (siehe Frage).Immer noch eine clevere und einfache Möglichkeit, dies zu tun!
Die Problemumgehung ist auch ein interessanter Weg, um diese Arbeit zu machen. Ich bin sicher, ich kann Ihre Methode in einigen meiner neuen Projekte verwenden.Vielen Dank!
Dmitry Grigoryev
2018-04-23 15:34:04 UTC
view on stackexchange narkive permalink

Schauen Sie sich als praktischen Vorschlag I2C an: Es verwendet die gleiche Anzahl von Drähten wie ein UART, hat eine ähnliche Datenrate und implementiert die Busfunktionalität, die Sie benötigen, und Sie haben bereits SW-Bibliotheken für Sie geschrieben.

Ein weiteres Protokoll, das dem, was Sie versuchen, noch ähnlicher ist, ist LIN, bei dem es sich im Grunde um einen UART-basierten Bus mit höherer Signalspannung handelt.Wenn Sie 12 V zur Verfügung haben, können Sie einfach LIN-Transceiver in Ihr Diagramm zwischen jedem Knoten und dem Bus einstecken, und es würde funktionieren.Sie müssten jedoch Ihre eigene Software schreiben.

Bearbeiten: Sie können Pseudo-LIN auch mit Ihren eigenen Spannungspegeln implementieren, z.5V.Zum Beispiel:

schematic

simulieren diese Schaltung - Schema erstellt mit CircuitLab sup>

Vielen Dank für den Vorschlag. Die Verwendung von UART ist jedoch keine Frage der Begrenzung der Anzahl der Drähte, sondern eine Einschränkung der Projektanforderungen (siehe BEARBEITEN).Obwohl LIN vielversprechend erscheint, kann ich es leider nicht mit 12 V verbinden, aber ich möchte die gleiche Funktionalität mit 5 V TTL-Pegel implementieren.
@DRSDavidSoft Hallo, ich habe meine Antwort bearbeitet, um ein Beispiel für einen Seriell-Bus mit beliebigen Spannungspegeln (z. B. 5 V) hinzuzufügen.
Ist der Bus tatsächlich ein einzelner Draht?Dieses LIN-Protokoll scheint für einige meiner anderen Projekte sehr vielversprechend zu sein. Es könnte mir ermöglichen, sowohl Daten als auch Strom mit nur zwei Drähten zu senden und zu empfangen.Danke, dass du es mir vorgestellt hast!
@DRSDavidSoft Sie benötigen natürlich eine gemeinsame Masse, es werden also insgesamt 3 Drähte sein.Trotzdem ist LIN eine gute Option für niedrige Datenraten (etwa 20 kB / s).Sie können mit Ihren eigenen Transceivern höhere Datenraten erzielen (z. B. was mein Schema zeigt), aber Sie verlieren die Eigenschaft der niedrigen EM-Emission von LIN.


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 3.0-Lizenz, unter der er vertrieben wird.
Loading...