Skip to content

Commit 48c7e6e

Browse files
committed
Add initalization for MMC cards.
This commit includes 'hacks' described here http://blog.damnsoft.org/arduino-sd-library-support-for-mmc-cards/#mmc_problem Without it library is not able to initalize MMC card.
1 parent 92ebf8d commit 48c7e6e

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/utility/Sd2Card.cpp

+11-3
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
250250
// 16-bit init start time allows over a minute
251251
unsigned int t0 = millis();
252252
uint32_t arg;
253+
bool useCmd1 = false;
253254

254255
// set pin modes
255256
pinMode(chipSelectPin_, OUTPUT);
@@ -289,7 +290,9 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
289290
// command to go idle in SPI mode
290291
while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) {
291292
unsigned int d = millis() - t0;
293+
Serial.println(status_);
292294
if (d > SD_INIT_TIMEOUT) {
295+
Serial.println("CMD0 error");
293296
error(SD_CARD_ERROR_CMD0);
294297
goto fail;
295298
}
@@ -309,13 +312,18 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
309312
// initialize card and send host supports SDHC if SD2
310313
arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0;
311314

312-
while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) {
315+
status_ = cardAcmd(ACMD41, arg);
316+
while (status_ != R1_READY_STATE) {
313317
// check for timeout
314-
unsigned int d = millis() - t0;
315-
if (d > SD_INIT_TIMEOUT) {
318+
if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) {
316319
error(SD_CARD_ERROR_ACMD41);
317320
goto fail;
318321
}
322+
// Switch to CMD1 if the card fails to recognize ACMD41
323+
if (status_ & R1_ILLEGAL_COMMAND) {
324+
useCmd1 = true;
325+
}
326+
status_ = (!useCmd1 ? cardAcmd(ACMD41, arg) : cardCommand(CMD1, 0));
319327
}
320328
// if SD2 read OCR register to check for SDHC card
321329
if (type() == SD_CARD_TYPE_SD2) {

src/utility/SdInfo.h

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
// SD card commands
3535
/** GO_IDLE_STATE - init card in spi mode if CS low */
3636
uint8_t const CMD0 = 0X00;
37+
/** SEND_OP_COND - Initiate initialization process (used for MMC card) */
38+
uint8_t const CMD1 = 0x01;
3739
/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/
3840
uint8_t const CMD8 = 0X08;
3941
/** SEND_CSD - read the Card Specific Data (CSD register) */

0 commit comments

Comments
 (0)