Überlegungen zum SPI-Busabschluss

In meiner vorherigen Frage habe ich also nach der Verwendung des SPI-Busses über kurze Entfernungen für die Kommunikation von Platine zu Platine gefragt. Mir wurde empfohlen, Abschlusswiderstände auszuprobieren. Ich habe einen Widerstand in der Nähe des Ziels platziert (aber nicht genau dort, es war ein Abstand von 1 cm) und geerdet. (Da dies eine Platine ohne Abschlusswiderstands-Footprints war, musste ich improvisieren. Ich konnte den Widerstand nicht auf das Gerät löten, da es ein TQFP ist und empfindliche Stifte hat.)

Bei einigen grundlegenden Tests stellte ich fest, dass ein 1-kΩ-Widerstand das Überschwingen kaum reduzierte. 470 Ω und 180 Ω funktionierten besser. Je tiefer ich ging, desto besser funktionierte es. Bei 180 Ω war das Überschwingen etwa ein Volt oder etwas niedriger.

Jetzt kann ich leider nicht viel mehr herunterfahren, weil der Strom mehr ist, als meine MCU verarbeiten kann. Ich habe das Problem bei der aktuellen Revision der Platine behoben, indem ich einen 330-Ω-Widerstand in Reihe geschaltet habe. Dies brachte das Überschwingen auf 3,7 V und die Anstiegszeit war 10 oder 11 ns. Aber ich hätte wirklich gerne eine "richtige" Lösung bei der nächsten Revision. Meine Frequenzanforderungen bleiben gleich: 2 MHz, würde aber 4 MHz bevorzugen.

Also dachte ich, ich sollte hier fragen: Soll ich bei der nächsten Überarbeitung des Boards kräftige Puffer auf die Leitungen legen? Das Finden eines Puffers ist nicht wirklich ein Problem, aber die Stromaufnahme wird erheblich zunehmen - ich habe 8 Geräte am SPI, die terminiert werden müssen, und 3 Leitungen, die immer aktiv sind, gehen zu jedem. Ein Beispiel: SCK geht an alle 8 Geräte. Jedes Gerät hat beispielsweise einen 100-Ω-Abschlusswiderstand. Das ist also eine Stromaufnahme von 12 * 3,3/100 = 390 mA!

Was ist hier also der beste Rückgriff? Sollte ich mich für eine „aktive Terminierung“ entscheiden, indem ich Schottky-Dioden als Klemmen verwende?

BEARBEITEN: In Bezug auf die Leitungsimpedanz: Wie ich bereits erwähnt habe, sollen 4 externe Karten angeschlossen werden. Der Abstand von Pad zu Pad ist für alle gleich (12 Zoll). Es gibt jedoch auch Geräte auf derselben Platine wie die MCU – aber diese benötigen keine Abschlüsse – die Längen betragen etwa einen Zoll (oder weniger) und es gibt sehr wenig Überschwingen (300 mV). Die Spuren, die zu externen Platinen führen, sind ungefähr gleich lang und breit. Die 2. Schicht auf meinem Board ist eine ununterbrochene Grundebene.

Eine gängige Methode besteht darin, einen Reihenwiderstand zu platzieren, der der Leitungsimpedanz entspricht. Versuchen Sie so etwas wie eine serielle Terminierung von 50 Ohm. Es wäre hilfreich, wenn Sie Ihre Leiterbahnen und Verbindungen so gestalten würden, dass sie eine gewisse feste Impedanz haben. Probieren Sie jedoch niedrigere serielle Terminierungen aus und sehen Sie, was Sie finden. Er schlug eine Terminierung zur Erde von 32 Ohm vor, Sie können diese viel geringere Leistung, gut 3 dB weniger Leistung, tatsächlich erreichen, indem Sie 64 Ohm an die Stromschiene und 64 Ohm an die Erdungsschiene legen.
@Kortuk Ein 32-Ohm-Widerstand hat das Überschwingen leider nicht wesentlich reduziert. Der Fußabdruck war jedoch auch an der falschen Stelle (es sollte nie ein Terminator sein) und nicht an der Quelle, also könnte es daran liegen, dass ich mir nicht sicher bin. In Bezug auf die Leitungsimpedanz haben alle Leitungen ungefähr die gleiche Länge und Breite. Sie alle laufen über eine komplette Bodenebene, die sich auf der 2. Ebene befindet.
Die Serienterminierung befindet sich an der Quelle, wenn Sie sie an der Last platzieren, bewirkt sie nichts. Versuchen Sie, einen 50 Ohm direkt an Ihrer Quelle in Reihe zu schalten, um den Effekt zu sehen.
Sie können es sich wie von Stevenvh beschrieben vorstellen, da wirkt die gesamte Leitung als Kondensator und dieser Widerstand fungiert als R für einen Tiefpass, wenn Sie es sich als konzentriertes Modell vorstellen. Wenn Sie sich das Übertragungsleitungsmodell ansehen, bedeutet ein angepasster Widerstand dort, dass Sie die Hälfte des Amplitudenwellenwegs haben und dann, wenn er auf das andere Ende trifft und reflektiert wird, auf den vollen Wert stößt.

Antworten (5)

Über die Signalterminierung zu sprechen, ist wie das Öffnen einer Dose Würmer. Dies ist ein RIESIGES Thema, das sich nur schwer in ein paar hundert Wörtern zusammenfassen lässt. Deshalb werde ich nicht. Ich werde eine Menge Zeug aus dieser Antwort herauslassen. Aber ich will auch eine große Warnung aussprechen: Im Netz kursieren viele Fehlinformationen zum Thema Abschlusswiderstände. Tatsächlich würde ich sagen, dass das meiste, was im Netz zu finden ist, falsch oder irreführend ist. Eines Tages werde ich etwas Großes schreiben und es in meinem Blog posten, aber nicht heute.

Als Erstes ist zu beachten, dass der für Ihren Abschluss zu verwendende Widerstandswert mit Ihrer Leiterbahnimpedanz in Beziehung stehen muss. Meistens entspricht der Widerstandswert Ihrer Leiterbahnimpedanz. Wenn Sie nicht wissen, was die Leiterbahnimpedanz ist, sollten Sie es herausfinden. Es gibt viele Online-Impedanzrechner . Eine Google-Suche wird Dutzende weitere hervorbringen.

Die meisten PCB-Leiterbahnen haben eine Impedanz von 40 bis 120 Ohm, weshalb Sie festgestellt haben, dass ein 1k-Abschlusswiderstand fast nichts bewirkt und ein 100-Ohm-Widerstand viel besser ist.

Es gibt viele Arten der Terminierung, aber wir können sie grob in zwei Kategorien einteilen: Quell- und Endterminierung. Die Quellterminierung befindet sich am Treiber, die Endterminierung am fernen Ende. Innerhalb jeder Kategorie gibt es viele Arten der Kündigung. Jeder Typ eignet sich am besten für unterschiedliche Zwecke, wobei kein Typ für alles gut ist.

Ihre Terminierung, ein einzelner Widerstand gegen Masse am anderen Ende, ist eigentlich nicht sehr gut. Tatsächlich ist es falsch. Die Leute tun es, aber es ist nicht ideal. Idealerweise würde dieser Widerstand bei der Hälfte Ihrer Stromschiene an eine andere Stromschiene gehen. Wenn also die E / A-Spannung 3,3 V beträgt, geht dieser Widerstand nicht auf GND, sondern auf eine andere Stromschiene bei der Hälfte von 3,3 V (auch bekannt als 1,65 V). Der Spannungsregler für diese Schiene muss speziell sein, da er Strom liefern und senken muss, während die meisten Regler nur Strom liefern. Aufsichtsbehörden, die für diese Verwendung arbeiten, werden auf der ersten Seite des Datenblatts etwas über die Terminierung erwähnen.

Das große Problem bei den meisten Endabschlüssen ist, dass sie viel Strom verbrauchen. Es gibt einen Grund dafür, aber ich werde nicht darauf eingehen. Für die Verwendung mit niedrigem Strom müssen wir uns mit der Quellenterminierung befassen. Die einfachste und gebräuchlichste Form der Source-Terminierung ist ein einfacher Vorwiderstand am Ausgang des Treibers. Der Wert dieses Widerstands ist derselbe wie die Leiterbahnimpedanz.

Die Quellterminierung funktioniert anders als die Endterminierung, aber der Nettoeffekt ist derselbe. Es funktioniert, indem es Signalreflexionen kontrolliert und die Reflexionen nicht von vornherein verhindert. Aus diesem Grund funktioniert es nur, wenn ein Treiberausgang eine einzelne Last speist. Wenn mehrere Lasten vorhanden sind, sollte etwas anderes getan werden (z. B. die Verwendung von Endabschluss- oder mehreren Source-Abschlusswiderständen). Der große Vorteil der Quellterminierung besteht darin, dass sie Ihren Treiber nicht herunterlädt, wie dies bei der Endterminierung der Fall ist.

Ich habe bereits gesagt, dass sich Ihr Vorwiderstand für den Source-Abschluss am Treiber befinden muss und denselben Wert wie Ihre Leiterbahnimpedanz haben muss. Das war eine zu starke Vereinfachung. Dazu gibt es ein wichtiges Detail zu wissen. Die meisten Treiber haben einen gewissen Widerstand am Ausgang. Dieser Widerstand liegt normalerweise im Bereich von 10-30 Ohm. Die Summe des Ausgangswiderstands und Ihres Widerstands muss Ihrer Leiterbahnimpedanz entsprechen. Nehmen wir an, Ihre Spur hat 50 Ohm und Ihr Treiber hat 20 Ohm. In diesem Fall wäre Ihr Widerstand 30 Ohm, da 30 + 20 = 50. Wenn die Datenblätter nicht angeben, wie hoch die Ausgangsimpedanz / der Ausgangswiderstand des Treibers ist, können Sie davon ausgehen, dass er 20 Ohm beträgt. Sehen Sie sich dann die Signale auf der Leiterplatte an und prüfen Sie, ob sie angepasst werden müssen.

Eine weitere wichtige Sache: Wenn Sie diese Signale auf einem Oszilloskop betrachten, MÜSSEN Sie den Empfänger prüfen. Wenn Sie an einer anderen Stelle nachfragen, erhalten Sie wahrscheinlich eine verzerrte Wellenform und täuschen Sie vor, dass die Dinge schlimmer sind, als sie wirklich sind. Stellen Sie außerdem sicher, dass Ihr Erdungsclip so kurz wie möglich ist.

Fazit: Schalten Sie mit einem 33- bis 50-Ohm-Widerstand auf Source-Terminierung um, und Sie sollten in Ordnung sein. Es gelten die üblichen Vorbehalte.

David, vielen Dank für eine erschöpfende Antwort. All das ergab absolut Sinn, aber ich denke, es gibt eine weitere Komplikation in meinem System - die SPI-Leitungen gehen von einem Board zum anderen. Daher kann es schwierig sein, die Leitungsimpedanz abzuschätzen - das Signal legt etwa 3 Zoll auf der Hauptplatine zurück, durchläuft ein 6 Zoll-Flachbandkabel und wandert dann erneut entlang einer 3 Zoll-Spur, bis es sein Ziel erreicht. Die Drähte des Flachbandkabels sind abwechselnd Masse (wie SCK, GND, MOSI, GND usw.) Besteht Ihre 30-20 Ohm-Empfehlung noch?
@Saad Was ich in solchen Fällen getan habe (und ich habe das oft getan), ist, einen einzelnen Widerstand am Treiber zu verwenden und seinen Wert zu optimieren, sobald der Prototyp gebaut ist. Es ist ein Kompromiss, aber es funktioniert. Ich habe derzeit tatsächlich mehrere Systeme, die SPI über 1-Fuß-Kabel mit 3-6-Zoll-Leiterbahnen auf jeder Leiterplatte ausführen. Einige davon laufen mit 30 MHz! Ja, beginnen Sie mit 33 oder 47 Ohm und optimieren Sie von dort aus.
+1 bereits, aber ein Diagramm, das zeigt, wie ein Source-Abschluss (dh in Reihe, nicht von der Leitung zur Masse) angeschlossen wird, wäre sehr hilfreich.
Ihr Link für den Rechner funktioniert nicht mehr, FYI
Warum können Sie davon ausgehen, dass die Ausgangsimpedanz / der Ausgangswiderstand 20 Ohm beträgt?

Da Sie kurze Entfernungen zurücklegen, halte ich Abschlusswiderstände nicht für eine gute Idee. Wie Sie festgestellt haben, müssen sie ziemlich niedrig sein, um die Arbeit zu erledigen, und dann zieht die Leitung viel Strom und die Spannung wird um 2 gedämpft, wenn Sie die Leitung auch mit der gleichen Impedanz ansteuern.

Ihre Taktrate ist nicht allzu hoch, sodass die Frequenzen, die Sie benötigen, um selbst eine Bitrate von 4 MHz zu unterstützen, nicht diejenigen sind, die die Probleme verursachen. Das Problem ist, dass Sie schnelle Flanken haben, die die Leitungen antreiben, die Oberwellen im 100-MHz-Bereich haben, die die Probleme verursachen. Bei Ihren gewünschten Frequenzen haben Sie ein konzentriertes System, keine Übertragungsleitung. Das erleichtert die Sache erheblich.

Die Lösung besteht daher darin, die hohen Frequenzen zu dämpfen, die Sie nicht wirklich benötigen, aber die Probleme verursachen. Dies kann mit einem einfachen RC-Tiefpassfilter unmittelbar nach allem, was eine Leitung ansteuert, erfolgen. Dies ist zum Teil das, was die 330-Ω-Widerstände jetzt tun. Sie bilden mit der parasitären Kapazität der Leitung einen Tiefpass. Anscheinend ist das nicht ganz genug und/oder nicht vorhersehbar genug. Dies kann mit einer absichtlichen Kapazität auf jeder Leitung behoben werden.

Sie möchten den Bus mit 4 MHz betreiben, was bedeutet, dass das schnellste Signal, das er unterstützen muss, eine 4-MHz-Rechteckwelle ist. Das bedeutet, dass die Länge jeder Stufe 125 ns beträgt. Nehmen wir an, wir möchten, dass dies mindestens 4 Zeitkonstanten sind, was eine Einschwingzeit von 98 % impliziert. Das bedeutet, dass die maximale Zeitkonstante, die wir zulassen möchten, 31 ns beträgt. 31 ns / 330 Ω = 94 pF. Das ist die Gesamtbelastung der 330-Ω-Reihenwiderstände, die Sie benötigen, um die Zeitkonstante von 31 ns zu erhalten. Es wird immer eine parasitäre Kapazität geben, die Sie nicht vorhersagen können, also würde ich sehen, wie die Dinge mit 47 pF aussehen. Das lässt Raum für 10–20 pF versteckte Kapazität, ohne unsere maximal zulässige Zeitkonstante zu überschreiten.

Die Vorwiderstände sollten so nah wie möglich an allen Pins liegen, die den Bus treiben. Dies setzt voraus, dass alle anderen Pins auf dem Bus CMOS-Eingänge sind, wenn einer angesteuert wird. Für Leitungen, die immer nur von einem einzigen Pin angesteuert werden (wie die Taktleitung, die nur vom Master angesteuert wird), legen Sie die 47 pF so nah wie möglich nach dem Widerstand. Für Leitungen, die zu unterschiedlichen Zeiten von verschiedenen Pins angesteuert werden können (wie MISO), platzieren Sie die 47 pF irgendwo in der Nähe der Mitte aller Treiber. Jede Leitung erhält unabhängig von der Anzahl der Treiber nur einen einzigen 47-pF-Kondensator, aber es gibt einen Widerstand für jeden Treiber.

Die obigen Berechnungen sollen als guter Leitfaden für den Anfang dienen. Einige Parameter können nicht bekannt sein und werden daher im Voraus berücksichtigt. Beginnen Sie mit 330 Ω in Reihe und 47 pF gegen Erde, aber scheuen Sie sich nicht, die Dinge basierend auf real beobachteten Ergebnissen zu ändern.

Wenn kein Abschluss vorhanden ist und ein Signal von einer Quelle mit sehr niedriger Impedanz zu einem Empfänger mit sehr hoher Impedanz gesendet wird, springt das Signal wiederholt hin und her. Die Phase des Signals wird bei jedem Umlauf um 180 Grad gedreht.

Wenn man nicht möchte, dass Signale reflektiert werden, wenn sie das Ziel erreichen, kann man einen Endabschluss verwenden. Dadurch wird das Signal am Ziel sauber absorbiert, ohne reflektiert zu werden, aber viele gängige Implementierungen führen dazu, dass die Quelle eine erhebliche DC-Last sieht.

In vielen Fällen kann man ebenso praktisch brauchbare Ergebnisse erzielen, wenn man statt dessen einen Vorwiderstand an der Signalquelle einfügt. Wenn sich am anderen Ende der Leitung kein Empfänger befindet, wird das Signal reflektiert, wenn es dort ankommt, aber jede solche Reflexion wird von der Quelle absorbiert und nicht zurückreflektiert. Beachten Sie auch, dass der Source-Abschluss dem Gerät, das die Leitung ansteuert, keine DC-Last auferlegt.

Wenn eine Leitung ohne Terminierung mit einer niedrigen Impedanz angesteuert und mit einer hohen Impedanz empfangen wird, kann das empfangende Gerät eine Spannung sehen, die höher als die Treiberspannung ist (theoretisch bis zu doppelt so hoch wie die Spannung, wenn die Treiberimpedanz der Quelle hoch ist). Null und die Empfangsimpedanz ist unendlich). Wenn entweder die Quelle oder der Empfänger richtig terminiert ist, ist die empfangene Spannung nahezu gleich der Ansteuerspannung (wenn eine Quelle mit Nullimpedanz einen Empfänger mit richtiger Impedanz ansteuerte oder eine Quelle mit richtiger Impedanz einen Empfänger mit unendlicher Impedanz ansteuerte, Die empfangene Spannung entspricht der Treiberspannung). Wenn beide richtig terminiert sind, beträgt die Empfangsspannung die Hälfte der Treiberspannung.

Die Simulation hier demonstriert dies. Es enthält einen Impulsgenerator, der ungefähr 49 Mal pro Sekunde eine Impulskette erzeugt, zwei in Reihe geschaltete 5-ms-Verzögerungsleitungen (Umlaufzeit 1/50 Sekunde) und schaltbare Abschlusswiderstände an beiden Enden.

Die Schaltung enthält drei SPDT-Schalter; Klicken Sie auf eines, um seinen Zustand zu ändern. Die unteren beiden Schalter steuern die Quell- und Zielterminierung. Für diese steht "oben" für einen guten Abschluss und "unten" für einen schlechten. Der obere Schalter steuert, ob die Leitung von einem automatischen Impulsgenerator oder von einem manuellen Logikeingang angesteuert werden soll. Um manuell Impulse über die Leitung zu senden, schalten Sie den oberen Schalter "unten" und dann das "L" daneben.

Die Signale, die das Ziel erreichen, sind sauber, wenn entweder die Quelle oder das Ziel richtig terminiert ist. Wenn beide richtig terminiert sind, ist die empfangene Signalspannung die Hälfte der Treiberspannung. Wenn einer ordnungsgemäß abgeschlossen ist, der andere jedoch nicht, beträgt die empfangene Spannung etwa 91% der Ansteuerspannung (die "schlechten" Widerstände sind um den Faktor zehn "falsch" und können daher etwa (10/11) nicht absorbieren). der Energie). Wenn keiner abgeschlossen ist, beträgt die empfangene Spannung zunächst etwa das 1,656-fache der Treiberspannung, aber alle 20 ms treten seltsame Reflexionen auf.

Probieren Sie einen AC-Abschluss aus (z. B. einen 470-pF-Kondensator in Reihe mit einem 110-Ohm-Widerstand) und verbinden Sie diese Reihenkombination am Ausgang des SPI-Taktziels mit Masse. Der Abschluss zieht etwa 30 mA für die Länge der Flankenzeit, was er leicht tun kann, aber ansonsten keinen Strom. Bei der bidirektionalen Datenleitung wird es etwas kniffliger. Ich habe sowohl am Master- als auch am Slave-Ende der SPI-Datenleitung einen 470 pF, 220 Ohm AC-Abschluss angebracht, und das funktioniert, dh akzeptables Überschwingen und Unterschwingen.

Ich freue mich über Kommentare dazu.

Nicht zu tief ins Detail gehen, da die vorherigen Posts den Nagel auf den Kopf treffen. Es kommt darauf an, dass SPI unsymmetrische Leitungen sind. Selbst wenn Sie eine niedrige Taktfrequenz haben, müssen die schnellen ns-Taktflanken respektiert werden. In meinem Fall fand ich einen 470-Ohm-Widerstand in Reihe mit der SPI-CLK-Leitung auf der Master-Seite. Durch Entfernen dieses Widerstands und Implementieren der für unsymmetrische Leitungen empfohlenen Lösung von Lattice und der oben geposteten Vorschläge (ich konnte nur die Hälfte der Lösung von der Slave-Seite implementieren, habe die Filterkappen entsprechend angepasst) konnte ich die Länge meines SPI-Flachband-Kommunikationskabels verlängern von 10 cm bis 160 cm ohne Kommunikationsfehler:

Verbesserung der Störfestigkeit für serielle Schnittstellen : Ein Lattice Semiconductor White Paper (Juli 2014)

Bearbeiten: Der ursprüngliche Link ist nicht mehr gültig; das Dokument, auf das verwiesen wird, steht weiterhin hier von Lattice Semiconductor zum Download zur Verfügung .