// SD Card Test // // Check if the SD card on the Audio Shield is working, // and perform some simple speed measurements to gauge // its ability to play 1, 2, 3 and 4 WAV files at a time. // // Requires the audio shield: // http://www.pjrc.com/store/teensy3_audio.html // // Data files to put on your SD card can be downloaded here: // http://www.pjrc.com/teensy/td_libs_AudioDataFiles.html // // This example code is in the public domain. #include #include void setup() { Sd2Card card; SdVolume volume; File f1, f2, f3, f4; char buffer[512]; boolean status; unsigned long usec, usecMax; elapsedMicros usecTotal, usecSingle; int i, type; float size; // wait for the Arduino Serial Monitor to open while (!Serial) ; delay(50); // Configure SPI for the audio shield pins SPI.setMOSI(7); // Audio shield has MOSI on pin 7 SPI.setSCK(14); // Audio shield has SCK on pin 14 Serial.begin(9600); Serial.println("SD Card Test"); Serial.println("------------"); // First, detect the card status = card.init(10); // Audio shield has SD card SD on pin 10 if (status) { Serial.println("SD card is connected :-)"); } else { Serial.println("SD card is not connected or unusable :-("); return; } type = card.type(); if (type == SD_CARD_TYPE_SD1 || type == SD_CARD_TYPE_SD2) { Serial.println("Card type is SD"); } else if (type == SD_CARD_TYPE_SDHC) { Serial.println("Card type is SDHC"); } else { Serial.println("Card is an unknown type (maybe SDXC?)"); } // Then look at the file system and print its capacity status = volume.init(card); if (!status) { Serial.println("Unable to access the filesystem on this card. :-("); return; } size = volume.blocksPerCluster() * volume.clusterCount(); size = size * (512.0 / 1e6); // convert blocks to millions of bytes Serial.print("File system space is "); Serial.print(size); Serial.println(" Mbytes."); // Now open the SD card normally status = SD.begin(10); // Audio shield has SD card CS on pin 10 if (status) { Serial.println("SD library is able to access the filesystem"); } else { Serial.println("SD library can not access the filesystem!"); Serial.println("Please report this problem, with the make & model of your SD card."); Serial.println(" http://forum.pjrc.com/forums/4-Suggestions-amp-Bug-Reports"); } // Open the 4 sample files. Hopefully they're on the card f1 = SD.open("SDTEST1.WAV"); f2 = SD.open("SDTEST2.WAV"); f3 = SD.open("SDTEST3.WAV"); f4 = SD.open("SDTEST4.WAV"); // Speed test reading a single file if (f1) { Serial.println(); Serial.println("Reading SDTEST1.WAV:"); if (f1.size() >= 514048) { usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(1, 1000, usecTotal, usecMax); } else { Serial.println("SDTEST1.WAV is too small for speed testing"); } } else { Serial.println("Unable to find SDTEST1.WAV on this card"); return; } // Speed test reading two files if (f2) { Serial.println(); Serial.println("Reading SDTEST1.WAV & SDTEST2.WAV:"); if (f2.size() >= 514048) { f1.seek(0); usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); f2.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(2, 1000, usecTotal, usecMax); Serial.println(); Serial.println("Reading SDTEST1.WAV & SDTEST2.WAV staggered:"); f1.seek(0); f2.seek(0); f1.read(buffer, 512); usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); f2.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(2, 1000, usecTotal, usecMax); } else { Serial.println("SDTEST2.WAV is too small for speed testing"); } } else { Serial.println("Unable to find SDTEST2.WAV on this card"); return; } // Speed test reading three files if (f3) { Serial.println(); Serial.println("Reading SDTEST1.WAV, SDTEST2.WAV, SDTEST3.WAV:"); if (f3.size() >= 514048) { f1.seek(0); f2.seek(0); usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); f2.read(buffer, 512); f3.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(3, 1000, usecTotal, usecMax); Serial.println(); Serial.println("Reading SDTEST1.WAV, SDTEST2.WAV, SDTEST3.WAV staggered:"); f1.seek(0); f2.seek(0); f3.seek(0); f1.read(buffer, 512); f1.read(buffer, 512); f2.read(buffer, 512); usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); f2.read(buffer, 512); f3.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(3, 1000, usecTotal, usecMax); } else { Serial.println("SDTEST3.WAV is too small for speed testing"); } } else { Serial.println("Unable to find SDTEST3.WAV on this card"); return; } // Speed test reading four files if (f4) { Serial.println(); Serial.println("Reading SDTEST1.WAV, SDTEST2.WAV, SDTEST3.WAV, SDTEST4.WAV:"); if (f4.size() >= 514048) { f1.seek(0); f2.seek(0); f3.seek(0); usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); f2.read(buffer, 512); f3.read(buffer, 512); f4.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(4, 1000, usecTotal, usecMax); Serial.println(); Serial.println("Reading SDTEST1.WAV, SDTEST2.WAV, SDTEST3.WAV, SDTEST4.WAV staggered:"); f1.seek(0); f2.seek(0); f3.seek(0); f4.seek(0); f1.read(buffer, 512); f1.read(buffer, 512); f1.read(buffer, 512); f2.read(buffer, 512); f2.read(buffer, 512); f3.read(buffer, 512); usecMax = 0; usecTotal = 0; for (i=0; i < 1000; i++) { usecSingle = 0; f1.read(buffer, 512); f2.read(buffer, 512); f3.read(buffer, 512); f4.read(buffer, 512); usec = usecSingle; if (usec > usecMax) usecMax = usec; } reportSpeed(4, 1000, usecTotal, usecMax); } else { Serial.println("SDTEST4.WAV is too small for speed testing"); } } else { Serial.println("Unable to find SDTEST4.WAV on this card"); return; } } unsigned long maximum(unsigned long a, unsigned long b, unsigned long c, unsigned long d) { if (b > a) a = b; if (c > a) a = c; if (d > a) a = d; return a; } void reportSpeed(unsigned int numFiles, unsigned long blockCount, unsigned long usecTotal, unsigned long usecMax) { float bytesPerSecond = (float)(blockCount * 512 * numFiles) / usecTotal; Serial.print(" Overall speed = "); Serial.print(bytesPerSecond); Serial.println(" Mbyte/sec"); Serial.print(" Worst block time = "); Serial.print((float)usecMax / 1000.0); Serial.println(" ms"); Serial.print(" "); Serial.print( (float)usecMax / 29.01333); Serial.println("% of audio frame time"); } void loop(void) { // do nothing after the test }