char Switch_to_SPI(void)
{
spi_clock_set(0x1a);
spi_cs_assert(); //Assert CS
sd_delay(74); //070920delay 74 clocks ,this allows the card to initialize any internal
//state registers before card initialization proceeds.
spi_cs_deassert(); //deassert CS
//必须不再选中CS,否则有的SD卡就不能装化为SPI模式.
sd_delay(6);
//put the card in the idle state -reset sd
OmniTempLong = 0x0000;
if(sd_send_command(CMD0,CMD0_R) != SD_NO_ERR)
return SD_ERR_COMMAND;
OmniTempInt2 = 0;
do //Active
{
OmniTempInt2++;
//flag the next command as an application-specific command
OmniTempLong = 0x0000;
if(sd_send_command(CMD55,CMD55_R) == SD_NO_ERR)
{
OmniTempLong = 0x0000;
sd_send_command(ACMD41,ACMD41_R); //read the OCR(SD mode)
}
else
{
OmniTempInt2 = SD_IDLE_WAIT_MAX; //no response,bail early
}
}
while(((Response[0] & MSK_IDLE) == MSK_IDLE)&&(OmniTempInt2 < SD_IDLE_WAIT_MAX));
if(OmniTempInt2 >= SD_IDLE_WAIT_MAX)
return SD_ERR_CMDTIMEOUT;
//read the OCR (SPI mode only),the MSB is 1 indicates
OmniTempLong = 0x0000; //the card's power up procedure is finished
if(sd_send_command(CMD58,CMD58_R) != SD_NO_ERR)
{
return SD_ERR_COMMAND;
}
else
{
OCRPara[0] = Response[1];
OCRPara[1] = Response[2];
OCRPara[2] = Response[3];
OCRPara[3] = Response[4];
}
if((OCRPara[1] & MSK_OCR_33) != MSK_OCR_33) //at a very minimum,we must allow 3.3V
return SD_ERR_OCR;
OmniTempLong = SD_BLOCKSIZE;
if(sd_send_command(CMD16,CMD16_R) != SD_NO_ERR) //set the block length
return SD_ERR_COMMAND;
spi_clock_set(0x04); //070920if we got this far,initialization was OK
/*if(FS_SD_Inf() != SD_NO_ERR) //该函数可以不用,这样可以节省代码,但是在自动格式化
return SD_ERR_CSD;*/ //函数中,需要将参数换成BPB。
return SD_NO_ERR;
}