Board-to-Board-Kommunikation über kurze Distanzen

Meine MCU betreibt einen SPI-Bus mit etwa 4 Geräten. Ich möchte diesen Bus auch außerhalb des Boards erweitern, dh einige PCBs mit dem "Main" Board verbinden und die Funktionalität erweitern. Der Abstand "Pad zu Pad" wäre:

Leiterbahnlänge Hauptplatine + Kabellänge + Leiterbahnlänge auf der Erweiterungsplatine

3" + 6" + 3" = ungefähr 12"

Selbst ein 1-MHz-Signal mit ca. 7 ns Anstiegszeiten über diese Entfernung über ein Flachbandkabel war meiner Erfahrung nach um über 1 V überschwingend (aber es gab kein übermäßiges Klingeln). Die Platinen werden von der gleichen Stromversorgung versorgt.

Geben Sie hier die Bildbeschreibung ein

Hinweis: Sie können die Anstiegszeiten hier nicht sehen, aber Sie können das übermäßige Überschwingen sehen - dies ist ein 3,3-V-Signal. Und ja, dies wurde korrekt mit einem sehr kurzen Draht von der Sonde zur Masse gemessen. Ähnlich wie es oft auf dieser Seite empfohlen wird. Ich glaube nicht, dass es ein Messfehler ist.

Ich möchte, dass das System mit 4 MHz arbeitet, aber 2 MHz sind auch akzeptabel. Die max. Die Anzahl der Boards, die ich anschließen möchte, beträgt etwa 4, und dies würde den SPI-Bus auf etwa 12 Geräte erweitern. Ich denke nicht, dass dies zu schwierig wäre, dies über Code zu verwalten, da ich bereits etwas habe, das so funktioniert. Die zusätzlichen Slave-Select-Leitungen sind ebenfalls kein Problem.

Meine Sorge ist jedoch, wie man die SPI-Daten von einem Board zum anderen sendet. Soll ich einfach direkt SPI senden oder es an einem Ende in LVDS konvertieren und dann am anderen Ende wieder in SPI konvertieren?

Was ist Ihre Anstiegszeit?
@Kortuk Das habe ich ganz vergessen aufzulisten, sorry. Frage aktualisiert.
7 ns Anstiegszeit, das ist schreiend schnell.
Entschuldigung für zwei irrelevante Fragen..1. welches oszilloskop hast du verwendet? 2. Warum sind die Ringe so wichtig?

Antworten (4)

Die Faustregel besagt, dass Sie Übertragungsleitungseffekte berechnen müssen, wenn Ihre Verbindungslänge länger als 1/10 der Signalwellenlänge ist.

Geben Sie hier die Bildbeschreibung ein

Übertragungsleitungen verursachen Reflexionen, wenn sie eine plötzliche Änderung der Impedanz aufweisen. Das reflektierte Signal addiert sich zum Original, kann auf der Senderseite erneut reflektiert werden und so hin und her gehen. Das Ergebnis wird in der Grafik angezeigt: das Überschwingen, von dem Sie sprechen, und ein gewisses Klingeln.

Eine Kabellänge von 12 Zoll (30 cm) ist 1/10 einer Wellenlänge von 3 m oder 100 MHz. 1 MHz und sogar 4 MHz sollten hier keine großen Probleme bereiten. Das Terminieren der Leitung, wie Wouter sagt, könnte jedoch eine erste Maßnahme sein Der Eingang ist wahrscheinlich hochohmig, und das ist nie eine gute Anpassung.Da Sie drei verschiedene Teile in Ihrer Verbindung haben (PCB, Draht, PCB), wird es schwierig sein, die charakteristische Impedanz zu finden.(Es wird auch für die Leiterplatte und den Draht unterschiedlich sein, Bei sehr hohen Frequenzen würden Sie also auch Reflexionen an den Kabelanschlüssen bekommen.) Angesichts der kurzen Länge und der niedrigen Frequenz ist der Wert Ihres Abschlusswiderstands nicht kritisch. 100 Ω möglicherweise zu niedrig für den Mikrocontroller, die meisten von ihnen können keine 33 mA (oder sogar 50 mA bei 5 V) liefern. Ich würde es mit 1k versuchen Ω Widerstand zu beginnen, und sehen, wie weit uns das bringt.

bearbeiten (
zu Frageaktualisierung) Die Anstiegszeit scheint 7 ns zu sein. Das ist schnell, wie Kortuk sagt, es bedeutet, dass Sie ein Spektrum von mindestens 400 MHz haben, und diese Oberwellen werden tatsächlich Übertragungsleitungseffekte erleiden, selbst wenn Ihr Takt nur 1 MHz beträgt. Versuchen Sie, sie herauszufiltern, eine Bandbreite von 20 MHz (80 MHz für den 4-MHz-Takt) gibt Ihnen mehr als genug Anstiegszeit. Dies ist eine 1-MHz-Rechteckwelle, die mit einem Ziegelwand - LPF bei 20 MHz gefiltert wird:

Geben Sie hier die Bildbeschreibung ein

Durch Platzieren eines Vorwiderstands wird mit der Kapazität der Leitung ein LPF erster Ordnung gebildet. Wenn wir das dann auf 50 pF schätzen

R = 1 2 π 100 M H z 50 p F = 32 Ω

gibt Ihnen eine Grenzfrequenz von 100 MHz. Also eine 33 Ω Vorwiderstand sollte Ihre Anstiegszeit verkürzen, aber mehr als genug übrig lassen, um ein gutes Signal bei 4 MHz zu haben.

Die 1MHz-Frequenz ist irrelevant. Es ist die Anstiegszeit, die wichtig ist.
@stevenvh, Versucht, am Ziel einen 1K-Widerstand zur Masse hinzuzufügen. Es half bei den Spikes, senkte aber auch den Signalpegel etwas. Ist das normal? Wenn ich den Pegel sage, bei dem sich das Signal einpendelt. Auch 500 Ohm probiert, 220 Ohm gleicher Effekt aber ausgeprägter.
@Saad - Wie viel ist ein bisschen? 3,3 V in 1 k sind nur 3 mA, der Treiber sollte das perfekt liefern können. Es kann einen gewissen Innenwiderstand haben, aber das sind einige zehn Ohm, daher sollte der Pegel nur um 2 oder 3% sinken.
@stevenvh Ich habe vergessen, dass ich einen Vorwiderstand in der Leitung habe, also werde ich offensichtlich etwas Spannung ablassen. Wie dumm von mir! Allerdings half auch ein 180 Ohm Widerstand nicht viel. Es brachte das Überschwingen auf 4,5 V. Ich vermute, ich brauche einen viel geringeren Widerstand, aber dann muss ich mir Gedanken über die Stromaufnahme machen.
Sollte ich auch eine aktive Kündigung in Betracht ziehen? Die Verwendung eines niedrigen Widerstands erhöht die Stromanforderungen auf der gesamten Platine, und da der Bus ständig in Betrieb ist, erhöht sich der Stromverbrauch. Würde die Verwendung von Schottky-Dioden als Klemmen gut funktionieren?
@stevenvh wie kommst du auf 400MHz? AFAIK von Wikipedia BW=0.34/trise. Dies ergibt eine Bandbreite von 48 MHz. Was vermisse ich?

Für einen so kurzen Bus würde ich versuchen, einen kleinen Widerstand in Reihe mit irgendetwas zu schalten, das eine Leitung antreibt. Das ist nicht der theoretisch ideale Weg, die Übertragungsleitungstheorie zu berücksichtigen, aber ein pragmatischer Ansatz, von dem ich denke, dass er für Ihren Fall gut genug funktioniert. Versuchen Sie zunächst 47 Ω und sehen Sie, was das bewirkt. Wenn das hilft, aber nicht ganz genug ist, können Sie höher gehen, aber ich würde 120 Ω nicht überschreiten. Die Chancen stehen gut, dass Sie irgendwo in diesem Bereich einen Wert finden, der gut genug funktioniert.

Ich habe diesen Ansatz versucht, Olin. Ich habe einen 100-Ohm-Widerstand verwendet, der das Überschwingen um etwa 500 mV gesenkt und von 4,7 V auf 4,3 V gesenkt hat. Das ist immer noch ein Volt über 3,3 V! Die Anstiegszeit betrug dann 12 ns im Vergleich zu den anfänglichen 7.
Sieht so aus, als hätte ich meinen Widerstand berechnet, während Sie Ihre Antwort gepostet haben, Olin. Das tut mir leid
@OlinLathrop Ich habe den Serienwiderstand auf 330 Ohm erhöht und das Überschwingen auf 3,7 V gebracht. Ich bin sehr zufrieden damit. Die Anstiegszeit betrug 10 ns. Soll ich einfach dabei bleiben oder bei der nächsten Revision der Platine Abschlusswiderstände einbauen? Ich frage, weil Sie empfohlen haben, 120 Ohm nicht zu überschreiten.
@Saad: Ich war besorgt über die Auswirkungen anderer Lasten auf die Leitung und die Anfälligkeit für Rauschen. Wenn die Signale sauber sind und keine Gleichstromlasten (z. B. nur hochohmige CMOS-Eingänge) auf den Leitungen liegen, verwenden Sie die 300 Ohm.

AFAIK kann das Überschwingen durch ordnungsgemäße Terminierung beseitigt werden, wenn Ihr Treiber die Last fahren kann. Andernfalls reicht ein dediziertes Treiber-/Empfängerpaar wie LVDS oder vielleicht sogar RS485 sicherlich aus.

+1: Wir verwenden häufig LVDS, um SPI-Signale zu übertragen.

Ich hatte in der Vergangenheit ernsthafte Probleme beim Ausführen von SPI über Flachbandkabel, obwohl diese viel länger waren als das, was Sie beschreiben. Die Störfestigkeit wurde zu einem echten Problem, und beschädigte Befehle gelangten schließlich an meine Peripheriegeräte. Es reichte aus, um die CE-Störfestigkeitsprüfung nicht zu bestehen. Wenn Sie später in dieser Hinsicht auf Probleme stoßen, würde ich empfehlen, auf jeder Platine eine separate MCU zu platzieren und diese über CANbus zu verbinden.