SD Card hot swap - oder: wie merke ich dass die SD entfernt wurde? SOLVED!

Hallo,

ich habe da ein Problem, das ich gedanklich nicht auf die Reihe kriege.

Folgender Sachverhalt:
ich möchte, nicht immer, aber durch Menue auswählbar, Daten auf eine SD-Karte schreiben.
Das funktioniert auch alles ganz gut.

Aber: wenn ich die Karte im laufende Betrieb rausnehme, dann merkt der Arduino das nicht.
Wie kann ich prüfen, ob eine SD-Karte präsent ist?
Wenn ich SD.begin() nochmal ausführe bekomme ich einen Fehler, auch wenn die Karte steckt. Auch SD.exists hilft mir nicht weiter, weil diese Funktion ja nach einem Datei- oder Directorynamen verlangt.
Ich bräuchte einen Befehl der mir mitteilt, ob eine Karte steckt oder nicht.

Hat einer von euch eine Idee?

Grüße

Gunther

Wie wär's mit

boolean present = SD.exists("/");

Ansonsten solltest Du die Low-Level-Routinen verwenden, dort kannst Du direkt Kommandos an die SD-Karte schicken und CMD0 wäre dafür ein guter Kandidat.

Der SD-Slot hat 2 Kontakte: der erste kontrolliert ob der Schreibschutz (mechanischer Schieber auf der SD-Karte) gesetzt ist und der zweite ob eine Karte eingelegt ist. Kontrollier mal die Pins die am Slot nicht für den Datentransfer bzw Spannungsversorgung vorhanden sind.

grüße Uwe

Danke für die Hilfe.

Allerdings ist mir die SW-Lösung sympatischer, weil ich da meine Verdrahtung nicht ändern muß.

Ich werde es heute abend ausprobieren.

Aber zum besseren Verständnis:
Ist "SD.exists("/");" die Abfrage, ob ein Root Verzeichnis existiert?

Und was meinst du mit CMD0?

Wäre das dann sowas?:

 boolean present = cardCommand(CMD0, 0)) == R1_IDLE_STATE;

Grüße

Gunther

Du solltest die Datei nach jedem Schreiben schliessen, wenn du nur von Zeit zu Zeit schreibst und zwischendurch eventuell die Karte rausnimmst.

Beim SD.open("MYFILE.TXT", FILE_WRITE); solltest du einen Fehler kriegen, wenn keine Karte drin ist.

Danach SD.begin() jede Minute (oder häufiger, nach Geschmack) wiederholen, bis die Karte wieder drin ist.
Falls erforderlich, kann ich heute abend mal wühlen, was ich brauchte, damit SD.begin() nachträglich / mehrfach geht. Ich denke da war was ...

Wäre das dann sowas?:

boolean present = cardCommand(CMD0, 0)) == R1_IDLE_STATE;

Beinahe. cardCommand() ist eine Methode der Klasse Sd2Card. Du müsstest also die SD-Klasse umgehen und nur noch das Low-Level-API verwenden.

pylon:

Wäre das dann sowas?:

boolean present = cardCommand(CMD0, 0)) == R1_IDLE_STATE;

Beinahe. cardCommand() ist eine Methode der Klasse Sd2Card. Du müsstest also die SD-Klasse umgehen und nur noch das Low-Level-API verwenden.

:astonished:

tut mir leid, aber das ist mir zu hoch (oder besser zu tief, weil Low-Level! :))
was, bitteschön, ist eine Low-Level-API???

Nein, laß stecken, das geht einfach über meinen Horizont. Ich probiert heute abend mal das mit dem "SD.exists("/");" aus, ich melde mich wieder.

@michael_X: die Datei wird jedes mal geschlossen, klar.
Aber du hast recht, ich fange den Fehler des SD.open nicht ab... mmmh.
vielleicht reicht das ja schon.

Erstmal vielen Dank an alle, Ihr habt mir sehr weitergeholfen!

Grüße

Gunther

Sorry, aber es funktioniert nicht.

SD.exists("/") liefert immer 0. Aus wenn ich anstelle von "/" andere, aus DOS bekannte Verzeichniszeichen versuche: "*", "?", "\", ".", ".." etc.

auch wenn ich versuche die Fehler von SD.open auszuwerten passiert immer das gleiche:

wenn ich die Karte nach SD.begin rausziehe, dann kommt kein Fehler.

Und mit CMD0 kann ich leider nichts anfangen.

hat vielleicht noch einer eine Idee, wie ich das vorhandensein einer SD-Karte nach SD.begin abfragen kann?
@Uwe: die entsprechenden Pins sind auf meinem Breakoutboard nicht auf die Stiftleiste geführt. HW scheidet also leider aus. klar könnte ich noch ein Drähtchen anlöten, aber das muß doch auch mit SW möglich sein!

Ratschläge bitte verständlich halten. Ich habe zwar ein gutes Systemverständnis, bin aber nicht so der C-Crack.

Danke

Gunther

guntherb:
Aber: wenn ich die Karte im laufende Betrieb rausnehme, dann merkt der Arduino das nicht.
Wie kann ich prüfen, ob eine SD-Karte präsent ist?
Wenn ich SD.begin() nochmal ausführe bekomme ich einen Fehler, auch wenn die Karte steckt. Auch SD.exists hilft mir nicht weiter, weil diese Funktion ja nach einem Datei- oder Directorynamen verlangt.
Ich bräuchte einen Befehl der mir mitteilt, ob eine Karte steckt oder nicht.

Wie Du die SD-Library patchen mußt, damit SD.begin() mehrfach aufgerufen werden kann, kannst Du hier in Reply #11 nachlesen:
http://arduino.cc/forum/index.php/topic,46969.0.html

Vielleicht hilft's.

Richtig, jurs. Danke.
" Da war was ... " Schwache Erinnerungen sind nur unwesentlich besser als gar keine.

boolean SDClass::begin(uint8_t csPin) {
  /*

    Performs the initialisation required by the sdfatlib library.

    Return true if initialization succeeds, false otherwise.

   */
  if (root.isOpen()) root.close();      // allows repeated calls
  return card.init(SPI_HALF_SPEED, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);
}

Ich habe auch noch eine Funktion zugefügt, die den Volume-Namen der Karte liefert, daher war mir nur in Erinnerung, dass bei jedem IDE-Upgrade aufgepasst werden muss, dass nicht die original SD Library verwendet wird. Ausserdem ist es manchmal hilfreich zu wissen, ob card.init() oder volume.init() fehlschlägt...

Ich danke euch für die Hilfe!

Das klingt so, wie wenn es funktionieren könnte!
Ich werde es heute abend mal probieren.

Grüße

Gunther

Es funktioniert! :smiley: :smiley: :smiley: :smiley: :smiley:

ich habe in die SD.cpp wie oben die Zeile eingefügt,
dann in das Beispiel "CardInfo", das ja eine leere loop() hat,
in die loop die Abfrage gesetzt:

void loop(void) {  
  if (card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("SD Card gefunden!");
  }else {
    Serial.println("   Keine Karte im Slot!");
  }
  delay(1000);  
}

Und siehe da:

SD Card gefunden!
SD Card gefunden!
SD Card gefunden!
   Keine Karte im Slot!
   Keine Karte im Slot!
   Keine Karte im Slot!
SD Card gefunden!
SD Card gefunden!
SD Card gefunden!
SD Card gefunden!

Wenn ich die Karte ziehe, wird das erkannt, wenn ich sie wieder reinstecke auch.
Alles so, wie ich mir das gewünscht habe!

Vielen Dank an
Jurs und Michael,
möge das Karma immer mit euch sein!

Gunther