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

📄 sdcard.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
📖 第 1 页 / 共 5 页
字号:
	}

	return SD_NO_ERR;											/* 返回擦除成功 return erase sucessfully */
}
#endif
	

/********************************************************************************************************************
** 函数名称: void SD_WaitBusy()						Name:	  void SD_WaitBusy()
** 功能描述: 查询SD卡是否处于忙状态					Function: poll SD Card wheather it is busy
** 输     入: INT32U waittype: 超时类型			Input:	  INT32U timeout: time out type
** 输     出: 0: 未超时  >0: 错误码				Output:	  0: not time out   > 0: error code
*********************************************************************************************************************/
INT8U SD_WaitBusy(INT8U waittype)
{
    INT32U timeout;
	INT32U i = 0;
    INT8U  tmp;
    
    if (waittype == SD_WAIT_WRITE)
    {
    	timeout = sds.timeout_write;
    }
	else
	{
    	timeout = sds.timeout_erase;
	}
	
	SPI1_CS_CLR();
   	do
   	{ 												/* 等待忙结束 wait for being busy end */
        tmp = SPI1_SrByte(0XFF);
        i++;
    }
	while ((tmp != 0xFF) && (i < timeout));			/* 忙时收到的值为0xFF always receive 0xFF when card is busy */    

	SPI1_CS_SET();									/* 有错 */
	
	if(i < timeout) 
	{
		return SD_NO_ERR;							/* 返回0,表示没超时 return 0 indicate that operation is not time out */
	}
	else 
	{
		return SD_ERR_TIMEOUT_WAIT;					/* 返回错误码,表示超时 return error code indicate that operation is time out */
	}
}
/*********************************************************************************************************************
** 函数名称: INT8U SD_ReadOCR()						Name:	  INT8U SD_ReadOCR()
** 功能描述: 读操作条件寄存器OCR					Function: read OCR register of sd card
** 输   入: INT8U ocrlen  : 寄存器长度(固定为4)	Input:	  INT8U ocrlen  : len of register (fixed,is 4)
			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer	
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
**********************************************************************************************************************/
INT8U SD_ReadOCR(INT8U ocrlen, INT8U *recbuf)
{
    INT8U param[4] = {0,0,0,0},resp[5],tmp;

    tmp = SD_SendCmd(CMD58, param, CMD58_R, resp);			/* 读 OCR 寄存器命令 */
    if (tmp != SD_NO_ERR)									/* read OCR register command */
    {
    	return tmp;		 										
    }
	
    if (resp[0] != 0)
    {
		return SD_ERR_CMD_RESP;			 					/* 响应错误 response is error */
    }
    for (tmp = 0; tmp < 4; tmp++)
    {
		recbuf[tmp] = resp[tmp + 1];						/* 复制OCR寄存器内容到接收缓冲区 */
    }
	
    return (SD_NO_ERR);
}
/********************************************************************************************************************
** 函数名称: INT8U SD_EnableCRC()					Name:	  INT8U SD_EnableCRC()
** 功能描述: 使能SD卡的CRC校验功能					Function: enable crc check of SD Card 
** 输   入: INT8U bEnable : 1:使能 0:禁止			Input:	  INT8U bEnable : 1:enable  0: disable
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
#if SD_CRC_EN
INT8U SD_EnableCRC(INT8U bEnable)
{
	INT8U param[4],resp,ret;
		
	if (bEnable == 1)
	{
		param[0] = 1;											/* 使能crc enable crc */
	}
	else
	{
		param[1] = 0; 											/* 禁止crc disalbe crc */
	}
	
	ret = SD_SendCmd(CMD59, param, CMD59_R, &resp);				/* "使能/禁止CRC"命令 enable/disable crc command */

	if (ret != SD_NO_ERR)
	{
		return ret;							 
	}
    if (resp != 0) 
    {
       	return SD_ERR_CMD_RESP;									/* 响应错误 response is error */		
    }
	
	return (SD_NO_ERR);
}
#endif
/*********************************************************************************************************************
** 函数名称: INT8U SD_Read_SD_Status()				     		Name:	   INT8U SD_Read_SD_Status()
** 功能描述: 读SD卡的 SD_Status 寄存器				     		Function: read SD_Status register of sd card 
** 输     入: INT8U sdslen  		: 寄存器长度(固定为64)	 Input:    INT8U sdslen: len of register (fixed,is 64)
			  INT8U *recbuf 		: 接收缓冲区				       INT8U *recbuf: recbuffer	
** 输     出: 0:   正确    >0:   错误码		  			 	 Output:	  0:  right		>0:  error code
**********************************************************************************************************************/
#if SD_ReadSD_Status_EN
INT8U SD_ReadSD_Status(INT8U sdslen, INT8U *recbuf)
{
    INT8U param[4] = {0,0,0,0},resp[2],ret;
    
    ret = SD_SendCmd(CMD55, param, CMD55_R, resp);			/* 后续命令为一个应用命令 */
    if (ret != SD_NO_ERR)
    {
    	return ret;											/* command that the followed commnad is a specific application */
    }												 
    if (resp[0] != 0)
    {
		return SD_ERR_CMD_RESP;								/* 响应错误 response is error */
    }
    ret = SD_SendCmd(ACMD13, param, ACMD13_R, resp);		/* 读 SD_Status 命令 */

	if (ret != SD_NO_ERR)
	{
		return ret;											/* command that read SD_Status register */
	}											
    if ((resp[0] != 0) || (resp[1] != 0))
    {
		return SD_ERR_CMD_RESP;								/* 响应错误 response is error */
    }
	
	return (SD_ReadBlockData(sdslen, recbuf));				/* 读出寄存器内容 read the content of the register */
}
#endif
/*******************************************************************************************************************
** 函数名称: INT8U SD_ReadSCR()							Name:	  INT8U SD_ReadSCR()
** 功能描述: 读SD卡的 SCR 寄存器						Function: read SCR register of sd card 
** 输   入: INT8U scrlen  		: 寄存器长度(固定为8) 	Input:    INT8U scrlen		 : len of register (fixed,is 8)
			 INT8U *recbuf 		: 接收缓冲区					  INT8U *recbuf		 : recbuffer	
** 输   出: 0:   正确    >0:   错误码		  			Output:	  0:  right		>0:  error code
********************************************************************************************************************/
#if SD_ReadSCR_EN
INT8U SD_ReadSCR(INT8U scrlen, INT8U *recbuf)
{
    INT8U param[4] = {0,0,0,0},resp,ret;
    
    ret = SD_SendCmd(CMD55, param, CMD55_R, &resp);					/* 后续命令为一个应用命令 */
    if (ret != SD_NO_ERR)											/* command that the followed commnad is a specific application */
    {
		return ret;													
    }
	
    if (resp != 0)
    {
        return SD_ERR_CMD_RESP;										/* 响应错误 response is error */
    }
	
    ret = SD_SendCmd(ACMD51, param, ACMD51_R, &resp);   			/* 发送读 SD_Status 命令*/
    if (ret != SD_NO_ERR)											/* command that read SD_Status register */
    {
		return ret;													
    }			    															
    if (resp != 0)
    {
        return SD_ERR_CMD_RESP;						 				/* 响应错误 response is error */
    }   
	return (SD_ReadBlockData(scrlen, recbuf));	 	/* 读出寄存器内容 read the content of the register */
}
#endif
/********************************************************************************************************************
** 函数名称: INT8U SD_GetNumWRBlcoks()				Name:	  INT8U SD_GetNumWRBlcoks()
** 功能描述: 得到正确写入的块数						Function: get the block numbers that written correctly
** 输   入: INT32U *blocknum: 返回的块数			Input:	  INT32U blocknum	: the block numbers returned
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
#if SD_WriteMultiBlock_EN
INT8U SD_GetNumWRBlcoks(INT32U *blocknum)
{
    INT8U tmp[4] = {0,0,0,0},resp,ret;
  
    ret = SD_SendCmd(CMD55, tmp, CMD55_R, &resp);	  			/* 后续命令为一个应用命令 */
    if (ret != SD_NO_ERR)										/* command that the followed commnad is a specific application */
    {
		return ret;
    } 
    if (resp != 0)
   	{
		return SD_ERR_CMD_RESP;    	
    }
	
   	ret = SD_SendCmd(ACMD22, tmp, ACMD22_R, &resp);  			/* 读取正确写入的块数命令 */

	if (ret != SD_NO_ERR)										/* command that read the numbers of block written correctly */
   	{
		return ret;											    
	}	 														
	if (resp != 0)
	{
		return SD_ERR_CMD_RESP;									/* 响应错误 response is error */
	}	
    ret = SD_ReadBlockData(4, tmp);								/* 读块数 read the numbvers of block */

	if (ret != SD_NO_ERR)
   	{
		return ret;
	}
    *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];	
    															/* 转换为32位 change to 32 bits */
	return (SD_NO_ERR);    										/* 返回执行成功 return perform sucessfully */		
}
#endif
/*******************************************************************************************************************
** 函数名称: INT8U SD_ReadBlockData()			Name:	  INT8U SD_ReadBlockData()
** 功能描述: 从SD卡中读取数据块					Function: read block data from sd card
** 输   入: INT32U len    : 长度				Input:	  INT32U len    : length
			 INT8U *recbuf : 接收缓冲区					  INT8U *recbuf : the buffer of receive
** 输   出: 0:   正确    >0:   错误码		  	Output:	  0:  right		>0:  error code
*******************************************************************************************************************/
INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf)
{
    INT8U tmp;
    INT32U i = 0;
    
    SPI1_CS_CLR();    
    do
    { 											    /* 等待接收数据开始令牌0xFE  wait for receiving data start token 0xFE */
        tmp = SPI1_SrByte(0XFF);
        i++;
     }
	while((tmp == 0xFF) && (i < sds.timeout_read));
	
	if (i >= sds.timeout_read)
	{
		SPI1_CS_SET();
       	return SD_ERR_TIMEOUT_READ;						/* 返回读超时错误码  return error timeout error code of reading */
	}
		
	if (tmp != SD_TOK_READ_STARTBLOCK)					/* 块读开始令牌错误 read start block token is error */
	{
		SPI1_SrByte(0xFF);
		SPI1_CS_SET();
		return SD_ERR_DATA_START_TOK;
	}
	
	for (i = 0; i < len; i++)
	{
   		recbuf[i] = SPI1_SrByte(0XFF);					/* 接收数据 receive data */
	}	
    i = SPI1_SrByte(0XFF);								
    i = (i << 8) + SPI1_SrByte(0XFF);    				/* 读取16位CRC get 16-bit CRC */	

#if SD_CRC_EN 
   	if (i != SD_GetCRC16(recbuf, len))
   	{													/* CRC校验错误 CRC check is error */
   		SPI1_SrByte(0xFF); 
   		SPI1_CS_SET();  						
  		return SD_ERR_DATA_CRC16;						/* 返回CRC16错误  return error of CRC16 */				
  	}    
#endif   

	SPI1_SrByte(0xFF); 
	SPI1_CS_SET();

  	return (SD_NO_ERR);								/* 返回函数执行成功 return function perform sucessfully */
}
/*******************************************************************************************************************
** 函数名称: INT8U SD_WriteBlockData()				Name:	  INT8U SD_WriteBlockData()
** 功能描述: 向sd卡写数据块							Function: write block data to sd card
** 输   入: INT8U bmulti  : 是否为多块操作1:是0:否 Input:	  INT8U bmulti   : multi blocks operate 1:Y 0:N 
			 INT32U len    : 长度						  	  INT32U len     : length
			 INT8U *sendbuf: 发送缓冲区					 	  INT8U *sendbuf : the buffer of send
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
********************************************************************************************************************/
INT8U SD_WriteBlockData(INT8U bmulti, INT32U len, INT8U *sendbuf)
{
	INT16U i;
	INT8U tmp;

	SPI1_CS_CLR();

⌨️ 快捷键说明

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