Description
Source
Call Graph
Start Line: 1306
unsigned char SD_Init(SdCard *pSd, SdDriver *pSdDriver)
{
unsigned char error;
//TRACE_DEBUG("SD_Init()\n\r");
// Initialize SdCard structure
pSd->pSdDriver = pSdDriver;
pSd->cardAddress = 0;
pSd->preBlock = 0xffffffff;
pSd->state = SD_STATE_STBY;
pSd->cardType = UNKNOWN_CARD;
memset(&(pSd->command), 0, sizeof(SdCmd));
// Initialization delay: The maximum of 1 msec, 74 clock cycles and supply ramp up time
// ‘Supply ramp up time’ provides the time that the power is built up to the operating level (the bus
// master supply voltage) and the time to wait until the SD card can accept the first command
// Power On Init Special Command
//TRACE_DEBUG("Pon()\n\r");
error = Pon(pSd);
if (error) {
TRACE_ERROR("Error during initialization (%d)\n\r", error);
return error;
}
// After power-on or CMD0, all cards’ CMD lines are in input mode, waiting for start bit of the next command.
// The cards are initialized with a default relative card address (RCA=0x0000) and with a default
// driver stage register setting (lowest speed, highest driving current capability).
error = SD_SPI_Init(pSd, pSdDriver);
if (error) {
TRACE_ERROR("Error during initialization (%d)\n\r", error);
return error;
}
// In the case of a Standard Capacity SD Memory Card, this command sets the
// block length (in bytes) for all following block commands (read, write, lock).
// Default block length is fixed to 512 Bytes.
// Set length is valid for memory access commands only if partial block read
// operation are allowed in CSD.
// In the case of a High Capacity SD Memory Card, block length set by CMD16
// command does not affect the memory read and write commands. Always 512
// Bytes fixed block length is used. This command is effective for LOCK_UNLOCK command.
// In both cases, if block length is set larger than 512Bytes, the card sets the
// BLOCK_LEN_ERROR bit.
if (pSd->cardType == CARD_SD) {
error = Cmd16(pSd, SD_BLOCK_SIZE);
if (error) {
TRACE_ERROR("Error during initialization (%d)\n\r", error);
return error;
}
}
// If SD CSD v2.0
if((pSd->cardType != CARD_MMC) && (SD_CSD_STRUCTURE(pSd) == 1)) {
pSd->totalSize = SD_CSD_TOTAL_SIZE_HC(pSd);
pSd->blockNr = SD_CSD_BLOCKNR_HC(pSd);
}
else {
pSd->totalSize = SD_CSD_TOTAL_SIZE(pSd);
pSd->blockNr = SD_CSD_BLOCKNR(pSd);
}
if (pSd->cardType == UNKNOWN_CARD) {
return SD_ERROR_NOT_INITIALIZED;
}
else {
return 0;
}
}