Fork of Simon Ford's SDCardTest repo to make it work with FRDM-KL25Z. Also, I am using the SDFileSystem repo as a library dependency as opposed to using the hard-coded SDFileSystem.
Dependencies: MMA8451Q SDFileSystem mbed
Fork of SDCardTest by
Revision 2:849162a1207f, committed 2009-12-14
- Comitter:
- simon
- Date:
- Mon Dec 14 22:32:28 2009 +0000
- Parent:
- 1:2dec995d53f8
- Child:
- 3:68ef62208d4d
- Commit message:
Changed in this revision
| SDFileSystem.cpp | Show annotated file Show diff for this revision Revisions of this file |
| SDFileSystem.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/SDFileSystem.cpp Mon Dec 14 20:31:54 2009 +0000
+++ b/SDFileSystem.cpp Mon Dec 14 22:32:28 2009 +0000
@@ -104,6 +104,14 @@
_cs = 1;
}
+#define R1_IDLE_STATE (1 << 0)
+#define R1_ERASE_RESET (1 << 1)
+#define R1_ILLEGAL_COMMAND (1 << 2)
+#define R1_COM_CRC_ERROR (1 << 3)
+#define R1_ERASE_SEQUENCE_ERROR (1 << 4)
+#define R1_ADDRESS_ERROR (1 << 5)
+#define R1_PARAMETER_ERROR (1 << 6)
+
int SDFileSystem::disk_initialize() {
_spi.frequency(100000); // Set to 100kHz for initialisation
@@ -115,11 +123,20 @@
}
// send CMD0, should return with all zeros except IDLE STATE set (bit 0)
- if(_cmd(0, 0) != 0x01) {
- fprintf(stderr, "Not in idle state\n");
+ if(_cmd(0, 0) != R1_IDLE_STATE) {
+ fprintf(stderr, "No disk, or could not put SD card in to SPI idle state\n");
return 1;
}
-
+
+ int r = _cmd8();
+ if(r == R1_IDLE_STATE) {
+ printf("SD version 2.x\n");
+ } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
+ printf("SD version 1.x\n");
+ } else {
+ error("Unknown SD version\n");
+ }
+
// ACMD41 to give host capacity support (repeat until not busy)
// ACMD41 is application specific command, so we send APP_CMD (CMD55) beforehand
for(int i=0;; i++) {
@@ -133,6 +150,8 @@
}
}
+ printf("OK\n");
+
_sectors = _sd_sectors();
// Set block length to 512 (CMD16)
@@ -198,6 +217,35 @@
return -1; // timeout
}
+int SDFileSystem::_cmd8() {
+ _cs = 0;
+
+ // send a command
+ _spi.write(0x40 | 8); // CMD8
+ _spi.write(0x00); // reserved
+ _spi.write(0x00); // reserved
+ _spi.write(0x01); // 3.3v
+ _spi.write(0xAA); // check pattern
+ _spi.write(0x87); // crc
+
+ // wait for the repsonse (response[7] == 0)
+ for(int i=0; i<SD_COMMAND_TIMEOUT * 1000; i++) {
+ char response[5];
+ response[0] = _spi.write(0xFF);
+ if(!(response[0] & 0x80)) {
+ for(int j=1; j<5; j++) {
+ response[i] = _spi.write(0xFF);
+ }
+ _cs = 1;
+ _spi.write(0xFF);
+ return response[0];
+ }
+ }
+ _cs = 1;
+ _spi.write(0xFF);
+ return -1; // timeout
+}
+
int SDFileSystem::_read(char *buffer, int length) {
_cs = 0;
--- a/SDFileSystem.h Mon Dec 14 20:31:54 2009 +0000
+++ b/SDFileSystem.h Mon Dec 14 22:32:28 2009 +0000
@@ -1,56 +1,58 @@
-/* mbed Microcontroller Library - SDFileSystem
- * Copyright (c) 2008-2009, sford
- */
-
-#ifndef SDFILESYSTEM_H
-#define SDFILESYSTEM_H
-
-#include "mbed.h"
-#include "FATFileSystem.h"
-
-/* Class: SDFileSystem
- * Access the filesystem on an SD Card using SPI
- *
- * Example:
- * > SDFileSystem sd(p5, p6, p7, p12, "sd");
- * >
- * > int main() {
- * > FILE *fp = fopen("/sd/myfile.txt", "w");
- * > fprintf(fp, "Hello World!\n");
- * > fclose(fp);
- * > }
- */
-class SDFileSystem : public FATFileSystem {
-public:
-
- /* Constructor: SDFileSystem
- * Create the File System for accessing an SD Card using SPI
- *
- * Variables:
- * mosi - SPI mosi pin connected to SD Card
- * miso - SPI miso pin conencted to SD Card
- * sclk - SPI sclk pin connected to SD Card
- * cs - DigitalOut pin used as SD Card chip select
- * name - The name used to access the filesystem
- */
- SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name);
- virtual int disk_initialize();
- virtual int disk_write(const char *buffer, int block_number);
- virtual int disk_read(char *buffer, int block_number);
- virtual int disk_status();
- virtual int disk_sync();
- virtual int disk_sectors();
-
-protected:
-
- int _cmd(int cmd, int arg);
- int _read(char *buffer, int length);
- int _write(const char *buffer, int length);
- int _sd_sectors();
- int _sectors;
-
- SPI _spi;
- DigitalOut _cs;
-};
-
-#endif
+/* mbed Microcontroller Library - SDFileSystem
+ * Copyright (c) 2008-2009, sford
+ */
+
+#ifndef SDFILESYSTEM_H
+#define SDFILESYSTEM_H
+
+#include "mbed.h"
+#include "FATFileSystem.h"
+
+/* Class: SDFileSystem
+ * Access the filesystem on an SD Card using SPI
+ *
+ * Example:
+ * > SDFileSystem sd(p5, p6, p7, p12, "sd");
+ * >
+ * > int main() {
+ * > FILE *fp = fopen("/sd/myfile.txt", "w");
+ * > fprintf(fp, "Hello World!\n");
+ * > fclose(fp);
+ * > }
+ */
+class SDFileSystem : public FATFileSystem {
+public:
+
+ /* Constructor: SDFileSystem
+ * Create the File System for accessing an SD Card using SPI
+ *
+ * Variables:
+ * mosi - SPI mosi pin connected to SD Card
+ * miso - SPI miso pin conencted to SD Card
+ * sclk - SPI sclk pin connected to SD Card
+ * cs - DigitalOut pin used as SD Card chip select
+ * name - The name used to access the filesystem
+ */
+ SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name);
+ virtual int disk_initialize();
+ virtual int disk_write(const char *buffer, int block_number);
+ virtual int disk_read(char *buffer, int block_number);
+ virtual int disk_status();
+ virtual int disk_sync();
+ virtual int disk_sectors();
+
+protected:
+
+ int _cmd(int cmd, int arg);
+ int _cmd8();
+
+ int _read(char *buffer, int length);
+ int _write(const char *buffer, int length);
+ int _sd_sectors();
+ int _sectors;
+
+ SPI _spi;
+ DigitalOut _cs;
+};
+
+#endif


