Ethernet Board initialisiert SD-Karte, findet aber keine Dateien

Hallo zusammen,

nach einiger Zeit des googeln's wende ich mich nun an Euch, weil ich einfach nicht mehr weiter weiß.

Eins kurz vorweg:
Ich habe einen Arduino Uno R3 und ein SainSmart W5100 Ethernet Board. Als Software benutzte ich Arduino 1.8.0.

Nun zu meinem Problem:
Das Board findet die SD-Karte, jedoch keine Dateien drauf. Wenn ich das Beispiel-Sketch SD -> "readwrite" ausführe, gibt mir das Board zurück:

Initializing SD card...initialization done.
error opening test.txt
error opening test.txt

Beispiel-Sketch SD -S "CardInfo" gibt mir zurück:

Initializing SD card...Wiring is correct and a card is present.

Card type: SD2

Volume type is FAT16

Volume size (bytes): 1965031424
Volume size (Kbytes): 1918976
Volume size (Mbytes): 1874

Files found on the card (name, date and size in bytes):

Hier bedenken, dass sehr wohl Dateien auf der SD sind, welche laut Skript angezeigt werden müssten :wink:

Wenn ich nun z.B. einen WebServer starten möchte, welcher die Dateien auf die SD schreiben/lesen soll, bekomme ich vergleichbare Ergebnisse zurück (z.B. index.htm not found).

Die SD-Karte ist eine 2GB SanDisk micro-SD, formatiert in FAT.

Hat dafür jemand eine Lösung?

Danke im Vorfeld!

Du schreibst, es sind sehr wohl Dateien auf der SD-Karte.
Aber welche ?

Und wie sieht dein verwendeter Sketch aus ?

Poste den bitte hier in Code-Tags.
Schaltfläche </> dazu bitte verwenden.

Habe einen Screenshot mit den Dateien angehängt.

Code von "readwrite" ist folgender:

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // nothing happens after setup
}

Von "CardInfo":

#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 4;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);


  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {

}

Sieht soweit alles ok aus....

Hast du mal versucht die Karte im PC neu zu formatieren und danach zu beschreiben ?

Evtl. ist die Datei defekt.

Ja, leider alles schon ausprobiert.
Neu formatiert, mal mit "Schnellformatierung" mal normal.

Habe mir dann auch mal das Tool "SDFormatter" heruntergeladen, da dies auch das ein oder andere Mal hier empfohlen wurde.

Hat leider auch keine Abhilfe gebracht :frowning:

Setze mal testweise vor die Zeile
"// re-open the file for reading:"
ein "delay(1000);" von 1 Sek.

Könnte helfen, sonst habe ich aktuell keine Idee.

Hat leider nicht funktioniert :sob:

flashtyper:
Hat dafür jemand eine Lösung?

Wenn ich mich nicht täusche, hatten wir hier vor ungefähr ca. sieben bis vierzehn Tagen genau dasselbe schon mal als "Neues Thema" von jemandem gestartet bekommen und darüber diskutiert. Hast Du den Thread gelesen?

So aus dem Kiopf heraus meine ich mich zu erinnern, dass er das Problem gelöst bekommen hat. Und zwar meines Erachtens nach durch immer wiederAusprobieren einer anderen SD-Karte, und irgendwann bei der vierten SD-Karte oder so, hatte er eine gefunden, mit der sowohl der CardInfo Sketch als auch der readwrite Beispielsketch funktionierte.

Was gerne im Setup vergessen wird:

pinMode(SS,OUTPUT);

Und ja, das muss gemacht werden, auch wenn Pin 10 beim UNO nicht an der SD Karte angeschossenen ist, sondern am Ethernet-Dingen.

Die Alternative:
SS auf INPUT lassen, aber dann dafür Sorge Tragen, dass es HIGH bleibt.
Denn, wird es zum Input Low, dann schaltet die SPI Hardware auf Slave Betrieb um.

Konnte den Fehler beheben! Weiß zwar nicht genau, wo jetzt der Fehler lag... aber nun gehts :slight_smile:

Ich habe mit einfach mal wahllos eine alte Arduino-Software heruntergeladen (Version 1.0.2). Und schon geht's.

Trotzdem vielen Dank für Eure Hilfe!

Ich hatte exakt gleiches Verhalten bei meiner Testkonstellation wie weiter oben beschrieben. Meine Karten enthielten alle Testdateien (alle im DOS Format 8.3 benannt). Es wurde aber, wenn die Karten überhaupt erkannt wurden, keine Dateien angezeigt von SDInfo.

Nachforschungen ergeben: Die aktuelle IDE 1.8.0 (aber auch die Vorgänger, angeblich so ab 1.6.9) haben Probleme mit SD-Karten-Management. Die begleitenden SD Bibliotheken enthalten "Verschlimmbesserungen"; laut einem Thread im engl.sprachigen Teil des Forums soll SD Bibliothek 1.09 funktionieren (mit IDE 1.8.0 wurde SD 1.10 installiert).

Bei mir hat der downgrade der SD-Bibliothek nicht funktioniert. Für ein neues Projekt brauche ich aber eine stabile SD-Karten-Funktion. Daher habe ich mit einigen Tests angefangen, da ich mit IDE 1.8.x zum Ziel kommen möchte.

Bei mir hat SDFormatter geholfen - trotz neuester IDE und SD-Bibliothek (SdFat hat leider auch mit der neuesten IDE nicht geklappt).

SDFormatter v4.0 wird sowieso empfohlen, wenn man eine SD-Karte formatieren will. Die Bordmittel aller gängigen OS (Windows, Mac und Linux) formatieren auf eigene Weise und halten sich nicht strikt an die Spezifikation der SDCard Organisation, die Herausgeber des SDFormatters ist.

Allerdings klappte es bei mir erst mit folgender Einstellung:

SDFormatter (Mac version 4.0) Option: Interoperability ON (bei Windows: (vermutlich) "Format Size Adjustment ON")
-> Achtung: Full Format nehmen; QuickFormat bringt nichts, da es nur die FAT-Tabelle löscht, das Basis-Format (die Struktur) aber nicht ändert.

Mit diesem Ansatz wurden dann alle Karten in voller Schönheit angezeigt (sowohl mit UNO/Ethernet-Shield, als auch mit Nano/SD-Modul).

In diesem thread teste ich weiter; dauert aber noch etwas mit neuen Tests, da ich aktuell nicht durchgängig die nötige Zeit habe.