Forum: Mikrocontroller und Digitale Elektronik Bitte um Überprüfung: SPI bus


von Stefan N. (suckiden)


Angehängte Dateien:

Lesenswert?

hallo allerseits,

ich bin gerade dabei ein SPI bus design für ein Projekt zu machen. 
Folgende Eckdaten:
SPI Geschwindigkeit: 8MHz
SPI Slaves: 8 Stück
SPI Topologie: Stern/Bus gemischt


Wie im Schaltplan zu sehen will ich einen 74LVC07 
http://www.nxp.com/documents/data_sheet/74LVC07A.pdf als buffer Baustein 
verwenden. Grund dafür ist, weil ich nicht glaube, dass der uC 8 slaves 
treiben kann und weil Slave 1-4 zu 5-8 als Stern verbunden sind und SPI 
ja nicht wirklich für eine Stern Topologie ausgelegt ist. Die 100R 
Widerstände in Serie sind für die Strombegrenzung bzw. für das 
reduzieren der Anstiegszeit (Wert soll später mittels Oszi Messung 
angepasst werden). Die Pull-up Widerstände sind für den definierten 
Zustand am Ausgang wenn der Eingang high ist (wired-OR).

CS wird über 4 GPIO Leitungen realisiert die später demuxt werden (ein 
DEMUX für Slave 1-4 und einer für 5-8)

Meine Frage, kann die Schaltung so prinzipiell funktionieren oder habe 
ich einen groben Denkfehler? Bzw. glaub jemand das es auch funktionieren 
könnte wenn ich die SPI Leitungen direkt verbinde, also ohne buffer 
Baustein? Produktive Kritik erwünscht!

von Uwe B. (uwe_beis)


Lesenswert?

Ich denke, dass du dir eine ganze Menge sinnvoller Gedanken gemacht 
hast. Der Einsatz der 100R ist gut, die Aufsplittung in zwei getrennt 
gepufferte Zweige auch. Ob das zu viel ist oder ob es auch einfacher 
geht nicht, will ich jetzt nicht abschätzen. Kann aber sein.

Unpassend bis falsch halte ich allerdings, dass du einen OC-Treiber 
verwendest und dann auch noch die Pullups hinter den 100 R einsetzt. Die 
Serienwiderstände an der Quelle dienen eigentlich nicht zur Reduktion 
der Flankensteilheit, sondern zur Absorption der vom Ende einer offenen 
Leitung zur Quelle zurück laufenden Reflektion und sollten daher der 
Leitungsimpedanz entsprechen. Sie verhindern so das Überschwingen auf 
der Leitung sowie Resonanzen, die mehr EMV-Störungen produzieren. Wenn 
mehrere Teilnehmer über die Leitung verteilt angeschlossen sind, bringt 
das allerdings weniger, aber bei dir scheinen sie ja am Ende der Leitung 
konzentriert zu sein.

Nun wird aber bei dir das Low-Signal mit 100R || 300R getrieben, das 
High-Signal mit 300R. Damit wird die Impedanzanpassung ad Absurdum 
geführt. Darüber hinaus: Das Low-Signal kommt mit 3,3 V * 100R / 400R 
an, also ca. 0,8 V, das ist natürlich Quatsch.

Mein Vorschlag: 4 einfache Buffer verwenden (LVC ist gut), keine 
Pullups. Die 4 MISOs direkt an den jeweils 4 Slaves zusammenschalten, 
mit nur einem Pullup (1k und mehr) pro Zweig versehen und dann über nur 
einen 100R zum µC. Dort über ein Und-Gatter (LVC1G08) die beiden Zweige 
zusammenfassen und in den MISO des µC gehen. Kurze Leitungen 
(Anstiegszeit >> Laufzeit), z. B. zwischen µC und Buffern, brauchen 
keine 100R!

Grüße, Uwe

: Bearbeitet durch User
von U. M. (oeletronika)


Lesenswert?

Hallo,
> Stefan N. schrieb:
> Meine Frage, kann die Schaltung so prinzipiell funktionieren oder habe
> ich einen groben Denkfehler?
im Prinzip ja, aber die Schwachpunkte wurde ja schon genannt.
Mit Pullup um 100kOhm wirst du die 8MHz sicher nicht schaffen.
Die müßten sicher deutlich niederohmiger werde und gehören natürlich 
direkt an die OC-Ausgänge.

> Bzw. glaub jemand das es auch funktionieren
> könnte wenn ich die SPI Leitungen direkt verbinde,
> also ohne buffer Baustein?
Das hängt stark vom uC ab und von der Last am BUS.
Normal sollte das aber keinProblem sein, wenn die Slaves nicht gerade 
eine große Last darstellen und die Leitungen nicht elendig lang sind.

Es gibt uC mit sehr schwachen Ausgängen aber viele moderne uC haben eher 
sehr kräftige und robuste Ports.

Ein Treiber hat aber auch noch den Vorteil, den uC vom BUS zu 
entkoppeln.
Manche uC sind auch echte Sensibelchen und steben schon bei eher 
harmlosen Fehlern. Solche Standard-IC sind da auch eher robust.
Gruß Öletronika

: Bearbeitet durch User
von Uwe B. (uwe_beis)


Lesenswert?

U. M. schrieb:
> Mit Pullup um 100kOhm
Oh weh, dass hatte ich ja falsch gelesen! Ich meinte aus irgendeinem 
Grund, dass da 300 Ohm stehen würde... (ok, die Augen...)

von Stefan N. (suckiden)


Lesenswert?

hi,

ich werde folgende Änderungen vornehmen:
Pullup Widerstände auf 1k ändern und direkt am Ausgang positionieren.
Serienwiderstand zwischen uc und Buffer weglassen.
MISO Leitungen über einen eigenen Buffer auf 2 Leitungen und später auf 
eine zusammenfassen.

Meine Fragen:

Uwe B. schrieb:
> Unpassend bis falsch halte ich allerdings, dass du einen OC-Treiber
> verwendest

Welcher IC würde sich besser dafür eignen bzw. warum nicht?

Uwe B. schrieb:
> Die
> Serienwiderstände an der Quelle dienen eigentlich nicht zur Reduktion
> der Flankensteilheit, sondern zur Absorption der vom Ende einer offenen
> Leitung zur Quelle zurück laufenden Reflektion und sollten daher der
> Leitungsimpedanz entsprechen.

wird die Anstiegszeit aber schon im Vorfeld begrenzt treten Reflexionen 
bei so einer kurzen Strecke gar nicht erst auf oder habe ich den Artikel 
Wellenwiderstand falsch verstanden? Und die Leitung ist ja nicht 
wirklich offen weil jedem Output mehrere inputs gegenüberstehen.

Uwe B. schrieb:
> Dort über ein Und-Gatter (LVC1G08) die beiden Zweige
> zusammenfassen und in den MISO des µC gehen.

sollte das nicht eher ein Oder-Gatter sein? sonst würden ja nur daten 
ankommen wenn zwei Slaves von unterschiedlichen Zweigen und gleiche 
daten senden. Dass zwei Slaves gleichzeitig senden sollte ja generell 
nicht sein.

U. M. schrieb:
>> Bzw. glaub jemand das es auch funktionieren
>> könnte wenn ich die SPI Leitungen direkt verbinde,
>> also ohne buffer Baustein?
> Das hängt stark vom uC ab und von der Last am BUS.
> Normal sollte das aber keinProblem sein, wenn die Slaves nicht gerade
> eine große Last darstellen und die Leitungen nicht elendig lang sind.

vermutlich hast du recht, ich will nur auf Nummer sicher gehen

Gruß, Stefan

von sdghb (Gast)


Lesenswert?

brauchst du keine Chipselects? Was passiert wenn ein Slave Antworten 
will, ich denke das kommt bei deinem Aufbau nie vor, richtig?, dann 
musst du es aber auch nicht übertragen, und 8 MHz find ich ambitioniert, 
aber das ist subjektiv, vielleicht nimmst du ja einen Baustein der das 
kann, meine MSP430 sind im maximum mit 12,5MHz betreibbar, wobei dann 
logischerweise kein Rechtecksignal mehr ankommt sondern eher Dreieck, 
sowas vermute ich mit deinem CLK Signal dann auch, besonders weil ja 4 
Slaves jeweils mit Leitungen und Eingangskapazitäten dein Signal 
verschlechtern, aber da kannst du ja einfach mit der Frequenz 
runtergehen bis es passt.

von Stefan N. (suckiden)


Lesenswert?

sdghb schrieb:
> brauchst du keine Chipselects?

Stefan N. schrieb:
> CS wird über 4 GPIO Leitungen realisiert die später demuxt werden (ein
> DEMUX für Slave 1-4 und einer für 5-8)

sdghb schrieb:
> meine MSP430 sind im maximum mit 12,5MHz betreibbar

verwendet wird ein Cortex-M3 mit 86MHz sollte sich also ausgehen ;)

von sdghb (Gast)


Lesenswert?

ok sorry, habs überflogen und nicht gesehen das mit den CS.

Mit dem schnellen M3 kommt man trotzdem nicht gegen die Leitungs etc. 
Kapazitäten an, aber das wird sich in der Praxis dann zeigen.

Was ich hatte, weiss aber nicht ob es an meinem zu komplizierten Aufbau 
lag, die SOMI-Leitungen haben sich gegenseitig in undefinierte oder 
nicht gewollte Zustände gezogen, die Gefahr sehe ich bei deinem Aufbau 
auch spontan und zwar vor dem 74L...

Weil ja da die zwei Signale parallel liegen, aber vlt hast du das auch 
schon bedacht und man kann den einen SOMI auf HighZ legen während der 
andere was sendet, oder sowas.

von Stefan N. (suckiden)


Lesenswert?

Hi,

sdghb schrieb:
> Mit dem schnellen M3 kommt man trotzdem nicht gegen die Leitungs etc.
> Kapazitäten an, aber das wird sich in der Praxis dann zeigen.

Deshalb die Überlegung mit dem Buffer IC dazwischen, der sollte genügend 
Leistung haben um die Kapazitäten schnell zu laden.

sdghb schrieb:
> Was ich hatte, weiss aber nicht ob es an meinem zu komplizierten Aufbau
> lag, die SOMI-Leitungen haben sich gegenseitig in undefinierte oder
> nicht gewollte Zustände gezogen, die Gefahr sehe ich bei deinem Aufbau
> auch spontan und zwar vor dem 74L...

alle MISO pins der Slaves haben einen Tri-State Ausgang, also JA.

von U. M. (oeletronika)


Lesenswert?

Hallo,
> Stefan N. schrieb:
> wird die Anstiegszeit aber schon im Vorfeld begrenzt treten Reflexionen
> bei so einer kurzen Strecke gar nicht erst auf oder habe ich den Artikel
> Wellenwiderstand falsch verstanden?
Das stimmt schon, allerdings hast du keine Angaben zur Leitungslänge 
gemacht und wir wissen auch nicht, welcher Art die Slaves sind.

Mit den Tiefpassen hinter dem Treiber begrenzt du die Anstiegszeiten, 
was natürlich etwas längere Leitungen zulässt, ohne dass man schon 
Impedanzanpassung benötigt. Als Faustregel rechnet man mit 
Wellenleiter-Effekten ab ca. Lambda/10. Bei 8MHz Takt brauchts du aber 
schon Grenzfrequenzen um 50MHz mit Wellenlängen um ca. 0,6...0,6m. Ab 
ca.50...60cm Leitungslänge wären dann schon Refexionen durch 
Fehlanpassung möglich.

> Und die Leitung ist ja nicht
> wirklich offen weil jedem Output mehrere inputs gegenüberstehen.
Die Inputs sind auch in erster Linie kapazitive Lasten 
(Gatekapazitäten).
Kapazitäten an den Leitungsenden wirken aber bei hohen Frequenzen wie 
ein Kurzschluss und können eben auch Reflexionen infolge der 
Fehlanpassung verursachen. Bei 8MHz und moderaten Längen bis ca. 50cm 
düfte es aber wenig Probleme geben, weil du noch gezielt 
Tiefpassverhalten einbaust.

Beachte, dass bei Messungen mit Oszi die Signale auch deutlich 
verfälscht werden können. Bei Tastköpfen mit 1:1 kann die Kapazität bei 
ca. 100pF liegen, bei 10:1 immer noch bei ca. 10...15pF.
Das ist unter Umständen viel mehr, als du an den BUS-Leitungen hast.
Mit einer zusätzlichen Reihenkapazität an der Tastspitze um 1pF kannst 
du das stark abmildern. Natürlich stimmt dann die Spannung am Oszi nicht 
mehr, aber es geht ja primär um die Signalform.
Gruß Öletronika

: Bearbeitet durch User
von Uwe B. (uwe_beis)


Lesenswert?

Stefan N. schrieb:
>> Mit dem schnellen M3 kommt man trotzdem nicht gegen die Leitungs etc.
>> Kapazitäten an, aber das wird sich in der Praxis dann zeigen.
>
> Deshalb die Überlegung mit dem Buffer IC dazwischen, der sollte genügend
> Leistung haben um die Kapazitäten schnell zu laden.
Das ist nicht richtig. Leitungen haben nicht nur Kapazität, sondern auch 
Induktivität. So ergibt sich deren Impedanz. Man kann eine beliebig 
schnelle Flanke an eine Leitung anlegen, es fließt lediglich maximal der 
Strom, der der Impedanz entspricht. Die ist bei zweiseitigen, 1,5 
mm-FR4-Leiterplatten mit 0,2 mm Leiterbahnbreite und einer 
gegenüberliegenden Massefläche ca. 150 Ohm. Das schafft jedes moderne 
IC. Bei 0,2 mm Abstand Leiterbahn/Massefläche (4 Lagen) sind es gut 70 
Ohm. Du willst zwei dieser Leiterbahnen gleichzeitig treiben, da würde 
ich mich nicht mehr darauf verlassen, dass das der µC anständig macht. 
Könnte aber sein, das musst du heraus finden.

Stefan N. schrieb:
> wird die Anstiegszeit aber schon im Vorfeld begrenzt treten Reflexionen
> bei so einer kurzen Strecke gar nicht erst auf oder habe ich den Artikel
> Wellenwiderstand falsch verstanden?
Teilweise. Richtig: Wenn die Anstiegszeit groß genug ist, treten 
(sichtbare!) Reflektionen gar nicht erst auf. Falsch: Mit einem 
Quellwiderstand wird die Anstiegszeit nicht begrenzt. Da widerspreche 
ich vielen anderen Antworten hier ausdrücklich. Er bildet mit der 
Leitungsimpedanz einen reellen 1:1 Spannungsteiler, und keinen 
RC-Tiefpass! Am Ende der (idealen) Leitung verdoppelt sich der 
anfänglich halbierte Spannungssprung und hat damit sein ursprüngliches 
dU/dt wieder. Das so reflektierte Signal kommt nach einer weiteren 
Laufzeit am Quellwiderstand an (dort ist ein Treppensignal sichtbar) und 
wird durch den Quellwiderstand abgeschlossen bzw. kein weiteres Mal 
reflektiert.

> Und die Leitung ist ja nicht
> wirklich offen weil jedem Output mehrere inputs gegenüberstehen.
Richtig. Das verfälscht die idealen Verhältnisse. Aber nicht so viel, 
dass das Prinzip völlig ausgehebelt wird und der Sinn der 
Quellwiderstände ad Absurdum geführt wird. Das lässt sich alles recht 
gut simulieren.

Stefan N. schrieb:
> MISO Leitungen über einen eigenen Buffer auf 2 Leitungen und später auf
> eine zusammenfassen.
Wenn ich dich richtig verstehe, ist das nicht das, was ich meinte: Je 4 
MISO Leitungen direkt an der Quelle bei den Slaves zusammenfassen, dort 
auch mit 100R und Pullup versehen und die 2 Leitungen später über ein 
Gatter auf eine zusammenfassen. Kein Buffer.

Stefan N. schrieb:
> sollte das nicht eher ein Oder-Gatter sein?
Da immer nur ein Slave selektiert ist, ist die andere Leitung wegen des 
Pullups high. Geht natürlich prinzipiell auch mit Pulldown und 
Oder-Gatter, macht man aber aus anderen Gründen nicht.

Stefan N. schrieb:
> Welcher IC würde sich besser dafür eignen bzw. warum nicht?
Jedes genügend schnelle Logik-IC mit ausreichend leistungsfähigem (d. 
h., niederohmigen) Ausgang. Meines Wissens nach sind LVCs gut geeignet. 
HCs/HCTs sind schwächer, wenn ich mich nicht täusche. Ob es spezielle 
Treiber-ICs bei LVC gibt, wie es sie - glaube ich wieder - bei HC/HCT 
gibt, weiß ich nicht.

Grüße, Uwe

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
Noch kein Account? Hier anmelden.