Guten Morgen!
Bei einer Datenübertragung per SPI über ca. 5 - 10 m werden die Signale
CLK und SOMI/SIMO differentiell übetragen (RS485) und das Signal SS
single ended. Zum Schutz des SS von Störungen (Spikes) ist folgendes
vorgesehen:
- abgeschirmtes Kabel
- Tiefpass und Schmitt-Trigger vor dem SS-Eingang
Jetzt möchte ich euch um eine Beurteilung bitten, ob es so geht.
Und noch zur Dauer der Spikes, die ja zur Tiefpass-Dimensionierung
bekannt sein soll. Gibt es da irgendwelche Orientierungswerte dazu, wie
lange die Spikes sein können, oder kann man das allgemein überhaupt
nicht sagen?
Für jede Hilfe bin ich sehr dankbar!
SPI über 5...10m ist nicht gut. Lieber eine andere externe
Interface-Form wählen und SPI-Signale nur lokal auf der Platine
verwenden. SPI kan u.U. sehr schnell sein, bis 66Mhz bei
Flash-Bausteinen zum Beispiel.
>SPI über 5...10m ist nicht gut. Lieber eine andere externe>Interface-Form wählen und SPI-Signale nur lokal auf der Platine>verwenden. SPI kan u.U. sehr schnell sein, bis 66Mhz bei>Flash-Bausteinen zum Beispiel.
SPI ist primär für platineninterne Kommunikation gedacht, aber es gibt
Erfahrungen mit SPI-Datenübertragung über längere Entfernungen ( > 10m )
mit Bustreibern. Es muss mit SPI realisiert werden, daran wird nichts
geändert.
Warum eigentlich das SS Signal single Ended?
Wenn man sowieso RS485 macht, dann klatscht man auch gleich den Treiber
für das SS Signal mit rein. Dann sind alle Signale differentiell und
relativ gut gegen Störungen gesichert. Außerdem muss man sich nicht den
Kopf zerbrechen, was die Signallaufzeiten bzw. die Flankensteilheit
betrifft....
@ Matthias
Wenn es nur ein Treiber für SS wäre :-(. Jeder Slave braucht ja ein
eigenes Signal und bei vielen Slaves möchte man nicht unbedingt pro
Slave einen Treiber und slaveseitig einen Receiver spendieren. Hinzu
kommt noch das sich die Anzahl der Leitungen verzweifacht.
@ A. K.
Es tut mir leid für den neuen Thread, in dem alten schien sich niemand
mehr zu melden und ich dachte ich mache einen neuen und frag noch
zusätzlich wegen Spike-Dauer.
Was ist kritischer? Aufwand im Slave oder Aufwand im Kabel? Wenn Kabel,
dann hätte ich eine Idee: Eine einzige SS Leitung verwenden, in jedem
Slave in ein Schieberegister bei SS=1 die Daten takten, das Ergebnis auf
Node-Adresse vergleichen und mit SS=0 für den eigentlichen Slave-Select
verknüpfen. Seitens des Masters bedeutet dies, bei Wechsel des
adressierten Slaves vor SS=0 erst einmal mit SS=1 die Adresse zu senden.
Braucht man dann nicht bei jedem Slave neben dem Schieberegister noch
einen uC zum Auslesen und Vergleichen der Adresse? Das wäre etwas zu
aufwändig. Als einfachste Slaves sind eigentlich nur SPI-fächige
AD-Wandler geplant.
Nö, nur nen '688. Was man beispielsweise für 6 Adressbits braucht:
1x 74HC174, plus AND-Gate (SCK&SS) vorneweg.
1x 74HC688, SS als Enable rein, Ausgang ist Slave-Select.
Vielleicht gibt's auch einen SIPO Shifter mit passendem Enable.
Tut mir leid, ich komm nicht mit. Als Takt-Signal des Schieberegister
wird SCK&SS verwendet? Wird in Schieberegister die 6-Bit Adresse
eingelesen? Was ist an die Dateneingänge anzuschließen?
Sorry, aber Grafik ist grad nicht drin, Prosa muss reichen.
Schieberegister, beispielsweise 74HC164, mit
mit CLK = SCK AND SS, also AND Gate davor.
und DIN = MOSI.
und CLR = 1
Da werden also bei SS=1 die SPI-Daten reingeschoben und parallel
ausgegeben.
Die parallelen Ausgänge des Schieberegisters gehen an die eine Seite
eines 74HC688 Komparators, dessen andere Seite geht an DIP-Switches oder
ist fest verdrahtet. Das Enable des '688 geht an SS. Dessen Ausgang
dient als eigentliches SS für den ADC oder was immer der SPI-Slave ist.
Dieser Ausgang ist nur dann aktiv (0) wenn SS=0 ist, und die vorher bei
SS=1 in das Schieberegister reingeschobene Adresse die Node-Adresse ist.
Bingo! Wenn 16 Adressen ausreichen, dann geht das auch mit dem 74HC194.
Erspart das AND Gate für den Takt. Das lässt sich so verschalten, dass
bei SS=0 nichts passiert.
Also, in jeder SPI-Node:
CP'194 = SCK
DSL'194 = MOSI
S1'194 = SS (ein einziges SS für alle Slaves!)
S0'194 = 0
MR'194 = 1
Px'688 = Qx'194
Qx'688 = Node-Adresse
G'688 = SS
P=Q'688 = Select-Leitung für SPI-Slave, und RS485-Enable
OK, jetzt bin ich mitgekommen. Gegenüber meiner Lösung bringt es also
folgendes:
Vorteile:
- nur 2 statt 5 Leitungen für SS
- Einsparung von 5 Tiefpässen
- Einsparung von 5 Schmitt-Trigger
- SS besser geschüzt gegen Störungen
Zusätlicher Aufwand:
- 74HC164 (oder 74HC194)
- UND-Gatter
- RS485-Treiber masterseitig
- RS485-Receiver slaveseitig
- Adresse statt auf 5 Port-Pins seriell über MOSI
Gibt es die Schieberegister auch mit 3.3 V Supply?
74HC geht ab 2V. Mit dem '194 entfällt das UND-Gatter. Dafür hast du das
74HC688 vergessen. Wer hat bei deiner 2-aus-5 Version die beiden SSx
kombiniert?
74688 und DIP-Schalter hatte ich auch so schon zur Adresszuweisung bei
den Slaves.
Das scheint eine gute Lösung zu sein! Vielen Dank, die werde ich mal
vorschlagen.
>Wer hat bei deiner 2-aus-5 Version die beiden SSx kombiniert?
2-aus-5 Version ???
5 SS-Signale single ended => 5 Leitungen
1 SS-Signal differentiell => 2 Leitungen
Also statt 5 nur 2 Leitungen nötig.
noips schrieb:
> 2-aus-5 Version ???
Missverständnis. Bei 5 Signalen kann man auch mit einem einfachen
2-Input Gate schon 10 verschiedene Adressen auseinander halten, braucht
dafür keinen Komparator.
Aber mit 74HC164 braucht man doch auch kein UND-Gatter. Er hat zwei
Dateneingänge die miteinander verundet sind. An einen von beiden MOSI an
den anderen SS. Und 32 Slaves möglich. So würde es doch auch gehen,
oder?
Der doppelte Dateneingang nützt dir nichts. Man muss den Takt
unterdrücken und damit verhindern, dass er bei SS=0 schiebt, sonst
schiebt er auch in der normalen SPI-Phase bei SS=0 und das Select-Signal
verschwindet mittendrin.
Stimmt!
Noch was anderes. Mit der Lösung mit Shiftregister ist aber die
SPI-Einstellung nicht mehr gegeben, bei der an der negativen SCK-Flanke
eingelesen wird. Oder wenigstens nicht beim Übermitteln der Adresse,
oder?
Das ist eine Frage des gewählten SPI-Mode. Passt jedenfalls zu Mode 0
und 3, denke ich.
Den kann man in der Adressphase aber anders halten als in der
Datenphase. Ich habe eine Anwendung mit 2 SPI-Slaves am gleichen Bus,
die verschiedene Modi benötigen.
Nur muss man hier aufpassen, dass man bei der Mode-Umschaltung nach der
Adressphase bei inaktivem SS keine positive Flanke produziert, denn die
schiebt dann.