Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SDFileSystem by
Diff: SDFileSystem.cpp
- Revision:
- 12:eebddab6eff2
- Parent:
- 11:67ddc53e3983
- Child:
- 13:635147efa748
--- a/SDFileSystem.cpp Thu Aug 14 22:27:07 2014 +0000 +++ b/SDFileSystem.cpp Fri Aug 15 17:54:13 2014 +0000 @@ -19,7 +19,7 @@ #include "CRC7.h" #include "CRC16.h" -SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd, SwitchType cdtype, int hz) : FATFileSystem(name), m_Spi(mosi, miso, sclk), m_Cs(cs, 1), m_Cd(cd), m_CD_ASSERT((int)cdtype), m_FREQ(hz) +SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd, SwitchType cdtype, int hz) : FATFileSystem(name), m_Spi(mosi, miso, sclk), m_Cs(cs, 1), m_Cd(cd), m_FREQ(hz) { //Initialize the member variables m_CardType = CARD_NONE; @@ -31,11 +31,23 @@ m_Spi.format(8, 0); //Configure the card detect pin - m_Cd.mode(PullUp); - if (cdtype == SWITCH_NO) + if (cdtype == SWITCH_POS_NO) { + m_Cd.mode(PullDown); + m_CdAssert = 1; + m_Cd.fall(this, &SDFileSystem::checkSocket); + } else if (cdtype == SWITCH_POS_NC) { + m_Cd.mode(PullDown); + m_CdAssert = 0; m_Cd.rise(this, &SDFileSystem::checkSocket); - else + } else if (cdtype == SWITCH_NEG_NO) { + m_Cd.mode(PullUp); + m_CdAssert = 0; + m_Cd.rise(this, &SDFileSystem::checkSocket); + } else { + m_Cd.mode(PullUp); + m_CdAssert = 1; m_Cd.fall(this, &SDFileSystem::checkSocket); + } } SDFileSystem::CardType SDFileSystem::card_type() @@ -127,7 +139,7 @@ for (int i = 0; i < 10; i++) m_Spi.write(0xFF); - //Write CMD0(0x00000000) to reset the card + //Send CMD0(0x00000000) to reset the card if (commandTransaction(CMD0, 0x00000000) != 0x01) { //Initialization failed m_CardType = CARD_UNKNOWN; @@ -143,7 +155,7 @@ } } - //Write CMD8(0x000001AA) to see if this is an SDCv2 card + //Send CMD8(0x000001AA) to see if this is an SDCv2 card if (commandTransaction(CMD8, 0x000001AA, &resp) == 0x01) { //This is an SDCv2 card, get the 32-bit return value and verify the voltage range/check pattern if ((resp & 0xFFF) != 0x1AA) { @@ -181,6 +193,12 @@ m_CardType = CARD_SDHC; 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 + m_Spi.frequency(m_FREQ); } else { //Initialization failed m_CardType = CARD_UNKNOWN; @@ -207,6 +225,12 @@ if (token == 0x00) { //This is an SDCv1 standard capacity card m_CardType = CARD_SD; + + //Increase the SPI frequency to full speed (up to 25MHz for SDCv1) + if (m_FREQ > 25000000) + m_Spi.frequency(25000000); + else + m_Spi.frequency(m_FREQ); } else { //Try to initialize the card using CMD1(0x00100000) for 1 second for (int i = 0; i < 1000; i++) { @@ -220,6 +244,12 @@ if (token == 0x00) { //This is an MMCv3 card m_CardType = CARD_MMC; + + //Increase the SPI frequency to full speed (up to 20MHz for MMCv3) + if (m_FREQ > 20000000) + m_Spi.frequency(20000000); + else + m_Spi.frequency(m_FREQ); } else { //Initialization failed m_CardType = CARD_UNKNOWN; @@ -228,6 +258,15 @@ } } + //Send ACMD42(0x00000000) to disconnect the internal pull-up resistor on pin 1 if necessary + if (m_CardType != CARD_MMC) { + if (commandTransaction(ACMD42, 0x00000000) != 0x00) { + //Initialization failed + m_CardType = CARD_UNKNOWN; + return m_Status; + } + } + //Send CMD16(0x00000200) to force the block size to 512B if necessary if (m_CardType != CARD_SDHC) { if (commandTransaction(CMD16, 0x00000200) != 0x00) { @@ -237,26 +276,9 @@ } } - //Send ACMD42(0x00000000) to disconnect the internal pull-up resistor on pin 1 if necessary - if (m_CardType != CARD_MMC) { - if (commandTransaction(ACMD42, 0x00000000) != 0x00) { - //Initialization failed - m_CardType = CARD_UNKNOWN; - return m_Status; - } - } - //The card is now initialized m_Status &= ~STA_NOINIT; - //Increase the SPI frequency to full speed (limited to 20MHz for MMC, or 25MHz for SDC) - if (m_CardType == CARD_MMC && m_FREQ > 20000000) - m_Spi.frequency(20000000); - else if (m_FREQ > 25000000) - m_Spi.frequency(25000000); - else - m_Spi.frequency(m_FREQ); - //Return the disk status return m_Status; } @@ -369,7 +391,7 @@ void SDFileSystem::checkSocket() { //Check if a card is in the socket - if (m_Cd == m_CD_ASSERT) { + if (m_Cd == m_CdAssert) { //The socket is occupied, clear the STA_NODISK flag m_Status &= ~STA_NODISK; } else {