SPI-Signalintegrität

Vor ein paar Tagen hatte ich ein Problem, bei dem ich keine Daten von einem SPI-Slave lesen konnte. Ich habe es endlich behoben und kann jetzt ganz gut Daten lesen.

Allerdings habe ich heute ein anderes interessantes Problem gefunden. Wenn ich den Ausgang des Slaves direkt mit der MCU verbinde, werden die Daten beschädigt. Folgendes Bild zeigt dies:

Geben Sie hier die Bildbeschreibung ein

Wenn ich jedoch einen 220-Ohm-Reihenwiderstand einsetze, kommen die Daten wie folgt gut an:

Geben Sie hier die Bildbeschreibung ein

Das übertragene Byte war 11001101. Sie können den Beginn und das Ende der Übertragung an den zwei kleinen Einbrüchen in der Wellenform erkennen. Die anfängliche Senke ist in der Nähe der Auslöseanzeige zu sehen. Diese sind in der beschädigten Wellenform nirgendwo zu sehen.

Die Datenübertragungsrate ist nicht sehr schnell. Die Taktrate beträgt nur 62500 Hz.

Was könnte das verursachen? Und wie kann ich sicherstellen, dass es nicht auftritt, wenn ich die Leiterplatte endgültig auslege?

Die obere Wellenform ist der Takt (SCK) und die untere ist MISO.

Diese Wellenformen zeigen das Klingeln detaillierter. Auch hier ist die obere Wellenform der Takt und die untere ist MISO. In diesem Bild sind CPLD und MCU über einen 220-Ohm-Widerstand verbunden:

Geben Sie hier die Bildbeschreibung ein

Dies zeigt das Klingeln, wenn MCU und CPLD direkt verbunden sind (kein Widerstand dazwischen). Beachten Sie, dass ich den Source-Pin (in diesem Fall den Pin des CPLD) nicht erreichen kann, da sich das CPLD auf einer Entwicklungsplatine und der Chip auf einem BGA-Gehäuse befindet. Ich werde versuchen, zu sehen, ob der Stift sondiert werden kann. Außerdem habe ich vergessen hinzuzufügen, dass ich auch einen 100-Ohm-Widerstand in Reihe am SCK habe. Ich brauchte dies, um das Klingeln von der MCU auf der Uhr zu reduzieren und weil es für den AVR ISP-Programmierer erforderlich ist. Andernfalls gibt AVR Studio einfach einen Fehler aus. Auf dem endgültigen PCB-Layout werden sie also benötigt.

Geben Sie hier die Bildbeschreibung ein

Sind Sie sicher, dass Sie die richtigen Signale prüfen? Das erste Bild sieht so aus, als würden Sie einem Taktsignal folgen. Beide scheinen nicht beschädigt zu sein.
Ja. Ich lasse die Sonde angeschlossen und sobald ich die MCU direkt mit dem Slave verbinde, ändert sich die Wellenform.
Zeigen Sie auch die Uhr an.
@LeonHeller Ich habe die Frage mit neuen Bildern aktualisiert. Diese zeigen auch die Uhr an.
Kannst du die Signale irgendwie beschriften? Es sieht so aus, als ob A SCK ist und ich vermute, dass B MISO ist, aber es ist nicht klar. Es kann auch hilfreich sein, die Chip-Select-Leitung anzuzeigen, wenn Sie einen zusätzlichen Kanal auf Ihrem Oszilloskop haben.
Bist du bit-banging? Könnte dies die finstere Arbeit einer Unterbrechung sein, die während Ihrer Übertragung ausgelöst wird?
Nein Siree. Überhaupt keine Unterbrechungen. Nur reine SPI-Übertragung.
Natürlich werden Sie alle Arten von Klingeln haben, wenn Sie auf einem dieser schrecklichen Steckbretter bauen. Ist Ihr Zielfernrohr mit dem Erdungskabel und der Krokodilklemme verbunden? Das wird etwas mehr Klingeln zeigen. Wenn Sie jedoch hineinzoomen und die Ränder betrachten möchten, müssen Sie einen winzigen Bodenpfad verwenden. ¶ Meiner Erfahrung nach sieht die obere Spur gut aus, wie eine solide SPI-Verbindung. Keine Signalverschlechterung wird ein klares Rechtecksignal in ein anderes klares Signal verwandeln. Sie müssen woanders nach einem Softwarefehler oder einer falschen Verbindung suchen. ¶ Falsche Verbindungen sind bei diesen Nylonplatten der Mühe üblich ...
Ich höre dich, Markrages. Ich habe die Steckbretter sehr satt, aber es war die einzige Wahl, die ich hatte. Aber ich werde morgen mit der Arbeit an meinem Layout beginnen und hoffentlich bald genug eine Prototyp-Leiterplatte herstellen lassen. Nicht zuletzt habe ich gelernt, wie wichtig ein möglichst kurzer Signalweg ist. Also werde ich meine MCU neben den CPLDs platzieren.
Bei der Sondierung von Hochgeschwindigkeitssignalen können Sie einen temporären Masseschluss in der Nähe der Spitze der Sonde verwenden, um die Schleifenfläche zu reduzieren. Hier ist ein guter Link , der Tipps dazu gibt.
Nur damit wir klar sind, die Plastiksteckbretter, wo Sie Drähte in Löcher schieben, sind die problematischen. Ich glaube nicht, dass die mit geätzten Platten diese Probleme haben.
Übrigens ist der dritte Screenshot ein klassisches überdämpftes Verhalten (Kante ist zu langsam), während der vierte ein klassisches unterdämpftes Verhalten ist (Kante zu schnell). Das Überschwingen der schnellen Flanke ist offensichtlich schlecht, aber die langsame Flanke ist auch schlecht, weil sie zu viel Zeit in der Nähe der Schwellenspannung des Eingangs verbringt und eine kleine Menge an zusätzlichem Rauschen zu Störungen im Ausgang des Eingangspuffers führt. Schmitt-Trigger-Eingänge können dabei helfen, indem sie eine Hysterese hinzufügen, sind aber selten in PLDs oder MCUs integriert und helfen nur, wenn die Rauschspannung (Spitze-zu-Spitze) kleiner als die Hysteresespannung ist.
Ich habe mich hier gefunden, weil ich das gegenteilige Problem habe. Mein SPI funktioniert nicht, es sei denn, ich entferne einige der 220R-Widerstände, die ich in den MOSI-, CLK- und Aktivierungsleitungen habe. Das Phänomen des Klingelns kommt von einer LRC-Schaltung. Wenn R sehr niedrig ist und die L- und C-Reaktanzen dominieren, ist die Schaltung zu wenig gedämpft und es tritt ein Klingeln auf, wenn Sie einen Übergang von niedrig nach hoch haben. Parasiten auf Ihrer Schaltung, einschließlich der Leiterplattenspuren selbst, liefern L und C. Indem Sie den Wert von R auf 220R erhöhen, dämpfen Sie die Schaltung und das Klingeln verschwindet. Ich weiß nicht, was mein spezielles Problem ist

Antworten (2)

Beim Sondieren müssen Sie das Signal dort prüfen, wo es auf den Eingangsstift trifft, und sicherstellen, dass die Sondenmasse mit einer Masse in der Nähe dieses Stifts verbunden ist, damit kein Erdungssprung verborgen wird. Es sieht für mich so aus, als würden Sie am Ausgangsstift sondieren, der jedes Klingeln verbirgt.

Im ersten Diagramm sehe ich Spitzen an den Signalflanken. Dies sagt mir, dass Sie ein gewisses Überschwingen und möglicherweise ein potenzielles Klingeln haben. Darauf weist auch die Tatsache hin, dass ein 220-Ohm-Widerstand ihn fixiert hat.

Es gibt drei übliche Lösungen für dieses Problem.

Die erste Lösung besteht darin, eine Ferritperle in Reihe zu verwenden, um die Spitze zu dämpfen. Die Ferritperle sieht bei hohen Frequenzen wie ein großer Widerstand und bei niedrigen Frequenzen wie ein Kurzschluss aus. Es ist nicht dasselbe wie eine Induktivität (und eine Spitze bedeutet normalerweise, dass Sie mehr als genug Induktivität in Ihrer Leitung haben).

Die zweite Lösung besteht darin, einen Vorwiderstand wie Sie zu verwenden, aber typische Werte für diesen Widerstand liegen bei etwa 22 bis 50 Ohm, abhängig von der Impedanz der Übertragungsleitung, und der Widerstand muss am Quellenende (Treiberausgang) der Leitung platziert werden (normalerweise innerhalb von 0,2 Zoll, obwohl dies bei 62,5 kHz möglicherweise keinen Unterschied macht). Die Funktion dieses Widerstands besteht darin, die ansteigenden und abfallenden Flanken der Wellenform zu verlangsamen und ihre hochfrequenten Komponenten zu dämpfen. 220 Ohm scheinen mir zu viel Widerstand zu sein. Sie können auch eine Ferritperle (oder einen ähnlichen EMI-Filter) mit dem Widerstand verwenden, normalerweise wenn Ihre Leitung Teil eines Kabels ist.

Schließlich können Sie Ihren Treiber möglicherweise für eine langsamere Flankenrate programmieren (mehrere Nanosekunden statt ein oder zwei), obwohl dies immer noch eine ungewöhnliche Funktion ist. Dies ist tatsächlich die beste Lösung und reduziert obendrein die EMI erheblich.

+1 - Guter Punkt zur Begrenzung der Anstiegsgeschwindigkeit - IIRC von der letzten Frage war dies auf einem FPGA, daher ist es sehr wahrscheinlich, dass es eine Option geben wird, es für eine langsamere Anstiegszeit zu programmieren.
In der Hoffnung, dass MCU/DSP-Anbieter anfangen, die Anstiegsgeschwindigkeit in ihre Chips zu integrieren ...
Danke Mike. Dies ist auf einem CPLD und ich werde versuchen, die Anstiegs- / Abfallzeit zu reduzieren. Ich hoffe es ist möglich. Allerdings muss ich den Widerstand trotzdem einbeziehen. Dies liegt daran, dass ich den AVR über ISP programmiere und dieser auch die SPI-Leitungen nutzt. Der AVR ISP-Anwendungshinweis schlägt vor, einen kleinen Widerstand auf jede SPI-Leitung (außer SS) zu legen, da der AVR mkII sonst die MCU nicht programmieren kann. Ich beabsichtige, einen kleinen Header für den Programmierer auf der Platine einzubauen, daher wird dieser Widerstand auf jeden Fall erforderlich sein.
Okay, dafür benötigen Sie einen Widerstand von mindestens 1k oder so. Die Widerstände, die ich gegeben habe, werden zu stark sein, als dass der AVRisp sie fahren könnte. Sie möchten jedoch immer noch den Widerstand am Treiberende des Kabels oder einen Puffer am Empfangsende (also wäre es MISO-Ausgang -> 27 Ohm -> langes Kabel -> Puffereingang, dann Pufferausgang - > 1k bis 10k Widerstand -> ISP-Header -> MISO-Pin am AVR). Und Sie brauchen diesen Widerstand von 1k bis 10k nur auf Leitungen, die von anderen Geräten als dem AVR oder dem ISP angesteuert werden, was nur MISO ist, es sei denn, Sie haben andere SPI-Master im Bus.
Mike, wird ein 1K-Widerstand das Signal nicht stark verzögern? Und könnten Sie bitte die Puffer näher erläutern? Wenn ich mich richtig erinnere, hat ein Puffer eine sehr große Eingangsimpedanz und eine kleine Ausgangsimpedanz. Aber was ist die Funktion eines Puffers in dieser speziellen Anwendung?
Ich habe im Allgemeinen problemlos 10k-Widerstände verwendet, um das periphere MISO-Laufwerk zu schwächen, sodass der AVRisp gewinnt, aber das war auf derselben Platine, nicht mit langen Leitungen und mit einer Taktrate von etwa 100 kHz. Also ich sehe 1k nicht als Problem. Wenn Sie sicher sein wollen, berechnen Sie die Zeitkonstante (multiplizieren Sie die Summe der Serienwiderstände mit der Kapazität des Eingangspins; Kiloohm mal Picofarad ergibt Nanosekunden); Die Flankenzeit sollte weniger als zwei Zeitkonstanten betragen, also sehen Sie, ob das schnell genug ist.
Was den Puffer betrifft, so liegt das an der langen Schlange. Wenn Sie am Treiberende einer langen Leitung einen 10k-Widerstand haben, sieht es so aus, als würde die Leitung von einer 10k-Quellenimpedanz angesteuert, die ziemlich schwach und daher empfindlich gegenüber Störungen ist, normalerweise von benachbarten Signalen. Wenn Sie den Widerstand am Ende des Empfängers (Eingang) platzieren, kann es zu einer Reflexion kommen, obwohl dies möglicherweise kein großes Problem darstellt, wenn die Flugzeit auf dem Draht weniger als die Hälfte der Flankenzeit beträgt.
Der Puffer macht dies zu einem Problem; Die lange Leitung wird einen starken Antrieb haben, aber aufgrund des 27-Ohm-Quellwiderstands oder so nicht zu stark, während die Verbindung vom Puffer zum AVR-MISO-Pin kurz genug ist, dass ein 10k-Vorwiderstand keine Rolle spielt. Versuchen Sie es zuerst ohne den Puffer; dies ist möglicherweise kein Problem für Sie. Oh, und das Hinzufügen zu dem oben Gesagten: Die Kapazität des Steckbretts wird zur Kapazität des Eingangsstifts hinzugefügt; deswegen sind die dinger scheiße.

Ich bin mir nicht ganz sicher, wie es gelingt, sich vom ersten Signal zum zweiten so drastisch zu ändern (ich denke, das ist wahrscheinlich das, was Kevin gedacht hat), aber das wahrscheinlichste Problem klingt wie eine lange Leitung und ein Klingeln. Sie können auf der ersten Spur ein Klingeln sehen (fast 2 V auf einer 3,3-V-Leitung), das vielleicht mehr von einer Geschichte erzählt, wenn Sie die Zeitbasis reduzieren. Dies kann dazu führen, dass einige seltsame Dinge passieren, wie z. B. der Rx-Pin, der mehrere Übergänge aufnimmt - möglicherweise sogar mit anderen Spuren koppelt und dort Probleme verursacht.
Der Widerstand dämpft das Klingeln und repariert Dinge. Die Taktrate ist nicht das Problem, sondern die Anstiegszeit des Signals.
Sie könnten die Leitungen kürzen (falls dies eine Option ist), aber es ist sowieso eine gute Praxis, einen kleinen Vorwiderstand zu haben.

Ja, die Schlange ist ziemlich lang. Im Moment ist alles auf einem Steckbrett, aber ich werde in etwa zwei Wochen auf eine Leiterplatte umsteigen. Welche Widerstandswerte würdet ihr empfehlen? Ist dies das einzige, um das Klingeln zu beheben? Gibt es keine Möglichkeit, dies zu verhindern?
Wie lang ist die Linie? Das Steckbrett könnte zu Problemen beitragen, aber es ist schwer, anhand der Informationen genau zu sagen, was vor sich geht. Ich denke, es wird wahrscheinlich verschwinden, wenn Sie es auf die Platine legen, aber es ist trotzdem eine gute Idee, einen Vorwiderstand dort zu lassen (z. B. 20-200 Ohm). Haben Sie ein Google für Terminierung und Signalintegrität.
Ich sehe, Sie haben die Uhrzeile in den Bildern hinzugefügt - können Sie die Zeitbasis reduzieren und das auch posten? (dh den anfänglichen Anstieg des Signals "vergrößern", zB <1us/div) Es sollte jedes Klingeln viel detaillierter zeigen.
@OliGlasar Ich habe die reduzierten Zeitbasisbilder angehängt. Sie hatten Recht - viel Klingeln!