Im Anhang befindet sich mein aktuelles Platinen-Layout für die
Verbindung zwischen STM32F7 und uSD-Slot. Leider funktioniert das Layout
bei einem SDMMC-Takt von 48 MHz nur mit einem konfigurierten Teiler von
1 (was m.W. einem effektiven Teiler von 3 entspricht) zuverlässig.
Die maximale Längendifferenz der Leitungen beträgt 4,3 mm.
Wieso erreicht das Layout keinen höheren Takt? Was würdet ihr an dem
Layout ändern? Ist die Verwendung von S-Schleifen OK? Ist die
unterschiedliche Platzierung der Widerstände OK?
Moin,
Ohne, dass ich jemals was mit einem STM32 gemacht haette: Ich wuerde
einen kleinen Widerstand (~22 Ohm) in die Clockleitung reinbauen und die
verschiedenen anderen Leitungen nicht ganz so dicht aufeinanderhocken
lassen. Da ist doch viel Platz, um die Leitungen nicht so dicht an dicht
zu verlegen.
Ein paar Block-Cs an der Versorgung werden wohl auch nicht schaden.
Gruss
WK
Ich sehe jede Menge Pullups aber keinen Abblock Kondensator an VDD.
Außerdem will man bei SD Karten die Stromversorgung unterbrechbar
gestalten - denn das ist die einzige Möglichkeit für einen Reset bei
Fehlern.
Peter schrieb:> bei einem SDMMC-Takt von 48 MHz nur mit einem konfigurierten Teiler von> 1 (was m.W. einem effektiven Teiler von 3 entspricht)
Ohne das Manual gelesen zu haben würde ich eher einen Teiler von 2 und
damit 24MHz vermuten. Oszi zum Ausmessen von SCLK vorhanden?
An welcher Stelle treten Probleme auf? SD Karten wollen ja erstmal mit
100-400kHz initialisiert werden, weil sie als Open Drain aus dem POR
kommen.
Ich sehe übrigens dem Layout nicht an ob SD oder SPI Protokoll gefahren
wird. SPI geht nur bis 25 MHz...
Lagenaufbau?
Warum kuscheln sich die Leitungen so aneinander?
CAP an der VCC der SD-Card fehlt.
VCC/GND-Leitungen: warum so dünn, wie schaut die Anbindung in den
anderen Lagen aus? Planes?
Jim M. schrieb:> Ich sehe jede Menge Pullups aber keinen Abblock Kondensator an VDD.
Guter Punkt, den habe ich tatsächlich nicht.
> Ohne das Manual gelesen zu haben würde ich eher einen Teiler von 2 und> damit 24MHz vermuten. Oszi zum Ausmessen von SCLK vorhanden?
Der Teiler läßt sich in 1er-Schritten setzen und steht jetzt auf 1, +2
wird automatisch gemacht.
> An welcher Stelle treten Probleme auf? SD Karten wollen ja erstmal mit> 100-400kHz initialisiert werden, weil sie als Open Drain aus dem POR> kommen.
Das macht alles der STM32. Das Problem ist, dass bei zu hohem Takt die
Karte nicht gemounted werden kann, d.h. f_mount() hängt ewig, weil keine
Antwort kommt.
> Ich sehe übrigens dem Layout nicht an ob SD oder SPI Protokoll gefahren> wird. SPI geht nur bis 25 MHz...
SD.
Peter schrieb:> Guter Punkt, den habe ich tatsächlich nicht.
Uaaaaa - dann bapp' doch mal provisorisch einen auf die Unterseite an
die Durchkontaktierungen.
Gruss
WK
Andi schrieb:> Lagenaufbau?>> Warum kuscheln sich die Leitungen so aneinander?
Da ist halt noch mehr Zeug auf der Platine. Ich habe das nur weg
gemacht, damit es nicht zu sehr verwirrt.
> CAP an der VCC der SD-Card fehlt.
Ja.
> VCC/GND-Leitungen: warum so dünn, wie schaut die Anbindung in den> anderen Lagen aus? Planes?
Ja, kann ich dicker machen. Die Leitungen zum STM32 kann ich wegen dem
nötigen Abstand zu anderen Leitungen nicht dicker machen, und ich habe
(fast) überall die gleiche Stärke verwendet.
Was meinst Du mit Anbindung an andere Lagen? Vdd und Vss sind in den
inneren Lagen, daher die Vias. Insgesamt sind es 4 Layer.
Peter schrieb:> Was meinst Du mit Anbindung an andere Lagen? Vdd und Vss sind in den> inneren Lagen, daher die Vias. Insgesamt sind es 4 Layer.
Warum fährst du dann mit der VDD Leitung erst einen halben km bevor du
mit einem Via abtauchst?
Peter schrieb:> Da ist halt noch mehr Zeug auf der Platine. Ich habe das nur weg> gemacht, damit es nicht zu sehr verwirrt.
Und die anderen kuscheln auch so lieb herum?
Zeig mal alle Leitungen...
Andi schrieb:> Warum fährst du dann mit der VDD Leitung erst einen halben km bevor du> mit einem Via abtauchst?
Weil da andere (Bus-)Leitung queren und ich erst da hinten ein Via rein
bekomme. Ist ja auch nicht wirklich ein Problem, oder?
Kein Schaltplan? ---> doof
kein vollstaendiges Layout --> doppelt doof
kein Oszi ohne Pigtail an die Clockleitung gehalten --> auch doof
keine vernuenftige Abblockung --> ganz doof
naehe der Leiterbahnen, eher unkritisch. Das sollte SPI schon abkoennen.
Ueber vernuenftigen Busabschluss nachdenken. Wenn du 48Mhz clockspeed
willst dann muss deine Schaltung fuer 300Mhz gut sein.
Olaf
Peter schrieb:> Da ist halt noch mehr Zeug auf der Platine. Ich habe das nur weg> gemacht, damit es nicht zu sehr verwirrt.
Mit anderen Worten: Das Bild ist völlig nutzlos.
Andi schrieb:> Und die anderen kuscheln auch so lieb herum?> Zeig mal alle Leitungen...
Wenn Du meinst, dass die weiter auseinander müssen, dann kann ich das
Layout natürlich dahingehend ändern.
Peter schrieb:> Bitte sehr ...
Diese Schlangenlinien sind völlig für die Katz. Das macht man
um wirklich hochfrequente Signale differentiell führen möchte
um deren +- Flanken nicht gegeneinander zu verschieben.
Also meiner Erfahrung nach ziehen SD-Karten bis 1A peak, ohne größere
Pufferkapazitäten gibt es je nach Karte Probleme.
Hast du mal andere Karten probiert? Welchem Standard folgt deiner Karte
oder soll sie folgen. Kannst du ein Timingproblem ausschließen?
Kannst du ein Oszillogramm von Clock vs. Daten machen? (Kurze Massefeder
oder besser active probe)
Wie sieht die Versorgungslage aus? Durchgehend oder Flickenteppich? Wie
sieht die Masselage aus? Liegt die Masselage direkt unter den
SDIO-Leitungen?
Für SDIO sind 50R mit 100mil Längentoleranz vorgesehen. Für Clock vs.
Daten+Cmd wird immer wieder die 2:1 Daumenregel für den Abstand genannt.
https://www.cypress.com/file/298691/download
Bei mir funktioniert ein STM32F407VG mit 33,6 MHz (mehr kann er dank
Silicon-Bug nicht) über eine wilde fliegende Verdrahtung mit einer
µSD-Karte. Ich halte ein Layout-Problem daher für unwahrscheinlich. Hast
du die Driver Strength (DSR Register) und den High Speed Mode (CMD6)
eingestellt?
und wird DMA verwendet? Meine Erfahrung mit dem Lesen/Schreiben der
Fifodaten war, das Polling zu langsam ist und Fifo over/underrun Fehler
auftraten. Mit DMA passiert das nicht.
OMG schrieb:> Diese Schlangenlinien sind völlig für die Katz. Das macht man> um wirklich hochfrequente Signale differentiell führen möchte> um deren +- Flanken nicht gegeneinander zu verschieben.
Die S-Linien sollen die Länge der Leiterbahn erhöhen, damit alle
ungefähr gleich lang sind.
Johannes S. schrieb:> und wird DMA verwendet? Meine Erfahrung mit dem Lesen/Schreiben der> Fifodaten war, das Polling zu langsam ist und Fifo over/underrun Fehler> auftraten. Mit DMA passiert das nicht.
Ja.
Niklas G. schrieb:> Hast> du die Driver Strength (DSR Register) und den High Speed Mode (CMD6)> eingestellt?
Das finde ich beides nicht in der Referenz. Die CMDs fangen erst bei
Nummer 23 an. Und ist DSR ein allgemeines oder ein SDMMC/SDIO-Register?
In CubeMX lassen sich nur wenige Dinge konfigurieren, dort habe ich
insb. HW Flow Control und Clock Power Save deaktiviert.
Test schrieb:> Hast du mal andere Karten probiert? Welchem Standard folgt deiner Karte> oder soll sie folgen. Kannst du ein Timingproblem ausschließen?
Ich habe drei verschiedene Karten ausprobiert, darunter eine Samsung
Pro, alle SDHC. Welchen Standard meinst Du?
> Kannst du ein Oszillogramm von Clock vs. Daten machen? (Kurze Massefeder> oder besser active probe)
Ja, kann aber ein wenig dauern.
> Wie sieht die Versorgungslage aus? Durchgehend oder Flickenteppich? Wie> sieht die Masselage aus? Liegt die Masselage direkt unter den> SDIO-Leitungen?
Durchgehend, und ja (wie auch Vdd).
Peter schrieb:> Das finde ich beides nicht in der Referenz.
Das DSR ist in Kapitel 6.5 der SD-Spezifikation zu finden. Das High
Speed Aktivieren in 4.3.10.3.
Peter schrieb:> Die CMDs fangen erst bei> Nummer 23 an.
Und wie initialisierst du dann deine Karte, so ganz ohne CMD8? :-D
Peter schrieb:> Und ist DSR ein allgemeines oder ein SDMMC/SDIO-Register?
Ein Register auf der SD-Karte natürlich.
Peter schrieb:> In CubeMX lassen sich nur wenige Dinge konfigurieren
Ich hab das selbst kodiert, kA wie das mit CubeMX geht.
Niklas G. schrieb:> Das DSR ist in Kapitel 6.5 der SD-Spezifikation zu finden. Das High> Speed Aktivieren in 4.3.10.3.> ...> Ich hab das selbst kodiert, kA wie das mit CubeMX geht.
Verstehe. Aber der ganze Kram wird ja von den STM32-Bibliotheken
gemacht. Ob gut oder schlecht weiß ich jetzt nicht, aber ich würde da
ungern rumfummeln.
Der Tipp mit dem Abblockkondensator, plus der anderen Hinweise, hilft
mir schon weiter.
Am Ende habe ich sowieso nur die Wahl zwischen 48 Mhz und 24 Mhz (oder
weniger), da die 48 Mhz aus anderen Gründen gesetzt sind.
Peter schrieb:> Die S-Linien sollen die Länge der Leiterbahn erhöhen, damit alle> ungefähr gleich lang sind.
Nicht einmal meine Aussage hast du verstanden. Es ist nicht
relevent dass die Leitungen nicht gleich lang sind.
Lass dir dein Leiterplatten-Layout auch von CubeMX generieren,
da kann wenigstens nichts schief gehen und du musst nicht
anfangen zu denken.
OMG schrieb:> Diese Schlangenlinien sind völlig für die Katz. Das macht man> um wirklich hochfrequente Signale differentiell führen möchte> um deren +- Flanken nicht gegeneinander zu verschieben.
Nö, das macht man auch bei single-ended Systemen. Nämlich immer genau
dann wenn Signale an einer Clock-Flanke übernommen und daher zu diesem
Zeitpunkt valide sein müssen.
Andi schrieb:> Nö, das macht man auch bei single-ended Systemen. Nämlich immer genau> dann wenn Signale an einer Clock-Flanke übernommen und daher zu diesem> Zeitpunkt valide sein müssen.
Nö. Denn wenn diese Datenübernahme flanken-empfindlich ist
dann ist der SPI Mode falsch eingestellt. Üblicherweise hat
man bei SPI etwa +- eine halbe bis eine Periode Zeit Daten
zu übernehmen.
So einen Schlängel-Käse hab ich bei SPI noch nie gesehen.
Das soll man bei 400MHz DDR machen aber nicht bei 48MHz SPI.
OMG schrieb:> So einen Schlängel-Käse hab ich bei SPI noch nie gesehen.
Das Problem bei deinen Aussage ist, dass du nicht sachlich argumentieren
kannst und zudem auch noch gerne andere anpöbelst. Vielleicht kommst du
wieder auf dieses Forum zurück, wenn du gelernt hast dich wie ein
Erwachsener zu benehmen.
Völlig egal ob es schlängelt oder nicht, es sollte in beiden Fällen
funktionieren. Wenn die Leitungen durch Schlängelungen ähnlich lang
werden sollte nichts schlechter werden.
Es wäre vielleicht gar nicht so verkehrt, die Leitungen etwas weiter
voneinander zu verlegen und im besten Fall noch gut angebundene
(Via-Zaun o.Ä.) GND-Leitungen dazwischen zu verlegen, auf jeden Fall um
die Clk rum. Das Nonplusultra wäre natürlich eine Verlegung auf einer
der inneren Lagen mit Abschirmung durch GND oben, unten und von den
Seiten. Ansonsten wäre es ggf. interessant, mit einem
Spektrumanalysator/SDR zu prüfen, ob der Bus bei 48 MHz Takt viel
aussendet - die in die Radiowellen gesteckte Energie steht dem Bus nicht
mehr zur Verfügung
OMG schrieb:> Andi schrieb:>> Nö, das macht man auch bei single-ended Systemen. Nämlich immer genau>> dann wenn Signale an einer Clock-Flanke übernommen und daher zu diesem>> Zeitpunkt valide sein müssen.>> Nö. Denn wenn diese Datenübernahme flanken-empfindlich ist> dann ist der SPI Mode falsch eingestellt. Üblicherweise hat> man bei SPI etwa +- eine halbe bis eine Periode Zeit Daten> zu übernehmen.
In deinem Originalposting hast du nichts von SPI geschrieben sondern
allgemein nur von differentiellen Leitungen. Und das war falsch, weil es
eben auch für synchrone parallele Busse gilt.
> So einen Schlängel-Käse hab ich bei SPI noch nie gesehen.>> Das soll man bei 400MHz DDR machen aber nicht bei 48MHz SPI.
Einspruch:
Bei DDR soll man es nicht machen, man muss.
Bei SPI kann man es durchaus machen, dient aber nicht der
Funktionalität.
Viktor B. schrieb:> und im besten Fall noch gut angebundene> (Via-Zaun o.Ä.) GND-Leitungen dazwischen zu verlegen, auf jeden Fall um> die Clk rum.> Das Nonplusultra wäre natürlich eine Verlegung auf einer> der inneren Lagen mit Abschirmung durch GND oben, unten und von den> Seiten.
Na geh, was soll das denn bringen, hallo ... SPI! ...?
Den Abstand der CLK zu den benachbarten Leitungen auf das 5-fache der
Leiterbahnbreite erhöhen und gut ist es.
Eine durchgehende GND-Plane darunter vorausgesetzt.
Ansonsten wäre es ggf. interessant, mit einem
> Spektrumanalysator/SDR zu prüfen, ob der Bus bei 48 MHz Takt viel> aussendet - die in die Radiowellen gesteckte Energie steht dem Bus nicht> mehr zur Verfügung
Andi schrieb:> Bei SPI kann man es durchaus machen, dient aber nicht der> Funktionalität.Andi schrieb:> Na geh, was soll das denn bringen, hallo ... SPI! ...?
Das ist kein SPI, sondern der SD-bus, manchmal auch fälschlich SDIO oder
SDMMC genannt.
Sorry beim vorigen Posting zu früh gesendet...
Viktor B. schrieb:> Ansonsten wäre es ggf. interessant, mit einem> Spektrumanalysator/SDR zu prüfen, ob der Bus bei 48 MHz Takt viel> aussendet - die in die Radiowellen gesteckte Energie steht dem Bus nicht> mehr zur Verfügung
Du übertreibst gerne? ;)
Einfach messen ob das was an den Signalen anliegt 'sauber' ist.
Mit echten Verlusten auf Grund von Abstrahlung ist nicht wirklich zu
rechnen. Wohl aber mit Über- und Unterschwingen an den Flanken -> das
sind in der Regel bei SPI&Co die störenden Faktoren dabei.
Niklas G. schrieb:> Also wenn das mit so einer Konstruktion bei 33 MHz klappt, klappt das> auch mit einem etwas krummen PCB-Layout...
Kann ich zustimmen. Etwas überspitzt würde ich sagen, dass bei 48 MHz so
ziemlich jede Anbindung der Karte funktionieren würde, selbst mit
Laborklemmen (zumindest für den Versuchsaufbau). Als wir mal ne
Krokoklemme am Spektrumanalysator vermessen haben, wurde deren Einfluss
auch erst ab ~200 MHz sichtbar ;)
Die fehlenden Pufferkondensatoren sehe ich kritischer, die
obligatorischen 100 nF und dann noch mindestens 20 uF dürfen es gerne
sein.
Wird während der Karteninitialisierung überhaupt irgendwas erkannt?
Zeile für Zeile durchsteppen im Debugmodus.
Verwendest du zufällig die HAL-Funktionen? Da gibt es in Kombination mit
alten SD-Karten (also SD V1.x und nicht SDHC) einen Bug. Siehe z.B.
hier:
https://community.st.com/s/question/0D50X0000AU3ZBFSQ3/there-is-still-a-bug-in-hal-sd-driver-code
Peter schrieb:> unterschiedliche Platzierung der Widerstände OK?
Bei "echten" HF-Signalen würde man die Widerstandspads wirklich direkt
auf die Leitung legen. In dem gezeigtem Layout gehen so kleine
Stichleitungen weg, das ist nicht optimal (bei wirklich hohen
Frequenzen). In deinem Fall aber egal
Chris schrieb:> Niklas G. schrieb:>> Also wenn das mit so einer Konstruktion bei 33 MHz klappt, klappt das>> auch mit einem etwas krummen PCB-Layout...>> Kann ich zustimmen.
Das ist mal eine Ansage, mit der ich etwas anfangen kann!
> Die fehlenden Pufferkondensatoren sehe ich kritischer, die> obligatorischen 100 nF und dann noch mindestens 20 uF dürfen es gerne> sein.
OK, wird gemacht.
> Wird während der Karteninitialisierung überhaupt irgendwas erkannt?> Zeile für Zeile durchsteppen im Debugmodus.
Kurz gesagt, es wird auf ein ACK gewartet, was nicht kommt.
> Verwendest du zufällig die HAL-Funktionen? Da gibt es in Kombination mit> alten SD-Karten (also SD V1.x und nicht SDHC) einen Bug.
Ja, ist aber SDHC.
> Bei "echten" HF-Signalen würde man die Widerstandspads wirklich direkt> auf die Leitung legen. In dem gezeigtem Layout gehen so kleine> Stichleitungen weg, das ist nicht optimal (bei wirklich hohen> Frequenzen). In deinem Fall aber egal
OK, danke.