Warum sieht das FTDI RS485-Signal falsch aus?

Ich habe ein internes Board mit einem Mikrocontroller (Microchip dsPIC33E) und einem RS485-Treiber (Analog Devices ADM2587E), das ich über einen FTDI-USB-Anschluss (USB-RS485-WE-1800-BT) an einen Desktop-PC anschließen möchte RS485-Konverterkabel. Das hauseigene Board empfängt Datenpakete vom FTDI korrekt und antwortet. Der PC wird jedoch häufig, normalerweise innerhalb der ersten fünf Bytes, aber manchmal später und manchmal früher, Bitfehler in den vom FTDI empfangenen Daten sehen.

Das folgende Bild ist eine typische Kurve, die von einem Oszilloskop aufgenommen wurde und Folgendes zeigt:

  • Der DE-Eingang zum ADM2586E in Gelb (1)
  • Das Data- (B) Signal des FTDI in Cyan (2)
  • Das Data+ (A) Signal des FTDI in lila (3)
  • Das GND-Signal sowohl des FTDI als auch des ADM258E in Grün (4)

Das Oszilloskop wurde so eingestellt, dass die '0 V'-Pegel der Signale 2, 3 und 4 alle ausgerichtet und durch die Position von Signal 4 - die grüne Linie - markiert sind.

Trace von RS485-Signalen (Modbus Request Server ID-Funktion und -Antwort)

Der erste Datenburst (links) ist ein Modbus Request Server ID-Paket, das mit 19200 bps, 8 Datenbits, 1 Stoppbit und gerader Parität gesendet wird. Dies wird von der internen Platine erkannt, die daran zu sehen ist, dass sie die Treiberfreigabe des ADM2587E aktiviert und mit dem zweiten Datenburst (rechts) antwortet. Der FTDI sendet USB-Daten, die einen Bitfehler im 6. (in diesem Fall) empfangenen Byte enthalten. Hinweis: Ich kann nicht sicher sein, welches Byte den Bitfehler enthält, da der USB-Treiber nicht sehr viele Timing-Informationen speichert, aber dies ist für meine Frage ohnehin nicht besonders relevant. Außerdem wurden die Verzögerungen auf beiden Seiten der DE-Übergänge bewusst in die hauseigene Board-Software eingefügt; Ich habe ursprünglich den UART-RTS-Simplex-Modus verwendet, um sie auf die Breite eines einzelnen Datenbits zu reduzieren, aber dies hatte den gleichen Effekt.

Ich vermute, dass das Problem darauf zurückzuführen ist, dass die Spannungspegel der empfangenen Signale vom FTDI falsch interpretiert werden. Die interne Platine enthält einen ausfallsicheren 360-Ohm-Vorspannungswiderstand zwischen A+ und VOUT und zwischen A- und GND2 auf dem ADM2587E sowie einen 120-Ohm-Abschlusswiderstand zwischen den Leitungen A+ und B-, wie dies in der Anwendungsnotiz von Analog Devices angegeben ist RS485-Treiber-IC. (Ich habe auch 1-kOhm- und 10-kOhm-Vorspannungswiderstände ausprobiert, aber mit sehr geringem Unterschied.) Die obige Spur wurde mit einem Keterex-USB-Isolator zwischen dem PC und dem FTDI aufgenommen, obwohl dies keinen Unterschied macht.

Der Ausgang der hauseigenen Platine ist, wie ich erwarten würde, ein Halbduplex-RS485-Signal mit zwei Drähten, wobei die B- und A+-Signale um den Mittelwert ihrer Leerlaufpegel ausgeglichen sind. Die Ausgabe des FTDI sieht für mich seltsam aus, da die Signale B- und A+ beide relativ zum Mittelwert der Leerlaufpegel erhöht sind. Wenn der FTDI erwartet, dass die empfangenen Daten diesem "erhöhten" Signal entsprechen, würde das die Bitfehler erklären und mich zu meiner Frage führen.

Warum scheint der Ausgang des FTDI erhöht zu sein, relativ sowohl zum Masse- als auch zum Leerlaufmittelspannungspegel?

Bearbeiten

Die unten als richtig gekennzeichnete Antwort zeigt, dass an den FTDI-Werten nichts auszusetzen ist, was einer richtigen Antwort am nächsten kommt: Es spielt keine Rolle, dass sie erhöht sind, da sie innerhalb der Spezifikation liegen.

Abgesehen davon scheint das Problem, das ich sehe, bei genauerer Betrachtung der Oszilloskopspuren tatsächlich auf die Ausgabe des ADM258E zurückzuführen zu sein und überhaupt nichts mit dem FTDI zu tun zu haben.

Antworten (1)

Sie arbeiten im Halbduplex-Modus und verbinden Y mit A, Z mit B, richtig? Warum erwähnen Sie A- und B+ und A- und A+? Ich gehe davon aus, dass Sie nur A und B meinen und dass der Abschlusswiderstand über ihnen liegt.

Jeder Empfänger am Ende der 485 Drähte erfordert 120-Ohm-Abschlusswiderstände. Im Halbduplexmodus benötigen Sie also einen an jedem Ende, da beide Empfänger sind. Hast du auch einen auf der FTDI-Seite?

485 überträgt 1/0s, indem die Paare durch eine Spannung getrennt werden. Warum wollen Sie "ausfallsichere" Widerstände, die den Bus binden? Im Ruhezustand sollten die Spannungen zwischen beiden gleich sein, wozu auch der 120-Ohm-Widerstand beiträgt, dem wirkt man entgegen, indem man die einzelnen Leitungen auseinander zieht und Strom verschwendet. Sie haben dauerhaft 360 + 360 + 120 Ohm von VOUT nach GND.

Welche Polarität sollte das Stoppbit haben? Überprüfen Sie die TX-Pin-Polarität des UART und stellen Sie sicher, dass sein Leerlauf während der Verzögerungszeit (en) 0 ist. Wenn es eine 1 sendet, könnte es ein Fehler sein, weil der FTDI-Empfänger das Stoppbit nie sieht?(siehe Update unten)

Die Spannungspegel selbst spielen keine so große Rolle, da zwischen A / B ein Unterschied von> 200 mV besteht. Der FTDI-Chip sollte keine Probleme haben zu bestimmen, was Sie mit einem Unterschied von 3 V senden, genau wie Ihr Empfänger es mit einem Unterschied von ~ 2 V getan hat.

Update: Da Sie feststellen, dass Sie die ersten paar Bytes vor dem Bitfehler tatsächlich korrekt empfangen können, sieht dies eher nach einem Timing-Problem aus. Versuchen Sie, mit einer niedrigeren Baudrate zu laufen, und prüfen Sie, ob Sie vor dem Fehler weitere empfangene Daten erhalten.

Bitte lesen Sie A+ als A und B- als B (ich habe meine Tippfehler von A- in B- geändert). Ja, ich habe das A-Signal an Y und das B-Signal an Z am ADM2587E angeschlossen und den Abschlusswiderstand dazwischen.
Das FTDI-Kabel stellt Drähte bereit, die das Hinzufügen seines Abschlusswiderstands ermöglichen, aber meine einzige Möglichkeit, sie anzuschließen, ist am selben physischen Ort wie der andere Abschlusswiderstand. Dies wären effektiv zwei 120-Ohm-Widerstände parallel, dh ein einzelner 60-Ohm-Widerstand. Soll ich das noch machen?
Die Bias-Widerstände waren sowohl vorhanden als auch nicht vorhanden und beeinflussen die erhöhten FTDI-Pegel nicht. Tatsächlich verfügt der ADM2587E über eine eigene ausfallsichere Vorspannung, und die zusätzlichen Widerstände sind in der Tat (bestenfalls) redundant. Bei meinen Untersuchungsversuchen habe ich jedoch viele Empfehlungen aus verschiedenen Quellen ausprobiert, wobei die Vorspannungswiderstände nur einer sind.
Der Status der TX-Leitung im Leerlauf ist logisch 0. Die Bereichsverfolgung in der Frage bestätigt dies tatsächlich, wenn Sie wissen, wo Sie suchen müssen. :-)
Meine Frage ist eigentlich, warum scheinen die FTDI-Signale erhöht zu sein? Sobald ich dies verstanden habe, kann ich die Ursache der Bitfehler möglicherweise selbst diagnostizieren, obwohl Ihre Kommentare und Vorschläge geschätzt werden.
Es hängt möglicherweise nur von der Funktionsweise der FTDI-Chips ab. Die Tatsache, dass sie erhöht sind, sollte keine Rolle spielen, da der Empfänger nur einen Unterschied von> 200 mV zwischen A / B erkennt. Nur als schnelle Überprüfung, da es buchstäblich eine Minute dauern sollte, können Sie versuchen, den TX-Pin umzukehren? (Bit 14/UTXINV von UxSTA). Es macht vielleicht keinen Unterschied, aber einen Versuch wert..
Ok, mit TX invert erhalte ich keine korrekten Bytes mehr vom FTDI. Ich erhalte jedoch viele (ein voller Modbus-Puffer von 265) Bytes, die nicht gesendet werden.
Können Sie grundlegende Loopback-Tests ausprobieren? Wenn Sie zwei interne Boards haben, können Sie sie dazu bringen, miteinander zu sprechen? Oder aktivieren Sie den Empfänger, während Sie etwas senden und prüfen, ob es übereinstimmt? (obwohl Sie wahrscheinlich DE und RE # miteinander verbunden haben ...)
Oh, Sie haben also tatsächlich die richtigen Bytes erhalten? Entschuldigung, das war mir nicht klar, ich dachte nur, Sie hätten ein paar falsche Bytes und dann Bitfehler bekommen.
Im Großen und Ganzen halte ich die Konfiguration für richtig, nur die Bitfehler an einem Ende sind ein Problem und das asymmetrische Aussehen der FTDI-Signale macht mir Sorgen. Die obige Ablaufverfolgung hat fünf gute Bytes empfangen, bevor im sechsten ein Bitfehler erkannt wird.
Könnte es dann einfach Timing sein? Wie hoch ist der prozentuale Fehler zwischen der Baudrate, die Ihnen Ihr BRGx-Wert gibt, und 19200? Da die empfangenen Daten ziemlich kurz sind, fällt es vielleicht nicht auf, aber nachdem ein paar Bytes übertragen wurden, geraten die beiden nicht mehr synchron? Können Sie eine andere Baudrate ausprobieren, sogar etwas Niedriges wie 1200/2400, und sehen, ob Sie weiterkommen?
Ich habe diese Antwort positiv bewertet, da sie nützliche Informationen zur Diagnose der Bitfehler enthält. Ich warte immer noch auf eine Antwort vom FTDI-Support, um zu sehen, ob sie mir sagen können, warum ihre Signale erhöht sind.
Danke Mike. Hatten Sie die Möglichkeit, mit einer niedrigeren Baudrate zu arbeiten, um zu sehen, ob Sie vor einem Bitfehler weitere Bytes empfangen konnten? Oder war es dasselbe?
Ich habe jetzt 2400 bis 115200 ausprobiert, alle mit ähnlichen Ergebnissen. Jetzt vermute ich ein defektes FTDI, da es begonnen hat, den zurückgegebenen Daten 0x00 voranzustellen und an einer inkonsistenten Stelle einen Block von vier 0x3f-Bytes in jeden Frame einzufügen. Noch kein Wort von ihrem Support-Team.
@vanadium Sie möchten manchmal eine ausfallsichere Vorspannung, damit ein RS-485-Bus im Leerlauf als serielle Leitung im Leerlauf wahrgenommen wird. Sie stellen die Vorspannung so ein, dass die Spannung nur mit den Empfängerlasten und allen Abschlusswiderständen mehr als 200 mV in die richtige Richtung beträgt, wodurch konsistente Stoppbits auf der Leitung erzeugt werden. Einige RS485-Empfängerchips sind intern vorgespannt, so dass sie ohne dies garantiert eine logische Eins erzeugen, aber nicht alle. Das Fehlen dieser Vorspannung kann eine Quelle von empfangenen Störbytes sein, wenn Systemrauschen in der Lage ist, einen Empfänger dahingehend zu beeinflussen, ein scheinbares Startbit auf seiner Logikpegelseite zu erzeugen.