Hallo an alle, könnt ihr mir bitte ein paar Tipps geben. Auf einem SPI-Bus sollen die Signale wegen längeren Entfernungen physikalisch mit RS485-Technik übertragen werden. Übertragungsrate größer 2 Mbit/s erforderlich. Die Busteilnehmer werden mit 3.3V Supply betrieben, deswegen auch die Treiber bzw. Receiver mit diesem Pegel nötig. Nun die Treiber und Receiver haben Propagation-Delays bis zu 100ns (angehängtes Datenblatt). So entsteht in dem CLK-Signal auf dem Weg vom Master zu einem der Slaves eine Verzögerung gleich dem zweifachen Propag. Delay ( Quelle > Treiber > Receiver > Senke) und dann noch im SOMI-Signal das gleiche. Bei einer Rate von 2 MBit/s ist der Abstand von der steigender Flanke des Clocks bis zur fallenden 250ns. Bevor die steigende Flanke über Treiber und Receiver zum Slave gelangt und er die Daten (ebenfalls über Treiber / Receiver) zum Master reicht, will der Master an der fallenden Flanke schon lesen. Lässt sich dieses Problem irgendwie lösen, ohne die Datenrate zu reduzieren? Besten Dank für jeden Hinweis!!!
Wie man es eigentlich machen müsste: Takt vom Master zum Slave übertragen, dort umdrehen und wieder zurück übertragen. Dann passen Takt und Daten immer zusammen. Dumm daran ist, dass die üblichen SPI-Module das nicht hergeben. Wenn man allerdings im Master den Tx-Teil vom SPI per Software implementiert und das eigene Hardware-SPI nur als Slave für Rx verwendet, dann geht das. Oder mit zwei Hardware-SPIs, einer pro Richtung.
Andererseits muss man ja auch nicht unbedingt die langsamsten Transceiver verwenden, die man finden kann. SN65HVD10: 8,5ns.
Tut mir leid, das ging mir viel zu schnell! Mit Umdrehen meinst du, dass der Slave zum Master wird und der Master zum Slave? Und diesen Abschnitt verstehe ich leider gar nicht. :-| >Wenn man allerdings im Master den Tx-Teil vom SPI >per Software implementiert und das eigene Hardware-SPI nur als Slave für >Rx verwendet, dann geht das. Oder mit zwei Hardware-SPIs, einer pro >Richtung. Könntest Du vielleicht etwas ausführlicher erläutern?
1 | "Master" Slave |
2 | MOSI1+SCK1 => RS485-Tx => Leitung => RS485-Rx => MOSI+SCK |
3 | MISO2+SCK2 <= RS485-Rx <= Leitung <= RS485-Tx <= MISO+SCK |
Also: SCK vom Master zum selektierten Slave schicken und dort auf einer zweiten Leitung wieder zurück zum Master schicken. Die Hin-Leitung taktet den Sender des Masters, die Rück-Leitung den Empfänger. Wenn man auf Master-Seite zwei SPI-Module zur Verfügung hat, dann nimmt man das eine davon (MISO1/SCK1) als Master konfiguriert zum Senden, das andere (MISO2/SCK2) als Slave konfiguriert zum Empfangen. Hat man nur eines, nimmt man zum Senden Software-SPI.
OK, jetzt kapiert :-) Vielen Dank!!!! Interessante Lösung!! Noch was: Man muss praktisch ja nur den Zeitpunkt, an dem der Master die Daten liest etwas verzögern. Lässt es sich nicht mit den Einstellungen Clock-Polarity und Clock-Phase machen?
Guten Morgen! Ich wollte den Thread wieder nach oben befördern, vielleicht hat der eine oder andere noch eine Idee! Danke!!!!!!
> Lässt es sich nicht mit den Einstellungen > Clock-Polarity und Clock-Phase machen? Damit änderst du auch den Sender. > wegen längeren Entfernungen Wie lang? 1 Meter Kupferkabel bringt dir auch schon ca. 3ns Verzögerung... >Nun die Treiber und Receiver haben Propagation-Delays bis zu 100ns Nimm schnellere: LTC1686
1 | Precision Propagation Delay Over Temperature: |
2 | Receiver/Driver 18.5ns ±3.5ns |
>Wie lang? >1 Meter Kupferkabel bringt dir auch schon ca. 3ns Verzögerung... Kann bis zu 10m lang werden. >Nimm schnellere: LTC1686 Das ist natürlich auch möglich. Ich würde halt gern ICs benutzen, die z.B. nur 4 Transmitter bzw. 4 Receiver haben, weil man bei SPI auf der Slave-Seite 3 Receiver und nur einen Transmitter braucht und auf der Master-Seite umgekehrt 3 Transmitter und einen Receiver. Mit einem Quad Receiver bzw. Transmitter kann man das kompakter aufbauen. Und für 3.3V Supply habe ich nur Quads gefunden mit Delays von ca. 100ns. Alles mit Trancievern aufzubauen würde bedeuten, mehr Platz auf der Platine und viele unbenutzte Transmitter bzw. Receiver. Mit schnellen Bausteinen kann man das Problem lösen. Aber wenn man damit rechnet, dass im System zukünftig die Anzahl der Slaves (und damit die Datenrate) und die Buslänge zunehmen, dann ist wohl sinnvoller, den Vorschlag von A.K. zu realisieren. Seht ihr das auch so??
> dann ist wohl sinnvoller, den Vorschlag von A.K. zu realisieren.
Richtig.
NB: 4fache schnelle RS422er gibt es durchaus. Beispielsweise TI AM26LV31E/32E. Aber gegen grosse Entfernung im Verhältnis zur Datenrate hilft das allein auch nicht.
>Hast du nach RS485 statt RS422 gesucht?
Hab eigentlich gezielt nach RS485 gesucht. Was ist eigentlich der
Unterschied zwischen RS485 und RS 422? Wikipedia sagt, dass RS422 nicht
so ohne weiteres im RS485-Netzwerken verwendbar ist.
Der klassische Bild: RS422 implementiert eine full-duplex Punkt-to-Punkt Verbindung mit nicht abschaltbarem Transmitter, RS485 eine half oder full-duplex Busverbindung für >2 Teilnehmer mit abschaltbarem Transmitter. In der Realität ist es etwas komplizierter, denn bereits der RS422-Klassiker AM26LS31 ist abschaltbar. Allerdings haben RS422 Bausteine keine Überlastsicherung, weil Kollisionen anders als bei RS485 nicht zum normalen Betrieb zählen. Da es bei solchem SPI aber ebensowenig Kollisionen gibt, ist das auch mit abschaltbaren Bausteinen für RS422 realisierbar.
RS422 ist durchaus busfaehig. Standardmaessig mit einem bestimmten Master, der immer auf Senden ist. Waehrend die Slaves nur senden wenn sie muessen. Ich versteh das Gejammer ueber die Verzoegerung nicht. Die Verzoegerung des kabels faellt weg, da Daten und Clock verzoegert werden. Desgleichen die Verzoegerung von Treibern. Dann ist eigentlich nur die Skew zwischen Clock und Daten wichtig. Der Clock muss kommen wenn die Daten stabil sind. Dh wenn man Treiber hat, die die gewuenschte SPI frequenz bringen, ist man dabei.
Als RS422 Teiber kann ich die ADM3491ARZ empfehlen. die machen 10MBit ab 3.3V.
KelleRassel schrieb:
> RS422 ist durchaus busfaehig.
Aber 8pin Transceiver für RS422 sind es nicht, weil trivialerweise nicht
abschaltbar.
KelleRassel schrieb: > Ich versteh das Gejammer ueber die Verzoegerung nicht. Die Verzoegerung > des kabels faellt weg, da Daten und Clock verzoegert werden. Das bezog aich auf die klassische SPI-Variante ohne Rückführung des Takts. Dann spielt die Verzögerung durchaus eine bedeutende Rolle. Erst mit der von mir vorgeschlagenen Rückführung des Takts ist wie du richtig schreibst nur der Skew wichtig.
Danke an alle!!! Noch eine Unklarheit. Im Wikipedia-Artikel zu RS485 (Vergleich RS485 und RS422) steht: Bei EIA-422 Bauteilen, die doch über einen Driver-Enable verfügen, reicht die Treiberstärke nicht aus, um ein an beiden Enden terminiertes Netzwerk zu treiben. Ihr sagt, für SPI, bei dem nie 2 Transmitter gleichzeitig aktiv sind reicht RS422 aus. Wie ist es mit der Treiberstärke und terminiertem Kabel aus eurer Sicht? Stimmt die Wikipedia-Behauptung nicht?
Vielleicht mal ein Datenblatt eines solchen Treibers anschauen ...
Interessante Frage. Wobei der 3,3V RS485-Treiber MAX307x allerdings bei den Stromverlaufskurven weit schlechter abschneidet als der 5V RS422-Treiber AM26LS31.
Hab jetzt ein Datenblatt vom Quad RS422-Transmitter angeschaut (im Anhang). In der Tabelle DC Electr. Characteristics finde ich: Diff. Driver Output bei RL = 100 Ohm min. 2V Wenn ich das richtig verstehe heißt es, dass bei bei einem Lastwiderstand von 100 Ohm die Spannung zw. den differentiellen Ausgängen nicht unter 2V fällt. Aber ein mit zwei 120 Ohm Widerständen abgeschlossener Bus ( die Receiver jettz mal außer Acht gelassen) ist ja schon effektiv mit 60 Ohm belastet. Ob mit 60 Ohm Last die diff. Ausgangsspannung noch über der nötigen Schwelle von +/- 0.2V liegt garantiert das Datenblatt nicht. Somit kann ich speziell diesem Datenblatt nicht entnehmen, ob diese Treiber busfähig sind, oder? Oder sehe ich das falsch?
Nominell ist das offenbar richtig, RS422 Bausteine sind mit 100 Ohm Last angegeben, RS485 Bausteine mit 54 Ohm. Aber schau mal beim MAX3030 auf Seite 4 links unten. Das langt auch bei 54 Ohm noch locker. Nur ist das in dieser Kurve eben der typische Wert, nicht der vom Hersteller garantierte. Heisst also: Formal korrekt ist es nur mit RS485 Treibern. Funktionieren wird es mit den MAX303x aber ziemlich sicher ebenfalls.
So wie ich das verstehe wird der RS422 nur auf einer Seite terminiert. Die Richtung zum Master wird beim Master terminiert, die Richtung vom Master auf der andern Seite. Geht ja auch.
Wenn nur ein Slave dranhängt, dann ist das Point-to-Point und passt RS422. Aber wenn es mehrere Slaves am gleichen Bus gibt und folglich das SPI als Multidrop-Bus aufgebaut ist, dann haben MISO und der rücklaufende Takt Buscharakteristik und müssen an beiden Enden abgeschlossen werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.