@@ -250,6 +250,7 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
250
250
// 16-bit init start time allows over a minute
251
251
unsigned int t0 = millis ();
252
252
uint32_t arg;
253
+ bool useCmd1 = false ;
253
254
254
255
// set pin modes
255
256
pinMode (chipSelectPin_, OUTPUT);
@@ -289,7 +290,9 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
289
290
// command to go idle in SPI mode
290
291
while ((status_ = cardCommand (CMD0, 0 )) != R1_IDLE_STATE) {
291
292
unsigned int d = millis () - t0;
293
+ Serial.println (status_);
292
294
if (d > SD_INIT_TIMEOUT) {
295
+ Serial.println (" CMD0 error" );
293
296
error (SD_CARD_ERROR_CMD0);
294
297
goto fail;
295
298
}
@@ -309,13 +312,18 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
309
312
// initialize card and send host supports SDHC if SD2
310
313
arg = type () == SD_CARD_TYPE_SD2 ? 0X40000000 : 0 ;
311
314
312
- while ((status_ = cardAcmd (ACMD41, arg)) != R1_READY_STATE) {
315
+ status_ = cardAcmd (ACMD41, arg);
316
+ while (status_ != R1_READY_STATE) {
313
317
// check for timeout
314
- unsigned int d = millis () - t0;
315
- if (d > SD_INIT_TIMEOUT) {
318
+ if (((uint16_t )millis () - t0) > SD_INIT_TIMEOUT) {
316
319
error (SD_CARD_ERROR_ACMD41);
317
320
goto fail;
318
321
}
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 ));
319
327
}
320
328
// if SD2 read OCR register to check for SDHC card
321
329
if (type () == SD_CARD_TYPE_SD2) {
0 commit comments