Hallo Leute,
ich habe in letzter Zeit einige SPI-Busse verwendet, um AVRs
kommunizieren zu lassen. Manchmal gabs da überhaupt keine Probleme,
manchmal war der Bus total unstabil, sodass ich einfach nur die Leitung
etwas knicken musste, und schon traten haufenweise Fehler auf,
unabhängig von der Sendegeschwindigkeit (immer unter 2MHz). Im Moment
habe ich auch keine größeren Quellen von elektromagn. Strahlung (z.B.
Motoren) laufen... nur ein Netzgerät, womit ich alles betreibe.
Mache ich vielleicht was falsch? Was sollte man generell beachten?
Gruß, Yaro
> Manchmal gabs da überhaupt keine Probleme
So kenne ich den SPI auch... ;-)
> Was sollte man generell beachten?
Den richtigen SPI-Modus verwenden.
> sodass ich einfach nur die Leitung etwas knicken musste
Was für eine Leitung?
Wie lang ist die Leitung?
Hast du Serienterminierungswiderstände eingebaut?
> Den richtigen SPI-Modus verwenden.
Das mache ich... Sonst würde ja überhaupt nix sinvolles übertragen
werden.
>Was für eine Leitung?
15cm Flachband-Kabel.
>Hast du Serienterminierungswiderstände eingebaut?
Nein, sollte ich das? Wie groß sollen sie bemessen sein?
Gruß, Yaro
Flachbandkabel sind der EMV-tot Deiner Schaltung ... da kann sich alles
mögliche einkoppeln.
Wenn Du da mehrere kHz überträgst, kommst schon in den kritischen
Bereich. Da kann Abhilfe durch mehrere Mittel geschaffen werden:
- differential pairs (redundante Pegelübertragung und Auswertung der
Differenz als Nutzsignal siehe RS485)
- 1 Masseleitung parallel zu jeder Signalleitung im Flachbandkabel,
sodass die Signale immer einen Masse-Bezug "sehen"
- galv. Trennung
- je nach dP/dt (Laständerung über der Zeit) kann es nötig sein, den
Schaltungsteil hinter dem Flachbandkabel niederohmiger anzubinden, da
die Ausgleichströme für Spannungsabfall über deinen Versorungsleitungen
sorgen können. Das kann wiederum zu Fehlinterpretation Deiner
digital-Pegel führen.
Terminierung
Je nach Bustopologie könntest Deine SPI-Leitungen auch noch terminieren.
Dazu empfiehlt sich, die Leitungen so auszuprägen, dass überhaupt eine
richtige Impedanz da ist (Massfläche, Leiterbreite, Leiterabstand zu
Fläche, ...). Dann kannst beim Leitungstreiber einen Serienwiderstand
einbauen, um eine Anpassung an die Impedanz zu erreichen. Der Empfänger
ist hochohmig und sollte daher gegen eine Versorgungsspannung mit einem
Pullup/Down abgerschlossen sein - jenachdem, welcher der Ruhepegel ist.
Gruß,
Kay
@ Kay Imperator (imperator)
>Flachbandkabel sind der EMV-tot Deiner Schaltung ... da kann sich alles>mögliche einkoppeln.
Unsinn. Siehe Wellenwiderstand Ist schon komisch, dass Millionen von
Festplatten seit Jahrzehnten mit Flachbandkabeln super funktionieren.
MFg
Falk
Yaro schrieb:
> unabhängig von der Sendegeschwindigkeit (immer unter 2MHz).
Die Übertragungsrate ist irrelevant !!
Die AVR senden immer mit der gleichen steilen Flanke.
Ab 15cm Leitungslänge wird es hier kritisch.
Bei SPI würde ich die AC Terminierung vorschlagen.
Siehe Wiki.
Flachbandkabel hat es gerne, wenn Du es mit GND, Signal, GND, Signal,
GND... belegst.
Falk Brunner schrieb:
> Ist schon komisch, dass Millionen von> Festplatten seit Jahrzehnten mit Flachbandkabeln super funktionieren.
Für die jüngeren, die das vielleicht schon alles nicht mehr kennen
(;-)): SCSI-3 (Ultra-SCSI) dürfte da im wesentlichen die Spitze dessen
gewesen sein, wo noch ganz normale Flachbandkabel (ohne die "Tricks" wie
jede zweite Ader Masse etc.) verwendet wurden. Das waren 20MHz Bustakt
bei bis zu 3m Kabellänge. Saubere (aktive) Terminierung war da dann
natürlich Pflicht! Bei SCSI-1/2 (5 MHz bzw. 10 MHz) mit kurzem Kabel
(<50cm) lief es ggf. auch schonmal ohne Terminierung (sogar im Prinzip
stabil, man durfte nur nichts am Rechner verändern ;-).
PATA hat es bis UDMA33 mit normalen Flachbandkabeln gebracht, das waren
dann 8 MHz Bustakt (mit DDR).
Andreas
Yaro schrieb:
> Dann werde ich zuerst jede zweite Leitung GND legen, wenns noch> Störungen gibt, dann Terminierung.
Nein, umgekehrt. Erstmal um die Terminierung kümmern. GND-Leitungen mit
der Giesskanne verteilen hilft genau garnicht gegen Signalreflektionen.
Andreas
PS: Naja, vielleicht ein bisschen, wegen erhöhter Kapazität und damit
Abflachung der Flanken. Trotzdem bleibt's dabei, erstmal Terminierung,
wenn das nicht reicht, kann man weiterschauen.
Zu Anfang ca. 25cm Lochraster mit VG Steckern an die Platinen keine
Probleme.
Jetzt alle Leitungen MOSI MISO SCK SS mit 4k7 an Plus 5V. Jetzt sind sie
empfindlich bei Induktiven Lasten.
> > Den richtigen SPI-Modus verwenden.
Das mache ich... Sonst würde ja überhaupt nix sinvolles übertragen
werden.
Das würde ich so pauschal nicht behaupten. Je nach Setup- oder Hold-Time
der Eingänge KANN es auch bei falschen Modus laufen- MUSS aber nicht.
Wenn dann noch Signalverzerrungen und/oder Laufzeiten dazu kommen,
geht's halt schief.
@ Falk Brunner (falk)
Ich geb Dir schon Recht ... bestehende Platinen funktionieren oft schon
sehr lange. Auf neuere Platinen kommen jedoch auch neuere Bauteile mit
steileren Flanken, sie werden in raueren Umgebungen eingesetzt und auf
vielen alten Platinen sind gar keine uCs Netzteile etc. verbaut...
Die EMV-Betrachtung hat durchaus ihre Berechtigung, was man leidvoll
erkennt, wenn man mal die erste EMV-Optimierung eines Produktes
durchlebt hat. Man erkennt es auch, wenn das liebevoll erstellte Produkt
plötzlich bei diesem einen Kunden an dieser einen Stelle in der Anlage
immer wieder ausfällt.
@ Andreas Ferber (aferber)
Wenn ich mich recht entsinne, gab es da in der Übertragungs-Schicht auch
großzügige Hemmingdistanzen und selbstheilende Datenkodierung mit
reichlich Redundanz ;)
@ Yaro (Gast)
wie Andreas Ferber (aferber) schon schreibt ... versuch mal die
Impedanzanpassung. Du könntest es zunächst mit 100R bei den
Treiber-Ausgängen versuchen. Das ist mal ein Versuchswert - vielleicht
ist er bei Dir auch höher.
Sender Empfaenger
-------+ +--------+
| | |
O--100R-----------Leitung----------+------O |
| | | |
---O---+ C == +---O----+
| | |
| R |
| | |
GND GND GND
Kay Imperator schrieb:
> Wenn ich mich recht entsinne, gab es da in der Übertragungs-Schicht auch> großzügige Hemmingdistanzen und selbstheilende Datenkodierung mit> reichlich Redundanz ;)
Bei SCSI? Nö. Die einzige Absicherung gegen Übertragungsfehler war ein
Parity-Bit. Selbst ein simpler CRC kam erst sehr viel später mit
Ultra-160-SCSI, das war aber dann auch schon LVD. Im Highend-Umfeld
(Grossrechner etc.) hat SCSI aber auch von Anfang an mit differentieller
Übertragung gearbeitet (damals noch High Voltage Differential), alleine
schon, weil damit längere Kabel (bis 25m) möglich waren.
ATA hatte dagegen nichtmal Parity. Erst mit Ultra-ATA/33 im UDMA2-Modus
kam dann ein CRC dazu.
Eine Fehlerkorrektur kennen beide nicht (nur Recovery - der Host sendet
halt die Daten noch einmal), wäre aber IMO in diesem Fall auch
überflüssiger Aufwand, solange Fehler nicht allzu häufig auftreten.
Andreas
Ich werde es dann zuerst mit Serienterminierung versuchen, einen
Kondensator gegen GND werde ich nur dann drauf machen, wenns nicht
anders geht.
Ansonsten eben noch jede zweite Leitung GND, ist ja auch eine kleine
Erhöhung der Kapazität.
Danke für eure Hilfe!
Gruß, Yaro
>> Den richtigen SPI-Modus verwenden.> Das mache ich...> Sonst würde ja überhaupt nix sinvolles übertragen werden.
Ja, da kann man sich aber arg täuschen...
Ich behaupte dass genau so was wie du es beschreibst passieren kann,
wenn du den falschen SPI-Modus verwendest. Denn wenn Sample- und
Shift-Flanke vertauscht sind, hilft dir nur noch eine geringfügig
unterschiedliche Laufzeit.... :-o
Yaro schrieb:
> Kondensator gegen GND werde ich nur dann drauf machen, wenns nicht> anders geht.
Das ist ein RC-Glied - das R gegen GND wird nur ab Frequenz x
nennenswert wirksam.
Die beschriebenen Probleme treten z.T. auch auf, wenn ich zwei ATmegas
verwende, und genau gleich initialisiere (nur eben ein Master und ein
Slave).
Sample und Shift-Flanken sind dann eindeutig gleich gesetzt.
Habe aber grade gemerkt, dass es (in meinen jetzigen Aufbauten) nur
Probleme gibt, wenn ich unterschiedlich getaktete Controller miteinander
Kommunizieren lasse. Ist es so, dass schneller getaktete ATmegas auch
steilere Flanken machen? Oder ist das nur vom internen Treiber abhängig?
Gruß, Yaro
Noch was... Die Probleme, die auftreten sind, dass Bytes z.t. nicht
zuendegeshiftet werden. Reflektionen (auf der SCK-Leitung) würden aber
doch genau zum Gegenteil führen... es würde zu viel geshiftet!
Langsamerer prescaler hilft wie gesagt auch nicht.
Gruß, Yaro
Nein, nicht double Speed.
Das, wo es vorkommt, ist z.B. ein LCD-Debug-Board. Habe ein Board, auf
dem ich ein LCD-Display drauf habe, was ich mit I2C und SPI ansteuern
kann.
Ansteuerroutinen (Ausschnitt):
1
voidlcdSPIInit(uint8_toperation){//1: save SPI-settings, Init lcd SPI; 0: restore SPI
Wenn ich die Kabel knicke, oder mit trockenen Fingern die Pins
überbrücke, kommt es z.T. öfter zu Störungen. Manchmal gibt es auch
überhaupt keine Störungen.
Hängt auch ein Bisschen von den Platinen ab, von denen aus ich sende
(bei gleichem Controller)
Gruß, Yaro