Forum: Mikrocontroller und Digitale Elektronik SPI debuggen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von A. S. (rava)


Angehängte Dateien:

Lesenswert?

Hi,

eine SPI geht ja öfter mal nicht auf Anhieb, aber dieses Mal ist es 
schon besonders zäh. Vielleicht habt ihr ein paar Tipps, wie ich hier 
weiterdebuggen kann:

Es geht um eine Platine mit viel inaktiver Elektronik und mit 
PIC18F45K50-I/PT-ND, an dem per 5V SPI eine Kette aus den folgenden 
Slave-Komponenten hängt:
* 74LVC595AD (nicht im Schaltplan)
* STP08CP05MTR
* STP08CP05MTR
* 74LVC595AD

Da soll mal später eine LED-Matrix entstehen, aber im Moment scheitert 
es schon vorher - ich kann nichtmal ein statisches Muster kontrolliert 
darstellen.

Manche Bits erscheinen doppelt, andere gar nicht; und abhängig vom 
anzuzeigenden Muster, wechseln die Bits ihre Funktion.
Ich gebe z.B. einen langsamen 8-Bit Counter auf einen der STP08CP05MTR 
und muss erkennen, dass manche der LED gleichzeitig aktiviert und 
deaktiviert werden - aber nicht während allen der 256 Schritten. Bei den 
595ern verhält es sich ähnlich. Deterministisch scheint es jedenfalls zu 
sein. Ich habe auch das Gefühl, nach dem Überlauf des Zählers erscheint 
eine andere Sequenz als zuvor.

Zuerst dachte ich, die Geschwindigkeit des Bus wäre zu hoch. Die gesamte 
Leitungslänge ist ca. 30cm - die Bahnen für LE, MOSI und CLK laufen 
weitestgehend parallel, damit sie gleich lang sind.
Allerdings bin ich bis auf 200Hz SPI-Takt heruntergenangen, ohne eine 
Änderung am Verhalten festzustellen. Auch den Signalstrom mittels einer 
Last zu erhöhen, scheint nicht viel zu bringen. Wäre das üblich?

Als nächstes habe ich mit dem Oszi gemessen. Am ersten 595 kommen alle 
Signale noch sauber an. Allerdings stelle ich hier bereits fest, dass 
das angezeigte Muster komplett verschwindet, sobald ich mit dem Oszi 
MOSI am 595 messe. Wenigstens ein Flackern bekomme ich zurück, wenn ich 
parallel dazu noch einen Tastkopf an CLK hänge.

Was könnte hier passieren? Wieso beeinflusst Die Messung das SPI so 
extrem, selbst bei niedrigen Geschwindigkeiten? Hat jemand so ein 
Verhalten schon mal beobachtet?

von Boomer1337 (Gast)


Lesenswert?

Tastkopf mit höherem Widerstand oder das Signal verstärken

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. S. schrieb:
> Manche Bits erscheinen doppelt, andere gar nicht; und abhängig vom
> anzuzeigenden Muster, wechseln die Bits ihre Funktion.
Normalerweise kommt sowas vom falschen SPI Modus. Könnte aber auch ein 
Klingeln auf der Taktleitung sein.


> wenn ich parallel dazu noch einen Tastkopf an CLK hänge.
Was sieht der Tastkopf?

Mach doch mal direkt am CLK Pin des Senders einen 47 Ohm Widerstand in 
die CLK Leitung.

: Bearbeitet durch Moderator
von A. S. (rava)


Angehängte Dateien:

Lesenswert?

Der Tastkopf hat bereits 10MR. Das müsste reichen, oder nicht?

Ich fahre in SPI-Modus 1.
Wenn ich keinen Denkfehler habe, ist das der Richtige. Aber auch die 
drei anderen Modi liefern ähnliches Verhalten. Zugegebermaßen, bei so 
langsamen Takt habe ich's noch nicht versucht. Das mache ich nachher 
nochmal, um sicher zu gehen.

Von den 47R habe ich schon gehört. Würde das das "Ringen" bekämpfen? 
Müsste man das Ringen am Oszi sehen? Ich habe in allen drei Signalwegen, 
Clock, Daten und !LE bereits 10R reingesetzt - identisch wie beim 
Schaltplan am Pin header. Sind 10 Ohm noch zu wenig?

: Bearbeitet durch User
von Gerald K. (geku)


Lesenswert?

Manchmal scheitert es an der Ruhelage der SPI-Sigale.  Bei manchen MCs 
kann diese konfiguriert werden. Am besten mit Logikanalysator oder 
Oszilloskop mit SPI-Decodierung überprüfen und mit dem DB vergleichen.

https://www.mikrocontroller.net/articles/Serial_Peripheral_Interface

von A. S. (rava)


Angehängte Dateien:

Lesenswert?

A. S. schrieb:
> Zugegebermaßen, bei so
> langsamen Takt habe ich's noch nicht versucht. Das mache ich nachher
> nochmal, um sicher zu gehen.

auch beim langsamen Takt funktioniert keiner der SPI Modi. Zwei 
verursachen wildes Flackern. Die anderen beiden erzeugen chaotisches, 
aber stabiles Kauderwelsch wie oben beschrieben.

Lothar M. schrieb:
> Was sieht der Tastkopf?

ah, du hast deinen Beitrag nochmal editiert. Was meinst du? der eine 
misst CLK, der andere MOSI. Beide Signale sehen für mich in Ordnung aus.

Ich habe mich heute mal hingesetzt und ein paar Oszifotos gemacht. 
Vielleicht sieht jemand von euch etwas darin...

was mir einfällt: ich habe ja bereits 10R am PIC-Ausgang für !LE, Clock 
und MOSI. Im Schaltplan oben im Eingangspost sieht man nochmal 10R für 
!LE, Clock und MOSI vor J19 (für weitere Slaves). Aber !LE und Clock 
sind ja bereits vom PIC aus limitiert. Müssen diese beiden Widerstände 
am Ende raus? Angeschlossen ist zunächst noch nichts.

: Bearbeitet durch User
von Christian F. (christian_f476)


Lesenswert?

Davon abgesehen dass es wahrscheinlich einer der ICs ist der das so 
heftig dämpft.
Probier doch mal bitte das Signal direkt nach dem uC mit einem Schmitt 
Trigger zu 'bereinigen' und lass die 10R weg. Zwei bc547 o. ä. Und eine 
Hand voll Widerstände hast du wahrscheinlich da.

von Pandur S. (jetztnicht)


Lesenswert?

Nun muessen nur noch die Signale das richtige Timing zueinander haben. 
Also Setup und Hold Zeiten. Sodass die Signale bei der Clock Flanke 
stabil sind.

von Walter Tarpan (Gast) (Gast)


Lesenswert?

Ist das Latch Enable überhaupt irgendwo dran?

von Holger T. (holgert)


Lesenswert?

A. S. schrieb:
> Als nächstes habe ich mit dem Oszi gemessen. Am ersten 595 kommen alle
> Signale noch sauber an. Allerdings stelle ich hier bereits fest, dass
> das angezeigte Muster komplett verschwindet, sobald ich mit dem Oszi
> MOSI am 595 messe. Wenigstens ein Flackern bekomme ich zurück, wenn ich
> parallel dazu noch einen Tastkopf an CLK hänge.

Masseproblem? Leider zeigst Du uns nicht den Schaltplan für das erste 
Kettenglied. C24..C26 und der Block-Kondensator für den ersten '595 sind 
(elektrisch!) dicht am IC und nicht irgendwo auf der Platine?

Im allgemeinen zum Debugging: erst das erste Kettenglied stabil zum 
Laufen bringen, dann das zweite, usw.

Zeige kompletten Plan und PCB-Layout.

Oszi ist wohl "nur" 2-Kanal, sonst wäre auch das LE-signal interessant. 
Ansicht CLK_vs_MOSI.jpg ist gut - besser wäre, nur 8 CLK-Takte auf der 
x-Achse zu haben. Man kann dann das richtige Timing zueinander besser 
abschätzen.

Edit: Wenn nur 2-Kanal-Oszi, dann zeige CLK und LE gemeinsam oder MOSI 
und LE gemeinsam.

: Bearbeitet durch User
von Gerald K. (geku)


Lesenswert?

Ich würde mal schauen, ob die **SPI Modi** stimmen.

Mehr darüber :

https://de.m.wikipedia.org/wiki/Serial_Peripheral_Interface

https://www.electrodummies.net/de/msp430-spi-tutorial/

Werden Master und Slave mit dem gleichen Mode betrieben?

Mit welchem Mode wird der Master betrieben?

Stimmt der Mode nicht überein, dann verstehen sich Master und Slave 
nicht.

Der wesentliche Unterschied besteht in der Ruhelage des Clocksignals.

In Clk_vs_Mosi.jpg ist die die Ruhelage des Clocks Low, also Mode 0 oder 
1.

Um zu wissen ob Mode 0 oder 1, ist festzustellen ob die Daten mit der 
ersten oder zweiten Flanke übernommen werden.

: Bearbeitet durch User
von A. S. (rava)


Lesenswert?

ich kann mich nochmal zurückmelden, denn mein Problem ist gelöst.
Es lag tatsächlich an den Dämpfungswiderständen in den Signalleitungen.

Es hat sich herausgestellt, dass das MOSI-Signal besondere Überschwinger 
aufweiste, und zwar nur dann, wenn der output anders war als erwartet.

Das hat mich überrascht, denn MOSI ist ja mehrmals unterbrochen und 
"nachverstärkt", da ich eine daisy-chain Architektur mit mehreren Slaves 
habe.

Jedenfalls habe ich an der Stelle, an der die Überschwinger aufgetaucht 
sind, den Widerstand von 10R auf 47R erhöht und mein Problem ist 
verschwunden - auch wenn die Signalform noch immer Überschwinger 
aufweiste.

Da ich dachte, den Fehler gefunden zu haben, habe ich also alle 
Widerstände von 10R auf 47R gewechselt. Der Ärger war daraufhin 
sporadisch wieder da - vor allemn, wenn man die Leiterbahnen mit dem 
Finger berührt (zusätzliche Kapazität).

Schlussendlich habe den einen kritischen Widerstand nochmals auf 100R 
erhöht und den Rest so belassen, wie er war. Die Signalformen sind jetzt 
auf dem Oszi Überschwingerfrei, aber dafür etwas langsamer. Für meine 
Zwecke sollte die Geschwindigkeit jedenfalls reichen. 750kHz Takt sind 
immer noch möglich.

Danke für eure Hilfe!

: Bearbeitet durch User
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. S. schrieb:
> Es hat sich herausgestellt, dass das MOSI-Signal besondere Überschwinger
> aufweiste, und zwar nur dann, wenn der output anders war als erwartet.
Das deutet irgendwie weiterhin auf den falschen SPI-Modus hin.

> Es hat sich herausgestellt, dass das MOSI-Signal besondere Überschwinger
> aufweiste, und zwar nur dann, wenn der output anders war als erwartet.
Das MOSI-Signal ist beim SPI eigentlich unkritisch. Das MOSI Signal muss 
lediglich bei der speichernden Taktflanke (und um die Setupzeit tsu 
vorher, sowie die Haltezeit th nachher) definiert und stabil sein.

Du musst beim SPI also (wie hier schon mal angemerkt) besonders diesen 
Bereich mit dem Oszi anschauen. Und zwar müssen da beide Tastköpfe 
direkt am empfangenden IC angeklemmt sein. Leider kann man wegen der 
falschen Zeitbasis auf deinem Bild CLK_vs_MOS.jpg gerade diesen sehr 
wichtigen Bezug nicht erkennen. Statt 10µs sollte dort besser 100µs oder 
200µs stehen.

> da ich eine daisy-chain Architektur mit mehreren Slaves habe.
Beim Chaining muss man dann noch die Verschiebung des Ausgangssignals 
(Time Clock to Output tco) beachten. Denn der Takt für das nachfolgende 
IC geht ja ohne diese Verzögerung am IC "vorbei", die Datenleitung wird 
aber verzögert. Deshalb ist es ratsam, sich den zeitlichen Bezug 
zwischen der speichernden Flanke und dem Wechsel auf der Datenleitung an 
jedem einzelnen Slave anzusehen. Und eben jeweils direkt an dessen Pins.

> dass das MOSI-Signal besondere Überschwinger
> aufweiste, und zwar nur dann, wenn der output anders war als erwartet.
Also je nach unterschiedlicher Beschaltung? Oder zeigten sich die 
Effekte bei sonst gleichem Aufbau einfach "mal zwischendurch"?

: Bearbeitet durch Moderator
von Stefan ⛄ F. (stefanus)


Lesenswert?

Zeige das Bild CLK_vs_MOSI.jpg nochmal detaillierter. Und zwar will ich 
die Flanken von CLK und MOSI relativ zueinander sehen.

Zeige man einen Wechsel an MOSI von Low->High und einen von High->Low, 
zusammen mit dem zugehörigen CLK Signal.

von A. S. (rava)


Angehängte Dateien:

Lesenswert?

Na ihr habt schon recht. Der Mode ist zwar in Ordnung, aber so 100%ig 
passt passt noch nicht alles zusammen.

Ich habe nochmal einen Versuch mit drei Tastköpfen gemacht und 4 Bytes à 
"0b10100101" durch die Kette geschickt. Getriggert ist durch LE, 
dargestellt werden MOSI und CLK.

Am ersten 595 kommt das Signal aus dem PIC sauber an: Während der 
negativen Flanke wird SDI gesetzt und dann die Werte an der positiven 
Flanke übernommen (A.jpg).

Der Ausgang vom 595 ist da ein bisschen anders (B.jpg). Nur bei 
positiven Flanken schaltet die Datenleitung um. Da könnte es jetzt also 
sein, dass der nachfolgende STP08CP05MTR beim ersten Clocktick bereits 
die "0" sieht, wenn er der SDI-Eingang zu schnell schaltet.

Ich hätte eigentlich erwartet, dass das unkritisch ist, da CLK ja 
schneller ankommen müsste, aber ich habe immer noch ein Fehlerbild am 
zweiten STP, also dem dritten Modul in der Kette.

Trotz ca 10cm zwischen den beiden Komponenten, habe ich den ersten STP 
jetzt zwar ziemlich eindeutig unter Kontrolle. Da leuchten wie erwartet 
vier LEDs.

Am zweiten STP leuchten allerdings nur drei - und das obwohl das Bild am 
Oszi hier ebenfalls aussieht wie B.jpg - und prinzipiell alle LEDs 
leuchten könnten - und der auch geometrisch im Layout einfach "hinten 
dran hängt".

Was mich wundert, ist dass das Ergebnis absolut reproduzierbar ist. Mit 
dem neu eingelöteten 100R Widerständ lässt sich über "Finger auf die 
Leiterbahn" nichts mehr beeinflussen. Da glaube ich eher nicht, dass es 
an ein paar ns hin oder her hängt.

Es lässt sich also nicht leugnen, dass das Einlöten von 100R zwischen 
dem 595 und dem ersten STP etwas gebracht hat. Man kann natürlich 
argumentieren, dass die Leitung ein Kondensator ist, und man mit dem 
Widerstand ein RC-Glied baut, das das Signal etwas verzögert. Aber der 
Effekt sollte doch minimal sein - irgend eine Überlegung fehlt noch.

von Stefan ⛄ F. (stefanus)


Lesenswert?

A. S. schrieb:
> Getriggert ist durch LE, dargestellt werden MOSI und CLK.

Die Schieberegister (beide Typen) übernehmen die Daten bei der 
steigenden Taktflanke. Im Bild A sieht alle prima aus, die Daten sind 
lange vor und lange nach der steigenden Flanke stabil.

Im Bild B ändern sich die Daten immer zusammen mit der steigenden 
Taktflanke. Dass das dahinter folgende Schieberegister damit nicht 
funktioniert, ist ziemlich klar.

Ich denke, du hast da den falschen Ausgang verwendet. Für die Verkettung 
von Schieberegistern haben beide Typen einen speziellen Ausgang, den 
musst du nehmen.

Leider hast du den Schaltplan vom wichtigsten Teil (rund um den ersten 
74HC595) nicht gezeigt.

von c-hater (Gast)


Lesenswert?

A. S. schrieb:

> * 74LVC595AD (nicht im Schaltplan)

Warum nicht?

von Gerald K. (geku)


Lesenswert?

A.jpg zeigt Sender mit Mode 2 und

B.jpg zeigt Sender mit Mode 3

Wenn in beiden Fällen die Empfänger Mode 2 benutzen, dann geht "B" 
schief (Daten des Senders wechseln während der steigenden Flanke)

https://www.mikrocontroller.net/articles/Serial_Peripheral_Interface#SPI-Modi

**Lösung** : Sender B auf Mode 2 oder Empfänger B auf Mode 3 umstellen

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.