Problem SD Karte initialisieren

Servus an alle da draußen!

Ich versuche grade das DK Data Logging Shield V1.0 mit meinem Arduino Uno zum laufen zu bringen. Hat vor zwei Wochen auch schon mal funktioniert aber jetzt will er meine SD-Karte nicht mehr erkennen. Wenn ich das Beispielprogramm ReadWrite aus der SD-Lib drauf spiele gibt er mir “Initializing SD card…initialization failed!” aus.

Das Shield habe einfach drauf gesteckt und im Sketch den CS auf Pin 10 gesetzt. SD Karte habe ich eben auch nochmal auf FAT32 formatiert. Die ist übrigens 16GB groß falls das was zur Sache tut der Hersteller ist Transcend.

Wie gesagt es hat schon funktioniert und ich verstehe nicht warum es plötzlich nicht mehr will.

Weiß evtl jemand woran das liegen könnte? Hab schon im Forum gesucht und google belästigt aber ich werde da nicht so richtig fündig.

MfG Pandawal

#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(10)) {
    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
}

Pandawal: SD Karte habe ich eben auch nochmal auf FAT32 formatiert. Die ist übrigens 16GB groß falls das was zur Sache tut der Hersteller ist Transcend.

Das Shield ist für SD-Karten normaler Göße,oder für MicroSD? Und die SD-Karte ist dabei eine MicroSD Karte, die Du "mit Adapter" "verwendest, und das kann man alles nicht sehen, weil Du zwar einen Herstellernamen schreibst, aber nichts von der Baugröße der Karte (MicroSD?), die Du verwendest und der Baugröße des Karteneinschubs auf dem Shield (normale SD?) und ob Du eventuell einen Kartenadapter vom MicroSD-aufSD verwendest.

In dem Fall könnten Kontaktprobleme mit dem SD-Kartenadapter vorliegen und Du probierst am besten zuerst mal einen anderen MicroSD-auf-SD Kartenadapter aus.

Das ist ne normale SD Karte die ich direkt in das Shield stecke.

Link zum Shield:

http://www.play-zone.ch/de/dk-data-logging-shield-v1-0.html

Einen Link zur SD Karte find ich jetzt grade nicht die hatte ich noch Zuhause bei mir rumliegen.

Pandawal: De hatte ich noch Zuhause bei mir rumliegen.

Und, hast Du bei der frischen FAT-Formatierung nur eine "Schnell-Formatierung" gemacht,bei der nur die FAT selbst gelöscht wird, oder hast Du die vollständige Formatierung durchgeführt, bei der die ganze Karte "Leergeschrieben" wird (und die viel länger als eine Schnellformatierung dauert?

Das Beispiel aus der SD-Lib CardInfo funktioniert und zeigt auch an das die Verkabelung richtig ist und die Initialisierung erfolgreich war.

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

Card type: SDHC

Volume type is FAT32

Volume size (bytes): 3168796672
Volume size (Kbytes): 3094528
Volume size (Mbytes): 3022

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

Hier der Sketch:

// include the SD library:
#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 = 10;

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) {

}

Habs eben mit der "großen" Formatierung probiert, der Fehler bleibt bestehen. Aber danke für den Tip.

Gruß Pandawal

Das Beispiel aus der SD-Lib CardInfo funktioniert [ ... ] Files found on the card (name, date and size in bytes):

Hier der Sketch:

Das interpretiere ich so, dass keine Dateien gefunden wurden. Wird wohl auch ok sein. Die Größe (ca. 3GB) ist allerdings etwas merkwürdig. Was sagt denn der PC nach dem Formatieren?

Nach dem Formatieren auf dem PC noch eine Datei auf dei Karte schreiben ( TEST.TXT ) und die SDCard ordentlich "auswerfen".

Wird diese Datei dann auch vom Beispielprogramm CardInfo aufgeführt? Falls ja, kann es nicht mehr viel sein...

Hallo,

ich habe auch so ein Problem. Dies ist der Code "ReadWrite"aus den Beispielen zur SD-Lib.
Ich habe eine SD-Card mit 512 MB und eine Micro-SD mit 2 GB im Adapter.
Die SD erkennt er nicht (“Initializing SD card…initialization failed!”), die Micro geht ohne Probleme.

Mit dem Code “ReadWrite” aus den SdFat-Beispielen geht es mit beiden Karten.
Im PC kann ich beide Karten lesen und schreiben.

Hat jemand eine Idee was da los ist?

/*
  SD card read/write SD-Lib

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

#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(SS)) {
    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
}

Der Netcop in mir sagt:

ich habe auch so ein Problem.

Ja!
Und das Problem, was ich hier sehe, nennt sich: “Thread hijacking”

combie: Der Netcop in mir sagt: Ja! Und das Problem, was ich hier sehe, nennt sich: "Thread hijacking"

Wenn du das so siehst... Ich sehe hier ein vergleichbares Arduino-Problem das durchaus mit dem Eröffnungsthread zu tun hat. Wenn nicht kläre mich bitte auf.

michael_x: Das interpretiere ich so, dass keine Dateien gefunden wurden. Wird wohl auch ok sein. Die Größe (ca. 3GB) ist allerdings etwas merkwürdig. Was sagt denn der PC nach dem Formatieren?

Nach dem Formatieren auf dem PC noch eine Datei auf dei Karte schreiben ( TEST.TXT ) und die SDCard ordentlich "auswerfen".

Wird diese Datei dann auch vom Beispielprogramm CardInfo aufgeführt? Falls ja, kann es nicht mehr viel sein...

Du hast recht das mit der Größe war mir garnicht aufgefallen in Windows werden 14,9 GB angezeigt durch den Sketch nur 3GB.

Hab das mit der Test.txt Datei probiert. Die Datei wird in der CardInfo nicht angezeigt.

Pandawal: Du hast recht das mit der Größe war mir garnicht aufgefallen in Windows werden 14,9 GB angezeigt durch den Sketch nur 3GB.

Windows dürfte Recht haben und der CardInfo Sketch dürfte sich verrechnen, und zwar aus folgendem Grund: Die Größe der Karte dürfte in entweder eine Variable vom Typ 'long' oder 'unsigned' long' gepackt werden, und das geht schief.

Der Datentyp 'long' reicht für numerische Zahlenwerte knapp über zwei Milliarden. Der Datentyp 'unsigned long' kann maximal bis knapp über vier Milliarden darstellen

D.h. bei Karten mit über 4GB haut das weder mit long noch mit unsigned long noch hin, und es würde bereits ein 64-Bit Integertyp benötigt werden, um die richtige Zahl an Bytes auf der Karte zu ermitteln.

Aber Dein Problem ist ja wohl momentan hauptsächlich, die Karte überhaupt zum Funktionieren zu bringen und nicht die Korrektur des CardInfo-Sketches bei der Ausgabe der Kartenkapazität von SD-Karten mit über 4GB Größe.

Deshalb würde ich Dir mal vorschlagen, das zu testen: Bevor Du SD.begin aufrufst, setze mal den SPI-Hardware-ChipSelect Pin auf OUTPUT, bevor Du SD.begin aufrufst. Beim UNO ist das Pin-10, aber wenn Du die vordefinierte Konstante SS (steht dann wohl für SlaveSelect) verwendest, funktioniert es auch auf anderen Boards, auf denen der SPI Hardware-Chipselect standardmäßig nicht Pin-10 ist.

Also diese CodeSequenz zur Initialisierung der SD-Karte:

Serial.print("Initializing SD card...");
pinMode(SS,OUTPUT);

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

Funktioniert die Karte dann? Oder immer noch nicht?

Die Karte funktioniert noch immer nicht.

Habe es mit

pinMode(SS,OUTPUT);

und

pinMode(10,OUTPUT);

probiert. Fehler bleibt der selbe.

jurs: Windows dürfte Recht haben und der CardInfo Sketch dürfte sich verrechnen, und zwar aus folgendem Grund: Die Größe der Karte dürfte in entweder eine Variable vom Typ 'long' oder 'unsigned' long' gepackt werden, und das geht schief.

Der Datentyp 'long' reicht für numerische Zahlenwerte knapp über zwei Milliarden. Der Datentyp 'unsigned long' kann maximal bis knapp über vier Milliarden darstellen

D.h. bei Karten mit über 4GB haut das weder mit long noch mit unsigned long noch hin, und es würde bereits ein 64-Bit Integertyp benötigt werden, um die richtige Zahl an Bytes auf der Karte zu ermitteln.

Das macht natürlich Sinn, da wäre ich aber im Leben nicht drauf gekommen.

Kann es sein dass das auch was mit dem Fehler bei der Initialisierung zu tun hat?

Frohe Weihnachten noch euch allen!

Der Weihnachtsmann hat mir ne neue SD Karte gebracht. 4GB und ein anderer Hersteller. Das Problem bleibt bestehen. Ich kommt hier einfach nicht weiter? Hat mir jemand nen Tip wie ich den Fehler finden kann?

Gruß Pandawal

Pandawal: Frohe Weihnachten noch euch allen!

Der Weihnachtsmann hat mir ne neue SD Karte gebracht. 4GB und ein anderer Hersteller. Das Problem bleibt bestehen. Ich kommt hier einfach nicht weiter? Hat mir jemand nen Tip wie ich den Fehler finden kann?

Tut mir leid, aber ich bin da ziemlich ratlos.

Also das Shield steckt weiterhin auf einem UNO Board, ja?

Dann versuche mal das:

Entferne Stromversorgung vom UNO und ziehe das Shield ein paarmal ab und stecke es wieder auf und probiere dann nochmal!

Es soll schon Fälle gegeben haben, dass bei Shields durch Lagerng die Pins so oxidiert waren, dass sie nicht auf Anhieb beim ersten Einstecken richtigen Kontakt gegeben haben.

Aber durch mehrfaches Ziehen und Neueinstecken haben sich dann die oxidierten Pins dann schließlich doch wieder soweit blank gerieben, dass dann eine Funktion gegeben war.

Keine Ahnung, aber bevor Du es so in den Müll schmeißt, mach den Versuch mit mehrmaligem Ziehen/Einstecken des Shields!

Viel Erfolg!

Verbinde mal deine SD Karte mit dem PC und gehe auf Einstellungen-> Freigabe -> Erweiterte Freigabe

Dort gib die SD-Karte frei und bei Berechtigungen den Vollzugriff aktivieren und dann probiere es noch einmal

LG

Hallo,
Probier mal…

#include <SPI.h>
#include <SD.h>
File myFile;
void setup()
{
  int x; Serial.begin(9600); 
  Serial.println("Init Display...");
 Serial.println("Init SD-Card...");
if(!SD.begin(4)) //cs-pin=4
  {
    Serial.println("failed");while(1);
  }
Serial.println("Open File...");
myFile = SD.open("test.txt", FILE_WRITE);
 if(myFile)
  {
    Serial.println("Writing...");
 myFile.println("This is a Test: ABC 123");
    myFile.close();
  }
  else
  {
    Serial.println("error");
}
  Serial.println("Open File...");
myFile = SD.open("test.txt");
  if(myFile)
  {
    Serial.println("Reading...");
 while(myFile.available())
    {
      uint8_t c;
      c = myFile.read();
      Serial.write(c);
}
    myFile.close();
  }
  else
  {
    Serial.println("error");
}
}
void loop(){}

auch das Beispiel SD/ ReadWrite sollte laufen

mfg Martin