SD_Card Pin Belegung?

Hallo,

ich habe ein SD Card Modul von Exp-Tech an meinem Mega2560 angeschlossen. Funktioniert auch, funktioniert aber nur wenn ich hier wirklich Pin 53 schreibe.
pinMode(53, OUTPUT); // change this to 53 on a mega

ChipSelect ist aber mit Pin 26 eingestellt und auch angeschlossen.

Setze ich Pin 26 auf Output, erkennt er zwar die Karte aber keine Formatierung dieser.
pinMode(26, OUTPUT); // change this to 53 on a mega

Der Witz ist, Pin 53 ist überhaupt nicht angeschlossen? :~

Mein Verständnisproblem liegt darin, dass ich denke das der frei gewählte Pin 26 ChipSelect und der SPI Pin 53 SlaveSelect doch das gleiche sein müßten. Nämlich Auswahl des Device am SPI Bus. Ich weis also nicht warum man im Sketch 2 Angaben machen muß. Außerdem muß Pin 26 irgendwo in der Library versteckt auch auf Output gesetzt werden. :~

/*
  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
 ** MISO - pin 12 on Arduino Uno und bei Mega2560 Pin 50
 ** CLK  - pin 13 on Arduino Uno und bei Mega2560 Pin 52
 ** CS   - pin 26 frei gewählt Mega2560
 	   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 = 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) {
  
}

In den Examples meiner DS-Lib steht:

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.

Das bedeutet, du kannst deinen CS-Pin frei wählen, aber der PIN53 MUSS( ausserdem auch ) als Output definiert sein.

Hallo,

also mein Pin 26 und der Pin 53 macht das Gleiche? Wenn ich Pin 53 für ChipSelect verwende müßte der Sketch auch funktionieren? Und egal welchen Pin ich verwende, Pin 53 muß immer als Ausgang geschalten sein. Richtig verstanden? Wenn ja , soweit okay.

Ich habe noch ein Problem. Wenn ich den Mega frisch eingestöpselt mit "USB Spannung" versorge, funktioniert der Sketch. Karte wird erkannt und Inhalt angezeigt. Drücke ich Reset am µC oder öffne erneut den serial Monitor wird nur noch die Karte erkannt der Rest nicht mehr. Habe schon einen zusätzlichen 100nF nah an die Spannungsversorung der SD-Karte gesteckt. Bringt nichts. Irgendwelche Delays zu kurz?

Den Pin 53 auf OUTPUT zu setzen, bewirkt, dass der Arduino MEGA der Master ist, statt Slave. Wenn man nur einen Slave dran hat, bietet es sich natürlich an, diesen Pin als SS zu verwenden, muss man aber natürlich nicht.

(Beim UNO hat Pin 10 die gleiche Funktion )

Hallo,

Danke für die Erklärung(en). Die SD-Karte funktioniert auch wieder. War ein Kontaktproblem in Pin 26. Nachdem 2 andere Pins und 53 funktionierten, habe ich den Draht wieder zurück gesteckt. Teufelchen steckt im Detail. ;)