Wie kann ich meinen Code vereinfachen?

SvenM:
Wo könnte noch ein Fehler liegen?

Hast Du jetzt noch andere Erweiterungen in den Sketch eingebaut?

Wenn nicht, sollte das Programm einerseits durch die Verwendung von Funktionen kleiner werden, andererseits steigt der Speicherbedarf im RAM auf dem Stack an, weil da Rücksprungadresse und Parameter im RAM abgelegt werden beim Funktionsaufruf. Wenn der Speicher schon vorher bis zum Anschlag ausgereizt war, können die vier Bytes für den Stack natürlich der Tropfen sein, der das Fass zum Überlaufen bringt.

Andererseits könnte es sein, dass die Initialisierung nur scheinbar nicht läuft, weil das Programm nach dem Serial.println weiterläuft und es auch dann abstürzen kann, bevor die Zeichen über die serielle Schnittstelle eintrudeln. Die serielle Schnittstelle ist nämlich lahm. Probiere mal ein delay hinter der Karteninitialisierung:

Serial.print("Starting SD..");
if(!SD.begin(4)) Serial.println("failed");
else Serial.println("ok");
delay(3000);

Macht das einen Unterschied und Du siehst entweder "failed" oder "ok"?