SD MMC Probleme

Hallo Forum,

ich bin gerade dabei an einem Espuino zu bastlen, danke einmal für all die tollen Ressourcen und Infos die es hier gibt. Leider ist jetzt der Zeitpunkt gekommen wo ich anstehe und nicht mehr weiterweiß, daher hoffe ich, dass hier jemand eine Idee hat :).

Ich hab eine eigene Platine gemacht (hab mir da einiges von der mini 4-Layer + lolin 32 pro abgeschaut) und flashen, und ein Blink Sketch haben auch schon mal funktioniert, Neopixel leuchtet auch und Port Extender (mit SW Power) ebenfalls. Doch nun hänge ich, da ich einfach nicht auf die SD Karte zugreifen kann (und somit die Espuino Software noch nicht mal richtig testen konte :frowning: ).

Hardware:
SD Karte hängt an SW Power mit MOSI und SCK pulled up zu SW Power via 10k. Pins wie vorgegeben auf 14,15 und 2. (kein pull up auf 2/MISO).

SD Karten habe ich 4 probiert 2x32gb, 4gb und 2gb.

Software: Habe Espuino geflasht und danach auch die SD MMC examples von esp-idf. Bei eine 32gb karte kommt:

vfs_fat_sdmmc: mount_to_vfs failed (0xffffffff).

Im esp-idf example hab ich die karte formatieren lassen, dann kommen einige weitere fehler, bevor es dann erst recht nicht klappt:

sdmmc_cmd: sdmmc_erase_sectors: sdmmc_send_cmd (ERASE) returned 0x107
diskio_sdmmc: sdmmc_erase_sectors failed (263)
sdmmc_cmd: sdmmc_write_sectors_dma: sdmmc_send_cmd returned 0x107
diskio_sdmmc: sdmmc_write_blocks failed (263)
vfs_fat_sdmmc: mount_to_vfs failed (0xffffffff).

Die anderen Karten werfen manchmal 0x108 und 0x109 Fehler.

Ich habe die SD pin connection tests vom ESP_IDF example laufen lassen, die die pull ups checken sollten:

**** PIN recovery time ****
PIN 14 CLK  1307 cycles
PIN 15 CMD  43 cycles
PIN  2  D0  10029 cycles
**** PIN recovery time with weak pullup ****
PIN 14 CLK  44 cycles
PIN 15 CMD  44 cycles
PIN  2  D0  91 cycles

(Die cycles geben an wie viele cpu cycles es braucht bis der pin auf high geht (der weak pull ist per software))

Wenn eine SD Karte eingesteckt ist gehen die pins ohne weak pullup nie auf high (was vllt das problem ist, aber da weiß ich nicht mehr weiter).

So und jetzt bin ich an dem Punkt angekommen, wo ich nicht mehr weiter weiß (ist auch eines meiner ersten PCB projekte, also kann gut sein, dass ich da was verhaut habe…).

Ich bin für jeden Hinweis dankbar.

Grüße
Max

Hallo Max,
Die custom PCB macht die Fehlersuche ein wenig schwerer. Pinout auf dem Bild scheint richtig zu sein (so weit ich es verfolgen konnte). Meine Vermutung geht in die Richtung des Pull-Ups. Solche Fehler hatte ich, als ich mal den WPU von GPIO2 versehentlich gelöscht hatte.

Speziell der CLK scheint da eine sehr hohe cycle time zu haben → langsamer Anstieg → hochohmiger Pull-Up:

Deutet auch auf die Pull-Ups hin. Wenn die 3V3_SW sauber da ist, solltest du da 3,3V haben.

Ideen von mir :slight_smile:

  • Wiederstände mit Multimeter ausmessen, Lötstellen bei den Pull-Ups und dem ESP prüfen. Gesamtwiderstand von Pins am ESP-Modul (also nciht an der Lötstelle, sondern wirklich „oben“ auf dem Modul) zu 3V3_SW messen (sollte 10k ± ein paar zerquestschte sein).

  • Sind die 3V3_SW sauber auf +3,3V? Für ein Test kannst du mal die 3V3_SW mit der 3V3 brücken und schauen, ob der Fehler bestehen bleibt.

  • Hast du Zugriff auf ein Oszilloskop? Wenn ja, signalverlauf von CMD, SCLK und D0 messen

Ansonsten wird es leider schwer aus der Ferne den Fehler zu finden, vor allem ohne Schaltpan und nur mit einem Layoutausschnitt.

Hallo laszloh,

danke einmal für die Ideen :).

Hab die Wiederstände nochmal gemessen und sind 9.9k und 10k. Ich habe es auch schon überbrückt versucht (zB beim esp-idf example, da dort ja der port extender nicht dabei ist). Hab auch nochmall nachgemessen und 3V3_SW ist 3.29, gleich wie 3V3.

Ich habe auch einfach mal einen sketch gemacht der pin 14 und 15 als open drain definiert und dann auf high schaltet. in diesem fall liegen auch die 3.3v an.

Wenn ich allerdings messe während espuino versucht die SD zu mounten, liegen seh ich beim multimeter nur ca 1.4 V (aber ich weiß nicht wie aussagekräftig das ist, weil das ja ein digitales signal ist…).

Leider mangelt es mir hier aktuell noch an einem oszilloskop, das wäre natürlich das beste das damit mal anzuschauen.

Ich habe auch alles schon einmal mit einer zweiten Platine porbiert (ich löte den esp32 wrover selbst…) hab da aber genau die selben Ergebnisse/Probleme).

Ich hab mal mein kicad Projekt auf github geladen, vielleicht kann man da einen Fehler rauslesen (und hab auch mal hier die schematic und einen print vom PCB reingetan, weiß nur nicht wie hilfreich der ist, weil ich es nicht geschafft hab die net-names mit zu printen…)

main_board_schematics.pdf (321,6 KB)
main_board_pcb.pdf (175,0 KB)

Vielen Dank und Grüße,
Max

Hallo Max,

Hm, das ist echt blöd, Im Schaltplan sehe ich auf Anhieb nichts, was zu diesen offensichtlichen Fehlern führen könnte. Ich nehme an, Kurzschlüsse zwischen den Leitungen hast du schon gemessen, dass da keine sind? :wink:

Ich hab ein paar Schaltpläne für ESP32 + SDMMC mit unseren Plänen verglichen. Bei den Anderen ist SCLK nicht mit einem Pull-Up versehen. Kannst du mal versuchen, R25 zu entstücken?

Ist nur ein Schuss ins Blaue; bei meiner Lochrasterplatine ist der PU auf GPIO14/CLK auch bestückt und das funktioniert unauffällig.

Andere haben den Pull-Up auf CMD und D0 variieren müssen (zb auf 5k), wäre vielleicht auch eine Idee.

sidenote: Laut espressif sollten auch beim 1-bit Modus auf dem CMD, DAT0-DAT3 10k Pull-Ups sein. Ist aber mMn nicht das Problem hier.



Ein paar Vorschläge für dein nächstes Layout:

Lagenaufteilung

Wenn du 4 Lagen Layout machst, teile die Lagen folgendermaßen auf:

  1. Lage (Top): Signale
  2. Lage: GND
  3. Lage: Versorgung (also, VBUS, 3V3, 3V3_SW als Copper-Pours / dicke Leitungen)
  4. Lage (Bottom): Signale

Lage 2 und 3 kannst du tauschen, je nachdem ob du USB auf der Ober- oder Unterlage führst (Das USB Differential Pair braucht direkt drunter eine Masselage).

Wenn du die Versorgungen in einer Innelage als Copper Pours machst, ersparst du dir viele Lagensprünge und die Anbindung wird auch besser.
Als Beispiel, hier schneidet +3V3 und +3V3_SW alle Leitungen durch und zwingt dich zu einem Lagenwechsel + zerschneiden der GND Innenlagen:

Schirmung

Du hast relativ viel Platz auf der Leiterplatte, ziehe eine GND-Leitung ein, wenn du ein Signal mit starken Flanken (zB CLK oder WS2812 Steuersignal) parallel neben anderen Leitungen führst (hier beim MMC, aber auch zB bei SPI CLK von MISO/MOSI abschirmen):

ungeschirmt (potenziell Übersprechen zw CLK & MISO:


geschirmt:

GND

Mache auch auf der Ober- und Unterlage ein GND-Pour, welches du dann mittels Vias in die Hauptlage „tackerst“. Das hilft dir bei der Schirmung der Leitungen und für extra Kühlung von Bauteilen, die ein Heat-Slug haben.

Rechter Winkel

Bei Leitungen sind Winkel 90° oder Steilere Winkel nicht gut, das kann zu Unterätzung bei der Produktion führen.

Grüße,
Laszlo

2 „Gefällt mir“

Hi Laszlo,

danke für die ausführlichen Infos. Das mit dem Stack-Up da habe ich lange herumgetan und da dürfte es einige verschiedene Ansätze geben, was da am besten (bzgl einer VCC plane), aber ich werde es beim nächsten mal mit deinem aufbau versuchen (ist zumindest zum routen bedeutend einfacher…).

Leider konnte ich meine SD probleme mit 5k wiederstand und auch ohne nicht lösen. Interessanterweiße sind die cycles beim CLK immer gleich, also >10000 wenn die sd karte drin steckt und 1307 wenn sie nicht drin ist (egal ob 5k oder 10k). Ohne wiederstand ist es immer >10000. Ich habe auch mal versucht den kompletten trace vom CLK mit einem Kabel zu brücken, genau das selbe result 1307…

Ich werde es jetzt noch mit was ganz niedrigem probieren also ein paar 100 ohm, allerdings dürfte das Board generell probleme mit Datenleitungen haben, weil immer wieder geht die Verbindung zum Flashen nicht (A fatal error occurred: Failed to connect to ESP32: No serial data received.). Wenn das ganze dann ein paar stunden liegt, geht es wieder (laufen tut das board aber, nur die usb verbindung dürfte nicht klappen).

Bzgl den Pull-ups auf D0, das liegt halt auf IO2, was wiederum beim flashen LOW sein muss, daher weiß ich nicht wie ich das sinnvoll testen kann…

Ich werde Ende nächster Woche mal in einen makerspace schauen, ob ich ein oszilloskop dranhängen kann und mal schauen kann was da nicht klappt, aber falls noch jemand Ideen hat, freue ich mich natürlich :).

Danke nochmal und Grüße,
Max

Servus,
Interessant, ich hab bis heute nicht davon gehört, bei einer 4-Lagen Platine 2 Lagen für GND zu „opfern“. Hast du ein Link auf die Seite, würd mich interessieren, wie sie das Begründen? Weil das macht dir bei 4 Lagen das Leben extrem schwer.

Das ist sehr strange, bei mir habe ich folgende Werte bei dem Test:

Mit SD-Karte ohne PU an CLK:

**** PIN recovery time ****

PIN 14 CLK  670 cycles
PIN 15 CMD  43 cycles
PIN  2  D0  10029 cycles

**** PIN recovery time with weak pullup ****

PIN 14 CLK  44 cycles
PIN 15 CMD  44 cycles
PIN  2  D0  140 cycles

Der Wert >10000 zeigt an, dass die Messung ein Timeout hatte, kannst du messen, ob mit Karte ein Kurzschluss zwischen CLK und GND zu messen ist? Funktioniert die SD-Karte die du drin hast am PC?

Ich schaue mir gerade den SD-Karten Test von espressif genauer an. Kannst du die master Branch installieren und dort den test durchführen mit CONFIG_EXAMPLE_ENABLE_ADC_FEATURE aktiviert?
Dann solltest du mehr Ausgaben bekommen (Spannung mit und ohne WPU und Cross-Talk zwischen Leitungen).

Für ein den Test kannst du GPIO2 zB über einen bedrahteten ~10k Pull-Up auf 3V3_SW setzten und zum Flashen den Pull-Up abheben (oder den Pin über einen Jumper auf GND ziehen). Dürfte aber nicht das Problem sein, bei meinem Board ist auch kein PU an D0 dran.

Mir gehen dann langsam die Ideen aus :slight_smile: Gute Fotos der Lötstellen am ESP und um die SD-Karten Halter wären auch gut. Vielleicht sieht da man was.
Gruß,
Laszlo

1 „Gefällt mir“

Ich glaube zwei Layer GND macht man in einer Platine mit vier Layern nur, wenn man sagt „Eigentlich würden mir zwei Layer ja reichen, aber unter vier Layern fange ich gar nicht erst an“ :slight_smile:.

Ich mach’s bei mir so:
Signal
GND (komplett)
PWR (gemischt 3.3 V, 3.3 V switched)
Signal

Bei allen Layern sind Flächen mit GND aufgefüllt und über zahlreiche „Stitching Vias“ miteinander verbunden.

2 „Gefällt mir“

Hi Laszlo,

danke für deine Mühen :). Leider kann ich noch immer keinen Erfolg berichten…

(Ja SD Karten wurden am Computer formatiert, also die gehen alle…)

Also wenn ich das Beispiel laufen lasse, ohne SD-Karte:

**** PIN recovery time ****
PIN 14 CLK  1307 cycles
PIN 15 CMD  43 cycles
PIN  2  D0  10029 cycles
**** PIN recovery time with weak pullup ****
PIN 14 CLK  44 cycles
PIN 15 CMD  44 cycles
PIN  2  D0  91 cycles
**** PIN voltage levels ****
PIN 14 CLK  3.1V
PIN 15 CMD  3.1V
PIN  2  D0  2.8V
**** PIN voltage levels with weak pullup ****
PIN 14 CLK  3.1V
PIN 15 CMD  3.1V
PIN  2  D0  3.1V
**** PIN cross-talk ****
              CLK   CMD    D0   
PIN 14 CLK     --   3.1V  2.8V  
PIN 15 CMD    3.1V   --   2.8V  
PIN  2  D0    3.1V  3.1V   --   
**** PIN cross-talk with weak pullup ****
              CLK   CMD    D0   
PIN 14 CLK     --   3.1V  3.1V  
PIN 15 CMD    3.1V   --   3.1V  
PIN  2  D0    3.1V  3.1V   --

Mit SD Karte gibt es zwei Fälle (treten der selben Karte auf, und auch konstant bei den anderen Karten):

Fall 1: Fehler ist 0x108 (ESP_ERR_INVALID_RESPONSE):

**** PIN recovery time ****
PIN 14 CLK  10047 cycles
PIN 15 CMD  10029 cycles
PIN  2  D0  10029 cycles
**** PIN recovery time with weak pullup ****
PIN 14 CLK  10030 cycles
PIN 15 CMD  10030 cycles
PIN  2  D0  10029 cycles
**** PIN voltage levels ****
PIN 14 CLK  1.3V
PIN 15 CMD  1.3V
PIN  2  D0  1.0V
**** PIN voltage levels with weak pullup ****
PIN 14 CLK  1.3V
PIN 15 CMD  1.3V
PIN  2  D0  1.0V
**** PIN cross-talk ****
              CLK   CMD    D0   
PIN 14 CLK     --   1.3V  1.0V  
PIN 15 CMD    1.3V   --   1.0V  
PIN  2  D0    1.3V  1.3V   --   
**** PIN cross-talk with weak pullup ****
              CLK   CMD    D0   
PIN 14 CLK     --   1.3V  1.0V  
PIN 15 CMD    1.3V   --   1.0V  
PIN  2  D0    1.3V  1.3V   --

Fall 2: Fehler ist 0x109 (ESP_ERR_INVALID_RESPONSE):

**** PIN recovery time ****
PIN 14 CLK  10047 cycles
PIN 15 CMD  10029 cycles
PIN  2  D0  10029 cycles
**** PIN recovery time with weak pullup ****
PIN 14 CLK  44 cycles
PIN 15 CMD  44 cycles
PIN  2  D0  139 cycles
**** PIN voltage levels ****
PIN 14 CLK  2.3V
PIN 15 CMD  2.4V
PIN  2  D0  2.1V
**** PIN voltage levels with weak pullup ****
PIN 14 CLK  2.5V
PIN 15 CMD  2.5V
PIN  2  D0  2.2V
**** PIN cross-talk ****
              CLK   CMD    D0   
PIN 14 CLK     --   2.5V  2.2V  
PIN 15 CMD    2.5V   --   2.2V  
PIN  2  D0    2.5V  2.5V   --   
**** PIN cross-talk with weak pullup ****
              CLK   CMD    D0   
PIN 14 CLK     --   2.5V  2.3V  
PIN 15 CMD    2.6V   --   2.3V  
PIN  2  D0    2.6V  2.6V   --

So sorry für den vielen Konsolenoutput…

Ich hab auch noch einmal meinen Sketch laufen lassen mit 14 und 15 als OPEN_DRAIN und mit SD hab ich 1.25V, ohne SD 3.3V also dürfte die SD karte die Volt da runterziehen. Ich schließe daher auch nicht aus, dass ich einfach einen falschen Kartenadapter montiert habe (JLCPCB-Link). Beim Messen zwischen den einzelnen kontakten hab ich aber nichts seltsames gefunden (auch mit SD Karte) → soll heißen keine Verbindung auch nicht mit Wiederstandsmessung. (Außer die ersternen 10k zu 3V3_SW).

Fotos:
SD (von JLCPCB Assembly)

ESP (Selbst aufgelötet, besseres Foto hat leider nicht geklappt…)

Bzgl Stack:

Aber ja vermutlich ist es für diese Anwendung overkill sich das anzutun, hoffe aber doch, dass die SD Karten Sache nichts mit den Layern zu tun hat?

Aja, Data Pin Pull-up hat auch nichts geändert außer das ohne SD die cycles ohne weak pull-up jetzt auf 91 sind. (Mit SD ist es noch immer >10000).

Danke nochmal dafür, dass du dich da so für mich ins Zeug legst!

Grüße,
Max

Sorry wenn ich das so sagen muss, aber wie kannst du erwarten, dass das gescheit funktioniert, wenn das so gelötet ist?

Was dir auf jeden Fall fehlt, ist gescheites Lötzinn (respektive Lötpaste) und/oder gescheites Flussmittel.
Das gehört einmal mit gescheitem Lötzinn nachgelötet (das darf auch gerne Brücken geben), dann Flussmittel aufgetragen, im Anschluss mit einer hinreichend großen Lötspitze „abgezogen“ (etwaige Brücken werden dabei wieder entfernt) und zuletzt mit Iso gereinigt.

Edit: Der SD-Halter ist bisschen frickelig zu löten, da man insbesondere aufpassen muss, dass man zum Blech selbst keine Brücke macht. Man sieht auch nicht gut, ob das ordentlich gelötet ist, da die Pins so klein sind. Aber das ESP32-Modul kann man mit überschaubarem Aufwand wie aus dem Ei gepellt löten :slight_smile:.

3 „Gefällt mir“

Danke biologist!

Das war das Problem. Hätte gleich Bilder von meinem Lötstellen schicken sollen, war aber irgendwie der meinung dass wenn das Multimeter pipst es schon passen wird :facepalm:

Das mit dem Flussmittel nachher auftragen und abstreifen hat super funktioniert, hab aber die jlcpcb lötstelle von der SD Karte auch nochmal nachlöten müssen :(…

Vielen Dank! Und auch nochmal Danke an Laszlo, für deine Mühen, hab auf jeden Fall einiges gelernt!

Nagut dann schau ich mir mal das weitere Projekt an, freu mich schon drauf, wenn dann alles klappt und ich es herzeigen kann.

Grüße,
Max

1 „Gefällt mir“

Sehr cool!
Na dann viel Spaß weiterhin mit ESPuino :slight_smile: