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