SD Card Modul kaputt?

Hallo,

ich werde bald blöde. Erst dachte ich mein Code wäre falsch, obwohl der Wochen vorher funktionierte, dann war ich mir sicher ein Kontaktproblem zu haben, was es nun scheinbar auch nicht ist.

Ich habe 3 Szenarien. Entweder wird die SD Karte richtig ausgelesen und angezeigt oder scheinbar richtig, weil die Daten nicht stimmen können, oder ich bekomme nur Fehlermeldungen.

Folgendes SD Kartenmodul habe ich: http://www.exp-tech.de/Shields/Itead-SD-MICRO-SD-Breakout.html

Wenn die Ausgabe stimmt, sieht es so aus.

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

Card type: SD1

Volume type is FAT32

Volume size (bytes): 120979456
Volume size (Kbytes): 118144
Volume size (Mbytes): 115

Files found on the card (name, date and size in bytes): 
DOGLCD~1/     2014-02-17 18:06:56
  DOGLCD~1.CPP  2014-02-20 01:25:54 7355
  DOGLCD~1.H    2014-03-03 19:14:22 9927
  KEYWORDS.TXT  2014-02-17 18:05:18 925
  EXAMPLES/     2014-02-17 18:07:02
    HELLOW~1/     2014-02-20 01:00:56

Wenn die Ausgabe nur scheinbar stimmt, sieht es so aus. Es ist immer noch die gleich 128MB Karte drin. Die Datei text.txt existiert überhaupt nicht.

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

Card type: SD2

Volume type is FAT32

Volume size (bytes): 1961811968
Volume size (Kbytes): 1915832
Volume size (Mbytes): 1870

Files found on the card (name, date and size in bytes): 
TEST.TXT      2000-01-01 01:00:00 115

und wenn nichts mehr geht, sieht es so

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

Card type: SD1
Could not find FAT16/FAT32 partition.
Make sure you've formatted the card

oder so aus

Initializing SD card...initialization failed. Things to check:
* is a card is inserted?
* Is your wiring correct?
* did you change the chipSelect pin to match your shield or module?

Mit dem Resettaster kann ich das meistens mehrfach wiederholen bis die serielle Ausgabe wechselt.

Ist das SD-Modul defekt oder was ich probieren um den Fehler zu finden?
Andere SD-Karten habe ich schon probiert. Gleiches Problem.

Der Code ist immer noch der Gleiche.

/*
  SD card test 
   
 This example shows how use the utility libraries on which the'
 SD library is based in order to get info about your SD card.
 Very useful for testing a card when you're not sure whether its working or not.
 	
 The circuit:
  * SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno und bei Mega2560 Pin 51 (DI)
 ** MISO - pin 12 on Arduino Uno und bei Mega2560 Pin 50 (DO)
 ** CLK  - pin 13 on Arduino Uno und bei Mega2560 Pin 52 (CLK)
 ** CS   - pin 26 frei gewählt Mega2560                  (CS)
 	   Pin 4 belegt mit Arduino WiFi/SD Shield

 
 created  28 Mar 2011
 by Limor Fried 
 modified 9 Apr 2012
 by Tom Igoe
 */
 // include the SD library:
#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
// bei nur einem Slave Device, µC ist Master, kann Pin auch 53 verwendet werden 
const int chipSelect = 26;    

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


  Serial.print("\nInitializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(53, OUTPUT);     // change this to 53 on a mega


  // 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 is 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) {
  }

http://forum.arduino.cc/index.php?topic=223080.0

Hallo,

der Verursacher ist gefunden. Das Problem damit jedoch noch nicht gelöst.
Auf meinem Mega 2560 steckt noch das Arduino Wifi Shield. Mit 2GB SD-Karte drin. Hatte ich völlig außer acht gelassen, weil nicht aktiv angesprochen. Deshalb auch manchmal die Ausgabe von einer Karte mit 1870MB Größe.

Allerdings spreche ich die wie gesagt überhaupt nicht an. Ich müßte ja Pin 4 ChipSelect dafür ansprechen. Macht der Sketch aber nicht. Jetzt dachte ich mir, wenn ich Pin 4 dauerhaft auf HIGH setze im setup() , funktioniert das Exp-Tech SD Modul. Macht aber auch nicht. Wenn ich die SD-Karte von WiFi Shield rausnehme, funktioniert das Exp-Tech SD Modul.

Die beiden komme sich irgendwie in die Quere. Warum?
Auf dem SPI Bus liegen doch alle Device drauf und nur mit CS wähle ich das gewünschte aus.

Hallo,
das kööönnte die SD-Lib sein. Es ist möglich, das die mit zwei SD-Interfaces
nicht klar kommen.
Funktioniert denn jedes für sich.
Also WiFi Shield ohne Exp-Tech SD Modul?
Exp-Tech SD Modul ohne WiFi Shield (demontiert, ohne Software dazu)?
Ein Exp-Tech SD Modul habe ich bei mir am Mega 2560 an
Pin 50, 51, 52 und 53 angeschlossen.
Gruß und Glück
Andreas

P.S.

CD - 31
CS - 53
D1 - 51
D0 - 50
CLK - 52
GND - GND
3v - n/a
5v - 5v

Hallo,

jedes für sich funktioniert. Das Exp-Tech Modul funktioniert auch sofort, wenn ich die micro SD-Karte aus dem Wifi-Shield entferne. Sobald die wieder drin steckt, funktioniert das Exp-Tech nur noch sporadisch. Obwohl ich immer nur das Exp-Tech Modul mittels ChipSelect Pin 26 anspreche. Selbst mit Pin 53 funktioniert es nur wenn die micro SD-Karte aus dem Wifi-Shield entfernt ist.

Gibt es noch andere, bessere, SD-Karten Librarys?

Da ich noch nicht genau weis ob das WiFi Shield später zum Einsatz kommt, wäre es schon schön wenn sich die beiden nicht in Quere kommen und alles funktionieren würde in Kombination. Ein DOGM Display auf dem SPI Bus kommt auch noch dazu. Das funktioniert einzeln. Habe ich jetzt noch nicht dazu genommen.

Ich meine, okay, selbst wenn das WiFi Shield zum Einsatz kommt, werde ich nicht zwei SD Karten verwenden. Wegen der besseren Handlichkeit würde ich immer das Exp-Tech mit großer SD Bauform bevorzugen. Nur wie kann sichergestellt werden das dann das Exp-Tech Modul stabil funktioniert? Ohne das das WiFi Shield dazwischen "funkt".

sdFat:
http://code.google.com/p/sdfatlib/

Die Arduino SD Lib ist eine Wrapper Klasse einer ziemlich alten sdFat Version. sdFat kann sehr viel mehr, aber die Syntax geht anders als die Arduino SD Lib mehr in Richtung Standard C++. Wobei man Dinge wie I/O Streams nicht unbedingt verwenden muss (ich verwende die nur für die Serial Ausgabe wo es wirklich schön ist). Auch die Fehler Behandlung ist nicht zwangsläufig nötig. Schau dir Beispiele dazu an. Da sind auch Test dabei, z.B. SdInfo und QuickStart

Ich würde einfach mal einen anderen Pin nehmen als Pin4. Ich bin mir nicht ganz sicher welche Rolle der spielt, aber die SD-Lib verlangt, dass er als Output gesetzt wird, auch wenn er garnicht verwendet wird. Vielleicht spricht die Lin den Pin immer automatisch mit an?

Hallo,
also SD-Lib´s wird es wohl mehrere geben. Es könnte auch daran liegen, dass Du
zwei verschiedene Kartentypen benutzt. Micro-SD und SD. Du könntest es auch
einmal mit anderen Karten probieren.
Ich hoffe es hilft:
http://mosquino.googlecode.com/hg/libraries/sdfatlib-mosquino/html/

http://macherzin.net/article47-Arduino-SD-Speicherkarten

http://mosquino.googlecode.com/hg/libraries/sdfatlib-mosquino/html/index.html

Gruß und Spaß dabei
Andreas

Hallo,

ich werde mal die SdFatLib probieren. Danke.

@Gunther:
Du meinst sicherlich Pin 26?
Pin 4 kann ich nicht ändern wenn das WiFi Shield gesteckt ist, denn dessen SD-Kartenslot damit fest verbunden.
Effekt ist, sobald keine Karte im Wifi Shield steckt funktioniert der Rest.

Das die 2 Kartentypen sich stören glaube ich nicht. Das ansprechen der beiden ist gleich.

Ich spreche weder das WiFi Shield noch dessen SD Karte gezielt an. Meine Überlegungen gehen noch weiter. Wenn ich das WiFi Shield nicht verwende ,also entferne, und würde den Pin 4 anderweitig als Eingang nutzen, würde doch die SD Lib wieder zicken machen? Irgendwas macht die doch mit Pin 4.

Naja, ich werde mal die andere probieren ...

Edit:
SdFatLib, was ist denn da alles drin? Ich komme damit nicht klar. SdInfo funktioniert nur mit der SD-Karte vom WiFi Shield. Also Pin 4. SS unverändert. Wenn ich "SS" auf "26" ändere oben im Sketch
const uint8_t SdChipSelect = SS;
dann kommen 2 Fehlermeldungen.

Edit 2:
Auch das Bsp. "AnalogLogger" funktioniert nur unverändert mit der SDKarte auf dem WiFi Shield.
Wenn ich "SS" ändere zu 26 erhalte ich wieder Fehlermelungen:
FreeRam: 6630
Type any character to start
Can't access SD card. Do not reformat.
SD errorCode: 0X4,0X30

Edit 3:
Okay, die SdFatLib funktioniert nur, wenn ich das WiFi Shield entferne. Ein einfaches entfernen der SD-Karte des WiFi Shields reicht nicht mehr aus. Das wäre ja noch dümmer wie mit der alten SDLib. Das ist irgendwie blöd.

Hallo,
so hätte man es gerne...

Serial.print("\nInitializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT); // change this to 53 on a mega

D.h. der HardwarePin SS liegt beim Mega an Pin 53.

"sobald keine Karte im Wifi Shield steckt"
Ist denn dort der CD-Pin aktiviert? Der meldet "Card in Slot". Den CS brauchst Du ja nur zum schreiben/lesen.
Gruß und Glück
Andreas

D.h. der HardwarePin SS liegt beim Mega an Pin 53.

Ja, aber den nutze ich nicht.

"sobald keine Karte im Wifi Shield steckt"
Ist denn dort der CD-Pin aktiviert? Der meldet "Card in Slot". Den CS brauchst Du ja nur zum schreiben/lesen.
Gruß und Glück
Andreas

Das der CD aktiv ist, davon gehe ich schwer aus. Karte wird ja erkannt.

Mein Problem bzw. Frage ist. Was macht die Lib (beide SD Libs) andauernd mit Pin 4? Der muß ja irgendwie ungewollt geschalten werden, obwohl ich den im Sketch nirgends eingesetzt habe.

Hallo,

"Das der CD aktiv ist, davon gehe ich schwer aus. Karte wird ja erkannt."
Das muss nicht so sein. Der CD ist nur ein Schalter, nicht mehr- und nicht
weniger. HIGH- wenn keine Karte, LOW- wenn Karte da.
Meine SD-Reader funktioniert mit und ohne Anschluss des CD.
Damit sagst Du dem Sketch das eine Karte im Slot steckt. Bei mir erscheint
dann auf dem Display "SD". Damit kannst DU z.B. prüfen lassen, ob eine
SD im Slot steckt- u.a. Das ist "Card Detect"

"CS" ist Chip Select oder SPI-SS Slave Select.

Wenn Du nun Dein Shield einmal in die Hand nehmen würdest, dann könntest Du
den "Pin 4" mal zurückverfolgen zum SD-Reader. So könnte man zweifelsfrei
feststellen, was für eine Aufgabe der hat.

Das ist doch ein WiFi-Shield das über SPi läuft. D.H. Du brauchst nur
6 Strippen, Spannung- und ein oder zwei Leitungen dazu für die SD.

Ziehe doch einemal das Shield, und schliesse es über das Steckbrett an.
Dann kannst Du auch mal mit den Pin´s "fummeln". Auch ohne "PIN 4".
Gruß und Spaß
Andreas

P.S.

also Dein "Pin 4" ist "chipSelect"
Der wird im Sketch festgelegt.

// 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
const int chipSelect = 4;

Wenn mich nicht alles täuscht, dann fragt die Lib den ab:

// This needs to be called to set up the connection to the SD card
// before other methods are used.
boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN);

der kann aber auch festgelegt werden:

Static Public Member Functions
static uint8_t begin (const uint16_t size, const uint8_t *macaddr, uint8_t csPin=8)

Wenn ich das richtig verstanden habe, dann kann die Lib nur einen SD-Reader
zur Zeit. D.h. wenn in Deinem Shield eine SD sitzt, dann funktioniert kein
anderer SD-Reader. Mehr wüßte ich auch nicht.
Gruß und Spaß
Andreas

Hallo,

das ist das Original Arduino WiFi Shield. Pin 4 ist ChipSelect für die SD-Karte darauf. Das ist so.

Ob CardDetect verschalten ist darauf weis ich nicht. Spielt aber doch gar keine Geige bei meinem Problem.
Wenn ich Pin 4 CS nicht anwähle, dann hat doch die SD-Karte auf dem WiFi Shield nicht dazwischen zu funken.

SkobyMobil:
Wenn ich das richtig verstanden habe, dann kann die Lib nur einen SD-Reader zur Zeit. D.h. wenn in Deinem Shield eine SD sitzt, dann funktioniert kein anderer SD-Reader. Mehr wüßte ich auch nicht.

Es geht natürlich nur ein Device zur gleichen Zeit. Aber sdFat kann auch mehrere Reader ansprechen. Dazu muss man SdFatConfig.h editieren und zwei Instanzen von SdFat erstellen.

Weiß aber auch nicht was hier schief läuft

Hallo,
"Wenn ich Pin 4 CS nicht anwähle, dann hat doch die SD-Karte auf dem WiFi Shield nicht dazwischen zu funken."

Da bin ich mir nicht so sicher…
Das Shield hat eine Firmware, der Arduino auch. Spannung an, die beiden
unterhalten sich- und dann?

Wenn Du die SD-Card auf dem Shield nicht benutzen möchtest, dann mußt
Du Pin 4 als OUTPUT deklarieren und auf HIGH setzen. Dann ist das Ding aus.
Den SS PIN vom externen SD-Reader legst Du dann beim Mega auf PIN 53.
Gruß und Glück
Andreas

Hallo,

so einfach ist das leider nicht.

Pin 4 auf High setzen hatte ich schon probiert. Siehe weiter oben. Das hilft weder bei der SD noch bei der SdFat Library. Was mich auf den Gedanken bringt das irgendwo in der Library Pin 4 angesprochen wird. Was nicht sein dürfte.

Mit der SD Library ist es ausreichend wenn keine micro SD Karte im WiFi Shield Slot steckt, dann funktioniert der externe SD Reader.

Die SdFat Library funktioniert nur, wenn das WiFi Shield nicht gesteckt ist. Wenn gesteckt, kann ich machen ich will, der externe SD Reader funktioniert nicht.

Das sind die aktuellen Erkenntnisse von gestern Abend.

Was ich z.Z. machen kann ist.
Mit SdFat Library.
Wifi Shield gesteckt und auf dessen microSD zugreifen. Ohne externen SD Reader. Funktioniert auch mit der SD Library.

Was auch noch geht. Der externe SD Reader darf angeschlossen sein, aber ohne eingesteckte Karte, sonst funktioniert die SdFat Library nicht mehr.

Oder mit SD Library. WiFi Shield gesteckt ohne eingelegte SD, mit externen SD-Reader und die SD Library nutzen.
Mit der SdFat Library funktioniert das nicht mehr.

Wie gesagt, ich möchte nur eine SD Karte nutze, möglichst die große auf den externen Reader. Das das WiFi Shield auch einen Kartenleser hat ist Zufall.

Habt Ihr ein WiFi Shield und externen SD Reader am laufen?

Sonst bleibt mir nichts anderes übrig als SD Library zu nutzen und nicht zu vergessen die micro SD herauszunehmen. Mit dem Risiko das die kleine Karte verloren geht.

Versteht der Programmierer der SD und SdFat deutsch? Für diese umfangreiche Problemschilderung reicht mein englisch nicht aus.

Ganz schön konfus das Szenario, geb ich zu.