Leonardo und SD Karte funktioniert nicht

Hallo,
der Übersicht halber habe ich wegen meinem SD Karten Problem hier einen neuen Trhead erstellt.

Nun zu meinem Problem.
Ich benutze eine NoName SD Modul welches folgende Ein- und Ausgänge hat.

  • GND
  • 5V
  • 3.3V
  • CS
  • MOSI
  • SCK
  • MISO

Auf dem Leonardo habe ich alles wie folgt verbunden:

MISO,MOSI,SCK, 5V und GND an die ICSP Schnittstelle. Habe auch nochmal alles kontrolliert ob die Belegung stimmt.
3.3V an den Power Pin neben reset und CS an PIN 10.

Nutzen tue ich folgendes Sketch:

/*
  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/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module. 
 		Pin 4 used here for consistency with other Arduino examples

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

Wenn ich meine SD Karte eingesteckt habe und das Sketch laufen lasse, passiert nichts.
Wenn ich die Karte heraus nehme bekomme ich folgende Meldung:

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?

Gleich nachdem setup im Sketch steht folgendes:

; // wait for serial port to connect. Needed for Leonardo only

Muss ich dort einen Zeitwert einstellen oder was hat die Zeile zu bedeuten?

P.S.: Ich habe bereits zwei unterschiedliche Karten getestet.

  1. Karte 1GB SanDisk
  2. Karte 8GB microSDHC über SD Adapter (beides von Panasonic)

Soweit ich das verstehe, bewirkt die while-Schleife in diesem Fall, dass der Arduino an diesem Punkt so lange wartet, bis ein Serial-Port erkannt wird.
Erst wenn ein Serial Port festgestellt wird, wird die Schleife beendet und das Programm kann zum nächsten Punkt gehen.

Gruß Reinhard

lerion:
3.3V an den Power Pin neben reset

Der 3.3V Pin ist bei den meisten Arduino-Boards nur für max. 50 mA ausgelegt, schaue bitte mal in die Boardbeschreibung Deines Boards, ob Du da tatsächlich minimum 100 mA aus 3.3V rausziehen darfst!

Ich schätze mal nicht. Und SD-Karten ziehen beim Zugriff bis zu 100 mA.

Wenn Dein Modul wahlweise eine Versorgung mit 5V oder 3.3V zuläßt, würde ich das Modul lieber mit 5V vom Arduino 5V Pin versorgen, aus dem sind 100 mA kein Problem.

Weiterhin prüfe mal die Formatierung Deiner SD-Karte, ob die wirklich FAT16 oder FAT32 formatiert ist und nicht mit einem anderen Dateisystem!

Das mit der Serial-Initialisierung ist vollkommen in Ordnung:
while (!Serial) ;
Damit wartet der Leonardo, bis die Serial tatsächlich bereit ist, bevor er im Programm weiter fortfährt. Für den Leonardo ist das erforderlich, für alle anderen Arduinos ist es egal ob es da steht.

Vertragen SD Karten 5V Signale an MOSI und SCLK ( und CS ) ?

Hallo,

ich glaube, die SD Karte arbeitet insgesamt mit 3,3 V. Beim ETH-Shield (nicht REV3) wurde das mit Spannungsteilern
realisiert. Habe ich mal nachgebaut, funktioniert bestens.

Gruss Kalli

michael_x:
Vertragen SD Karten 5V Signale an MOSI und SCLK ( und CS ) ?

Wenn er ein voll beschaltetes SD-Kartenmodul anstelle eines nackten Kartenschachtes verwendet, und das Modul eine wahlweise Versorgung des Moduls mit 5V anbietet, dann ist da (normalerweise) immer die gesamte Beschaltung drauf, die die Karte mit passenden Pegeln versorgt, vom Spannungsregler bis zum Level-Shifter.

Ich habe bisher schon versucht 3,3V und 5V, nur 3,3V und nur 5V.
Dazu das gleiche auch noch mal mit externem Netzteil, falls der Saft vom USB nicht reicht.
Leider alles ohne Erfolg.

lerion:
Ich habe bisher schon versucht 3,3V und 5V, nur 3,3V und nur 5V.

Bist Du sicher, dass Du die Stromversorgungsschaltung auf dem SD-Kartenmodul nicht gekillt hast, als Du das Modul gleichzeitig mit 3.3V und 5V versorgt hast? Ich bin mir nicht sicher, dass da eine Schutzschaltung gegen diese Fehlbeschaltung existiert.

Ich habe hier jedenfalls gerade ein vermutlich sehr ähnliches Modul, das ich mir mal bestellt hatte aber noch nie getestet habe, zusammen mit einem UNO kurz getestet.

5V vom UNO 5V-Pin angeschlossen, auch die übrigen Pins mit den passenden UNO Pins verbunden und Deinen Sketch rauskopiert und hochgeladen, das ist die Ausgabe im seriellen Monitor:

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

Card type: SD2

Volume type is FAT16

Volume size (bytes): 1975255040
Volume size (Kbytes): 1928960
Volume size (Mbytes): 1883

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

Der Sketch und diese Library findet zwar die enthaltenen Dateien auf der Karte nicht, aber die Dateien habe ich auch unter Windows draufkopiert bzw. mit der SDfat Library erstellt und das scheint nicht ganz kompatibel mit der SD-Library zu sein. Aber die 2GB-Karte wird korrekt erkannt, nur die Dateinamen fehlen beim Test.

Ich habe so ein chinesisches Modul, das hat einen 5V->3.3V Regler, einige Kondensatoren und 4*10k pullup - Widerstände.
Wenn ich z.B. am CLK-Pin 5V anlege, sehe ich diese 5V auch am CLK-Anschluss der Kartenhalterung (zumindest, wenn keine Karte drinsteckt).

Lt. dieser SanDisk SD Card - Beschreibung ist das, nach meinem Verständnis, aber ausserhalb der Spezifikation.

Die 10k Widerstände sind nur ein "halber" Level-Shifter, und erschweren sogar einen Widerstands-Spannungsteiler als LevelShift.
Aber eine kleine Diode "rückwärts" sollte das Signal auf LO = VF / HI = 3.3V reduzieren.

                   3.3V 
                   |
                  10k
                   |
5V Sig ---|<---o---+----  Card

Die VF der Diode bei 0.3mA sollte normalerweise deutlich unter 0.25*VDD ( s.S. 3-8 im o.a. Link ) liegen.
Das MISO (Card->Arduino) Signal sollte sicher gelesen werden können so wie es ist.

Aber bidirektionale LevelShifter sind natürlich auch möglich.

Braucht man das gar nicht? Was sind eure Erfahrungen?

Ein Nachtrag:
Hier wird das gleiche Modul (?) verkauft, mit dem Hinweis:

Note: The SD cards use 3.3 V signaling. Adequate precautions are necessary when using them in 5 V circuits.

Dort ist auch ein Link zu dem Schaltschema, der dem entspricht, was ich an meinem Modul gesehen habe.
Reden wir von demselben, häufig auf ebay zu findenden Modul ?

Was sind " adequate precautions " ? :wink:

Ja, so ähnlich sieht das Modul aus. Ich habe wahrscheinlich ein verbessertes Modell mit 7x2 anstatt 8x2 Anschlüsse und ein Kondensator wurde versetzt.

Ich habe den LM1117-3.3 Regler nachgemessen. Dort stimmen auch die Werte, er Regelt die 5V auf ca. 3,3V und selbst wenn ich 5V und 3,3V drauf gebe bleibt es so.
Das einzige was mich etwas irritiert ist, das ich bei R1-R4 keine Ohm messen kann. Es steht die Zahl 103 drauf, was 10K Ohm sein sollte. Mein Messgerät sagt aber garnichts dazu.
Ich hab nochmal nachgemessen und die 10K Wiederstände R1-R4 sind auch in Ordnung. (Die Batterie von meinem Messgerät hat schlapp gemacht)
Bei C1-C4 kann ich folgende Werte feststellen:

C1 = 995
C2 = 997
C3 = 1353
C4 = 1364

Nur die Werte bringen nicht viel, da ich keine Kondensatoren richtig messen kann.

Gruß Denis

Kondensatoren kann man nicht so einfach messen, wenn sie eingebaut sind.
Lt. Plan ( s. mein voriger Post ) sind auch jeweils ein 10µF und ein 100nF parallel, die kannst du eh' beim Messen nicht auseinanderhalten. ( Hat aber seinen Sinn, da der große Elko nicht gut auf schnelle Störungen reagiert. )

Der 3.3V Regler funktioniert prima, ich hab sogar noch ein LCD-Display dran hängen (ohne die LED-Beleuchtung)
Er wird auch für die VDD der Karte gebraucht.
Das CS (SS) könnte man fest auf GND ziehen, nur das MOSI und das CLK Signal gefallen mir nicht, bei diesem Modul.

Hab noch keine SD Card geopfert, bin aber skeptisch. Teure Shields haben alle Level-Shifter, hier sehe ich nur den Spannungsregler.

Ok, ich glaube ich werde langsam WAHNSINNIG!
Ich habe meine verkabelung wie oben geschrieben beibehalten und nur mal aus einer blöden Idee heraus versucht etwas über den arduino auf eine SD Karte zu schreiben.
Da ich dafür aber den Sketch noch nicht selber schreiben kann (mangels Kenntniss) habe ich einfach mal den Sketch von http://arduino.cc/forum/index.php/topic,148902.0.html
genommen.
Und siehe da, er schreibt ne Menge wirscher Dateien (klar, es fehlt das gps modul) und eine DATALOG Textdatei auf die Karte.
Es scheint also schon mal zu funktionieren. Warum das aber alles mit dem SDINFO Sketch nicht funktioniert verstehe ich noch nicht.
Hat eventuell jemand einen Sketch mit dem ich einfach mal einen beliebigen Text oder gleich die gemessenen Daten meiner DS1820 Sensoren drauf schreiben kann?

Gruß Denis

Hallo Denis,

hast Du die Karte vorher neu formatiert?

Ich hatte auch mal so ein ähnliches Problem, dass die Karte nicht lesbar war.

Neu formatiert (FAT32, obwohl 2GB-Karte), die zu lesende Datei neu draufkopiert und es hat funktioniert.

Gruß

Martin

Hi, hab die SD Karte extra formatiert.
Habe auch direkt alle formatierungsarten auch getestet.
Ich finde es nur echt merkwürdig, das die sdinfo nicht sieht, ich aber daten drauf schreiben kann.

Hab den Leonardo nun gegen einen Uno SMD getauscht.
Bekomme nun alles Daten auf den seriellen Monitor angezeigt und die Datei wird auch beschrieben.
Sprich, aM SD Modul lag es nicht. Irgendetwas in der Bibliothek stimmte noch nicht.

Hallo miteinander,

ich hab die librarys einmal durchforstet nach der SPI PINS und gefunden:

//------------------------------------------------------------------------------
// SPI pin definitions
//
#ifndef SOFTWARE_SPI
// hardware pin defs
/**

  • SD Chip Select pin
  • Warning if this pin is redefined the hardware SS will pin will be enabled
  • as an output by init(). An avr processor will not function as an SPI
  • master unless SS is set to output mode.
    /
    /
    * The default chip select pin for the SD card is SS. /
    uint8_t const SD_CHIP_SELECT_PIN = SS_PIN;
    // The following three pins must not be redefined for hardware SPI.
    /
    * SPI Master Out Slave In pin /
    uint8_t const SPI_MOSI_PIN = MOSI_PIN;
    /
    * SPI Master In Slave Out pin /
    uint8_t const SPI_MISO_PIN = MISO_PIN;
    /
    * SPI Clock pin /
    uint8_t const SPI_SCK_PIN = SCK_PIN;
    /
    * optimize loops for hardware SPI */
    #define OPTIMIZE_HARDWARE_SPI

#else // SOFTWARE_SPI
// define software SPI pins so Mega can use unmodified GPS Shield
/** SPI chip select pin /
uint8_t const SD_CHIP_SELECT_PIN = 10;
/
* SPI Master Out Slave In pin /
uint8_t const SPI_MOSI_PIN =11;
/
* SPI Master In Slave Out pin /
uint8_t const SPI_MISO_PIN =12;
/
* SPI Clock pin */
uint8_t const SPI_SCK_PIN = 13;
#endif // SOFTWARE_SPI

in der grünen markierten Zeilen müssten die Pins für den Arduino Leonardo richtig gesetzt werden.
Müsste man die orangenen Zeilen optimieren? wenn ja wie?

Danke an den netten Library Autor Bill denn ich hab ihm eine e-mail geschriebn und hat ganz schnell geantwortet.

die Library funktioniert auch mit Leonardo Board!