diff --git a/Firmware/Sd2Card.cpp b/Firmware/Sd2Card.cpp index c00c7ef9..cb1959be 100644 --- a/Firmware/Sd2Card.cpp +++ b/Firmware/Sd2Card.cpp @@ -319,6 +319,21 @@ bool Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) { goto fail; } } + + // send 0xFF until 0xFF received to give card some clock cycles + SERIAL_ECHOLNRPGM(PSTR("Sending 0xFF")); + spiSend(0XFF); + while ((status_ = spiRec()) != 0xFF) + { + spiSend(0XFF); + if (((uint16_t)_millis() - t0) > SD_CARD_ERROR_FF_TIMEOUT) + { + error(SD_CARD_ERROR_CMD8); + SERIAL_ECHOLNRPGM(PSTR("No 0xFF received")); + goto fail; + } + } + // check SD version if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { type(SD_CARD_TYPE_SD1); diff --git a/Firmware/Sd2Card.h b/Firmware/Sd2Card.h index 537d249c..f4cc59d7 100644 --- a/Firmware/Sd2Card.h +++ b/Firmware/Sd2Card.h @@ -105,6 +105,8 @@ uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18; uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19; /** crc check error */ uint8_t const SD_CARD_ERROR_CRC = 0X20; +/** no response to sent 0xFF */ +uint8_t const SD_CARD_ERROR_FF_TIMEOUT = 0X21; /** Toshiba FlashAir: iSDIO */ uint8_t const SD_CARD_ERROR_CMD48 = 0x80;