Neustart schlägt fehl, abhängig von SD-Karte

Das Problem habe ich auch mit 2 Karten. Deswegen vermute ich, dass es nicht an der Spannung liegt, sondern, dass der Controller der Karte zu langsam ist oder sowas.
@biologist könnte man die Abfrage der Karte noch einmal wiederholen, wenn das Initialisieren fehl schlägt? Vielleicht würde sowas ja das Problem umgehen…

Versucht doch mal, ob es ein Delay von vielleicht 500 ms davor schon löst.

Ich kann es leider nicht mehr testen…irgendwie hatten die Karten Selbstheilungskräfte. Das Problem tritt bei mir nicht mehr auf.

Vielleicht ist die 3.3v Schiene doch grenzwertig und manchmal kann es dann am SD Slot zu eng werden - wenn das WLAN sich verbindet und vielleicht noch anderes läuft oder Steckkontakte nicht 100%ig sind (Vermutung)

Mit einem delay(4000) in setup() vor dem Aufruf von System_Init() klappt der Neustart fast immer. Mit weniger eher selten. Das ist jetzt kein sinnvoller Workaround, nur ein Testergebnis.
Es hätte wohl jede Stelle vor SdCard_Init() gereicht.
Eine Wartezeit in System_Restart() bringt nichts, da (falls überhaupt) die Spannung irgendwo in ESP.restart() abgeschaltet wird, was aber der letzte Aufruf in der Funktion ist.

Ich habe leider gerade kein funktionsfähiges Oszi, aber wenn beim Neustart SW_POWER3.3 abgeschaltet wird, dann nur so kurz, dass es mein Multimeter nicht bemerkt.
Daran ändert auch die lange Wartezeit nichts, die ich ja testweise eingebaut habe.
Die sehe ich allerdings sehr deutlich beim Einschalten, da bleibt SW_POWER3.3 nämlich weiter für 4 Sekunden bei 0,94V.
Also würde ich sagen, dass beim Neustart keine Spannung abgeschaltet wird, und das Problem mit der SD-Karte eher auf SDMMC.SCK oder dem SD-Karten-Protokoll allgemein zu suchen ist.

Hi @biologist
Das klingt doch ähnlich wie mein Problem.
Messe doch bitte mal mit dem Logiktester den Power_pin bei Reboot mit und ohne PE

Ich kann das überhaupt nicht nachvollziehen. Mit mini4L+FePo-Develboard habe ich drei Situationen mit Multimeter gemessen:
a) Aus dem Deepsleep heraus nur mit Akku
b) Aus dem Deepsleep heraus nur mit USB
c) Kaltstart => USB wird eingesteckt

In den Fällen a+b war die Spannung initial knapp über 0,8 V. Und sofort (wenige 100 ms) nach dem Einschalten sind da 3.3 V am Start.
Im Fall c dauert es ein klein wenig länger, aber auch hier ist es unter einer Sekunde.

Ich sehe allerdings gerade, dass keine Kopfhörerplatine angesteckt war. Ich glaube zwar nicht, dass das was ändert, aber ich erwähne es zur Vollständigkeit.

@compactflash Ja, ich weiß, ich wollte das für dich nochmal messen mit dem Oszi. Ich arbeite mit diesem ziemlich selten und brauche dann immer ne Weile, bis ich wieder gerafft habe, was ich wie alles einstellen muss :slight_smile:.

geht mir auch so , deshalb der Logiktester. Du musst den natürlich vor dem Einschalten an Spannung haben weil der lange zum booten braucht. Bei Reset passiert das aber auch.

Die 4 Sekunden Delay sind von mir wie beschrieben vor dem Aufruf von System_Init() zum Test eingefügt worden. Ohne das ist der Start natürlich auch bei mir sehr schnell.
Es zeigt nur, dass beim Neustart keine Spannung abgeschaltet wird.
Die 0,94V im ausgeschalteten Zustand kommen mir auch recht hoch vor, aber das hat bisher keine sichtbaren Probleme gemacht.

Gibt’s da einen speziellen Grund für, warum du das Delay dort einfügst? Eingefügt hätte ich es in SdCard_Init() ganz oben halt. Weil die Hypothese ist doch, dass der Zeitraum zwischen „Power On“ und SD-Initialisierung zu kurz ist. Dieses Problem behebst du ja nicht, wenn du das Delay viel früher einbaust.

Meine Hypothese war mehr, dass beim Neustart die Spannung zu kurz abgeschaltet wird und deswegen nicht weit genug abfällt, um dem SD-Karten-Controller einen Reset zu verpassen.
Deswegen wollte ich die Wartezeit zwischen Spannung aus und an verlängern.

Ich habe mir SW_POWER3.3 jetzt mal mit dem Oszi angesehen und da ist doch eine kurze Unterbrechung von 12,5 Millisekunden.
Die kommt sowohl beim Start:

als auch beim Neustart:

Beim Start fällt die Spannung langsamer ab, so dass die Zeit, die sie unter 2V bleibt, nur ca. 5 Millisekunden lang ist.
Beim Neustart geht das deutlich schneller und die Spannung liegt praktisch die ganzen 12,5 ms unter 2V.

Die 2V ist jetzt mal willkürlich von mir gewählt worden, aber da hören langsam auch sehr tolerante Bausteine auf, zu funktionieren.

Wo diese Spannungsunterbrechung herkommt, kann ich mir nicht erklären.

Es sieht so aus als ob bei Dir kurzzeitig die Spannung zusammenbricht.
Hast Du einen Neopixel dran? Wenn ja einmal abziehen oder die Starthelligkeit in der Weboberfläche auf Minimum schalten.

Ist die VIN Schiene stabil? Weil beim Einschalten von WiF zieht der ESP32 in Spitze 800mA. Hilft ein 1000uF Kondensator zwischen 5V & GND? Wie sieht danach Dein Spannungsdiagramm aus?

Ich habe Null(!) Probleme mit SD-Karte und alle möglichen Varianten hier…

Ja das ist das Problem, von dem @compactflash immer berichtet hat. Bei ihm erzeugt das mit dem LTC2954 jedoch Probleme, weil das als Ausschaltsignal gewertet wird.

Genau so ist das bei mir , es passiert egal welchen Pin ich als Power_Pin definiere, kein anderer Pin zeigt das Verhalten, zumindest mit 5-6verschiedenen ausprobiert. Es passiert mit einem Develboard ohne angeschlossene Peripherie . Es hat mal funktioniert , für mich ganz klar ein Softwareproblem und ich vermute das Problem liegt in Arduino > 1.06
Ich verwende keinen Portexpander.

Ich denke, ich habe die Ursache für die Unterbrechung gefunden:

Port_Init() ruft Port_WriteInitMaskForOutputChannels() um Pins am PCA9555 auf Ausgang zu stellen. Allerdings schreibt es vor dem Config-Register noch das Output-Register, und zwar auf 0. PE_IO1_7 ist LOW-aktiv, also geht SW_POWER3.3 an.

Soweit, so gut, auch wenn ich kein Freund von Seiteneffekten bin (Power_Init() tut ja dann nichts).

Jetzt kommt aber AudioPlayer_Init(), ruft AudioPlayer_SetupVolumeAndAmps() und möchte PA_EN auf HIGH setzen. Dazu ruft es Port_Write() auf. Port_Write() hat einen Cache (Port_ExpanderPortsOutputChannelStatus) für den aktuellen Stand der Outputregister, der pauschal mit 255 initialisiert ist, nicht mit dem Wert, den Port_WriteInitMaskForOutputChannels() gesetzt hat.
Damit werden jetzt die Bits im Outputregister wieder auf 1 gesetzt, außer dem für PA_EN, das bleibt auf 0.

Jetzt ist SW_POWER3.3 also wieder aus.

Und nun kommt Power_PeripheralOn(), das auch Port_Write() aufruft, und damit das Bit für PE_IO1_7 im Outputregister wieder auf 0 setzt und SW_POWER3.3 geht wieder an.

Ich werde es heute Nachmittag mal probieren, ob ich mit einem Fix für diese Geschichte mein Neustartproblem gelöst bekomme.

3 „Gefällt mir“

Ich habe bei meinen Karten mit Selbstheilung seltsamerweise das Gegenteil beobachtet. Mit Neopixelring starteten die zuverlässiger. Vielleicht haben die Kondensatoren auf dem Ring (vor jeder LED) die 3,3V soweit stabilisiert, dass die SD Karte besser gelesen werden kann. Ich hätte aber auch eher die andere Richtung erwartet

Hier mal mein Signalverlauf :

Die gelbe Kurve ist die 3,3V Versorgungsspannung , die blaue der Power_Pin

Das deckt sich mit deinem Messergebnis. Es passiert bei mir nach etwa 2 Sekunden. Das liegt daran weil ich die Spannung komplett ausschalte. Der ESP geht bei mir nie in deep sleep, sondern wird hart ausgeschaltet. Es gibt auch einen Brown out im Monitor . Deshalb benötigt der ESP etwas länger zum Booten.
Das Bild ist fast 2 Jahre alt und seitdem „kämpfe“ ich damit . Ich habe das Problem zwar umschifft bin aber trotzdem sehr gespannt woran es liegt. Ich hatte geschrieben es liegt an Arduino >1.06. Zeitgleich war aber auch die Einführung der Power.cpp. Das deaktivieren dieser hat aber nicht geholfen .

Hmm, die blaue Linie wird für ca. 250ms herunter gezogen und zwar wirklich auf 0V, wenn ich das richtig sehe. Bei mir sind es 12,5ms und es geht nur auf 1,5V herunter.
Wenn Deine Schaltung und insbesondere der Code in setup() anders als das von biologist ist, könnte es natürlich trotzdem das gleiche Problem sein.

Ich habe einen Pullrequest mit meinem Fix gestellt: fix wrong states on PE output pins (and SD-card failure on restart) by r-schmidt · Pull Request #278 · biologist79/ESPuino · GitHub

Damit klappt bei mir der Neustart zu 100%.
Wenn es auch bei Deinem Problem helfen sollte, würde es mich natürlich freuen.

3 „Gefällt mir“

Hallo,
das hilft bei meinem Problem nicht. Ich hatte es auch nicht erwartet weil die Änderungen für PE sind , den ich nicht verwende. Ich bin nicht gut in Code, versuche aber mal herauszufinden ob es ähnliches bei Verwendung ohne PE gibt.

Ja , das ist ein „echtes“ LOW, was mir den ON/Off Controller ausschaltet. Hier ist eine Info zum LTC2954 und hier das Problem.