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.
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?
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?
> 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
>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??
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.
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?
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.