Skip to content

Commit e81d4d3

Browse files
committed
Fix SD Card not mounting on boot
The card seems to need a bit of a nudge at boot to properly mount sometimes. Fixes: #272
1 parent a709541 commit e81d4d3

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

Diff for: libraries/SD/src/sd_diskio.cpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,16 @@ char sdCommand(uint8_t pdrv, char cmd, unsigned int arg, unsigned int* resp)
142142
}
143143

144144
if (token == 0xFF) {
145-
log_e("no token received");
146-
break;
145+
log_w("no token received");
146+
sdDeselectCard(pdrv);
147+
delay(100);
148+
sdSelectCard(pdrv);
149+
continue;
147150
} else if (token & 0x08) {
148151
log_w("crc error");
152+
sdDeselectCard(pdrv);
153+
delay(100);
154+
sdSelectCard(pdrv);
149155
continue;
150156
} else if (token > 1) {
151157
log_w("token error [%u] 0x%x", cmd, token);
@@ -443,6 +449,7 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
443449
card->spi->beginTransaction(SPISettings(400000, MSBFIRST, SPI_MODE0));
444450

445451
if (sdTransaction(pdrv, GO_IDLE_STATE, 0, NULL) != 1) {
452+
log_w("GO_IDLE_STATE failed");
446453
goto unknown_card;
447454
}
448455

@@ -451,15 +458,18 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
451458
//old card maybe
452459
card->supports_crc = false;
453460
} else if (token != 1) {
461+
log_w("CRC_ON_OFF failed: %u", token);
454462
goto unknown_card;
455463
}
456464

457465
if (sdTransaction(pdrv, SEND_IF_COND, 0x1AA, &resp) == 1) {
458466
if ((resp & 0xFFF) != 0x1AA) {
467+
log_w("SEND_IF_COND failed: %03X", resp & 0xFFF);
459468
goto unknown_card;
460469
}
461470

462471
if (sdTransaction(pdrv, READ_OCR, 0, &resp) != 1 || !(resp & (1 << 20))) {
472+
log_w("READ_OCR failed: %X", resp);
463473
goto unknown_card;
464474
}
465475

@@ -469,6 +479,7 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
469479
} while (token == 1 && (millis() - start) < 1000);
470480

471481
if (token) {
482+
log_w("APP_OP_COND failed: %u", token);
472483
goto unknown_card;
473484
}
474485

@@ -479,10 +490,12 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
479490
card->type = CARD_SD;
480491
}
481492
} else {
493+
log_w("READ_OCR failed: %X", resp);
482494
goto unknown_card;
483495
}
484496
} else {
485497
if (sdTransaction(pdrv, READ_OCR, 0, &resp) != 1 || !(resp & (1 << 20))) {
498+
log_w("READ_OCR failed: %X", resp);
486499
goto unknown_card;
487500
}
488501

@@ -502,19 +515,22 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
502515
if (token == 0x00) {
503516
card->type = CARD_MMC;
504517
} else {
518+
log_w("SEND_OP_COND failed: %u", token);
505519
goto unknown_card;
506520
}
507521
}
508522
}
509523

510524
if (card->type != CARD_MMC) {
511525
if (sdTransaction(pdrv, APP_CLR_CARD_DETECT, 0, NULL)) {
526+
log_w("APP_CLR_CARD_DETECT failed");
512527
goto unknown_card;
513528
}
514529
}
515530

516531
if (card->type != CARD_SDHC) {
517532
if (sdTransaction(pdrv, SET_BLOCKLEN, 512, NULL) != 0x00) {
533+
log_w("SET_BLOCKLEN failed");
518534
goto unknown_card;
519535
}
520536
}

0 commit comments

Comments
 (0)