updates

Dependencies:   FATFileSystem

Fork of SDFileSystem by Neil Thiessen

Revision:
23:6bb3c1987511
Parent:
22:3fa5eaf48e81
Child:
24:a52e682a1ce4
diff -r 3fa5eaf48e81 -r 6bb3c1987511 SDFileSystem.cpp
--- a/SDFileSystem.cpp	Wed Feb 24 17:46:31 2016 +0000
+++ b/SDFileSystem.cpp	Wed Apr 13 16:51:25 2016 +0000
@@ -222,11 +222,20 @@
             else
                 m_CardType = CARD_SD;
 
-            //Increase the SPI frequency to full speed (up to 25MHz for SDCv2)
-            if (m_FREQ > 25000000)
-                m_Spi.frequency(25000000);
-            else
+            //Increase the SPI frequency to full speed (up to 50MHz for SDCv2)
+            if (m_FREQ > 25000000) {
+                if (enableHighSpeedMode()) {
+                    if (m_FREQ > 50000000) {
+                        m_Spi.frequency(50000000);
+                    } else {
+                        m_Spi.frequency(m_FREQ);
+                    }
+                } else {
+                    m_Spi.frequency(25000000);
+                }
+            } else {
                 m_Spi.frequency(m_FREQ);
+            }
         } else {
             //Initialization failed
             m_CardType = CARD_UNKNOWN;
@@ -883,3 +892,32 @@
     deselect();
     return false;
 }
+
+bool SDFileSystem::enableHighSpeedMode()
+{
+    //Try to issue CMD6 up to 3 times
+    for (int f = 0; f < 3; f++) {
+        //Select the card, and wait for ready
+        if(!select())
+            break;
+
+        //Send CMD6(0x80FFFFF1) to change the access mode to high speed
+        if (writeCommand(CMD6, 0x80FFFFF1) == 0x00) {
+            //Read the 64B status data block
+            char status[64];
+            bool success = readData(status, 64);
+            deselect();
+            if (success) {
+                //Return whether or not the operation was successful
+                return ((status[16] & 0x0F) == 0x1);
+            }
+        } else {
+            //The command failed, get out
+            break;
+        }
+    }
+
+    //The operation failed 3 times
+    deselect();
+    return false;
+}