@@ -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) {
0 commit comments