⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd-spi.txt

📁 SD卡切换到SPI模式的工作流程
💻 TXT
字号:
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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -