From 52f5e0d41a2c757eb1f9e5c39268f6f2797cad46 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Mon, 14 Aug 2017 16:46:38 +0200 Subject: [PATCH] Make the initialization sequence more flexible According to the SD specification v2.00 we this is the right way to initialize a card using the v1 protocol in a forward-compatible way. --- SDBlockDevice.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/SDBlockDevice.cpp b/SDBlockDevice.cpp index 3dc70cc128..d31b2e1f5e 100644 --- a/SDBlockDevice.cpp +++ b/SDBlockDevice.cpp @@ -274,14 +274,13 @@ int SDBlockDevice::_initialise_card() return SD_BLOCK_DEVICE_ERROR_NO_DEVICE; } - // Send CMD8 - if (BD_ERROR_OK != (status = _cmd8())) { + // Send CMD8, if the card rejects the command then it's probably using the + // legacy protocol, or is a MMC, or just flat-out broken + status = _cmd8(); + if (BD_ERROR_OK != status && SD_BLOCK_DEVICE_ERROR_UNSUPPORTED != status) { return status; } - // Disable CRC - status = _cmd(CMD59_CRC_ON_OFF, 0); - // Read OCR - CMD58 Response contains OCR register if (BD_ERROR_OK != (status = _cmd(CMD58_READ_OCR, 0x0, 0x0, &response))) { return status; @@ -333,6 +332,10 @@ int SDBlockDevice::_initialise_card() _card_type = SDCARD_V1; debug_if(SD_DBG, "Card Initialized: Version 1.x Card\n"); } + + // Disable CRC + status = _cmd(CMD59_CRC_ON_OFF, 0); + return status; }