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

📄 sdcard.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
📖 第 1 页 / 共 5 页
字号:
	sds.erase_unit = ((csdbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) +  			
	                 ((csdbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1;  /* SD (SECTOR_SIZE + 1) */
	    			
	return SD_NO_ERR;															/* 返回执行成功 return perform sucessfully */
}
/*******************************************************************************************************************
** 函数名称: INT8U SD_ReadCID()							Name:	  INT8U SD_ReadCID()
** 功能描述: 读SD卡的CID寄存器							Function: read CID register of sd card
** 输     入 : INT8U cidlen  : 寄存器长度(固定为16)	INT8U cidlen  : len of register (fixed,is 16)
			   INT8U *recbuf : 接收缓冲区				INT8U *recbuf : recbuffer	
** 输      出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
********************************************************************************************************************/
#if SD_ReadCID_EN
INT8U SD_ReadCID(INT8U cidlen, INT8U *recbuf)
{
    INT8U param[4] = {0,0,0,0},resp,ret;
 
    ret = SD_SendCmd(CMD10, param, CMD10_R, &resp);		/* 读CID寄存器命令 command that read CID register */

	if ( ret != SD_NO_ERR)
   	{
		return ret;			  									
	}
    if (resp != 0)
    {
		return SD_ERR_CMD_RESP;							/* 响应错误 response is error */
    }
  	return (SD_ReadReg(cidlen, recbuf));
}
#endif
/********************************************************************************************************************
** 函数名称: INT8U SD_StopTransmission()			Name:	  INT8U SD_StopTransmission()
** 功能描述: 停止数据传输							Function: stop data transmission 
** 输   入: 无								 		Input:    NULL
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
INT8U SD_StopTransmission(void)
{
	INT8U param[4] = {0,0,0,0},resp;
	
 	return (SD_SendCmd(CMD12, param, CMD12_R, &resp));		/* 结束数据传输命令失败 stop transmission command fail */
}
/*********************************************************************************************************************
** 函数名称: INT8U SD_ReadCard_Status()				Name:	  INT8U SD_ReadCard_Status()
** 功能描述: 读SD卡的 Card Status 寄存器			Function: read Card Status register of sd card 
** 输   入: INT8U len: 	 寄存器长度(固定为2)			  INT8U len:      len of register (fixed,is 2)
			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
**********************************************************************************************************************/
INT8U SD_ReadCard_Status(INT8U len, INT8U *buffer)
{
    INT8U param[4] = {0,0,0,0};

    return (SD_SendCmd(CMD13, param, CMD13_R, buffer)); 	/* 读 Card Status 寄存器 */
    									 	 				/* read register of Card Status */
}
/********************************************************************************************************************
** 函数名称: INT8U Sd_SetBlockLen()					Name:	  INT8U Sd_SetBlockLen()
** 功能描述: 设置一个块的长度						Function: set a block len of sd card 
** 输   入: INT32U length	: 块的长度值			Input:	  INT32U length	: the length of a block
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
INT8U SD_SetBlockLen(INT32U length)
{
	INT8U param[4],resp,ret;
  
    SD_PackParam(param, length);					/* 将参数转化为字节形式 change the parameter to bytes form */
          												
    ret = SD_SendCmd(CMD16, param, CMD16_R, &resp);
    if (ret != SD_NO_ERR)
    {
 		return ret;									/* 设置块的长度为length失败 set the length of block to length fail */
    }
	if (resp != 0)
	{
    	return SD_ERR_CMD_RESP;			   			/* 响应错误 response is error */
	}
    return (SD_NO_ERR); 								/* 返回执行成功 return perform sucessfully */			
}
/********************************************************************************************************************
** 函数名称: INT8U SD_ReadSingleBlock()				Name:	  INT8U SD_ReadSingleBlock()
** 功能描述: 读单块命令								Function: read single block command
** 输   入: INT32U blockaddr: 块地址				Input:	  INT32U blockaddr: block address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	>0:  error code
*********************************************************************************************************************/
INT8U SD_ReadSingleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */
}
/********************************************************************************************************************
** 函数名称: INT8U SD_ReadMultipleBlock()			Name:	  INT8U SD_ReadMultipleBlock()
** 功能描述: 读多块命令								Function: read multiple block command 
** 输   入: INT32U blockaddr: 块地址				Input:	  INT32U blockaddr: block address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
INT8U SD_ReadMultipleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD18, CMD18_R, blockaddr)); /* 读多块命令 command that read multiple block */
}
/********************************************************************************************************************
** 函数名称: INT8U SD_WriteSingleBlock()			Name:	  INT8U SD_WriteSingleBlock()
** 功能描述: 写单块命令								Function: write single block command
** 输   入: INT32U blockaddr: block address		Input:	  INT32U blockaddr: block address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
INT8U SD_WriteSingleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */
}
/********************************************************************************************************************
** 函数名称: INT8U SD_WriteMultipleBlock()			Name:	  INT8U SD_WriteMultipleBlock()
** 功能描述: 写多块命令								Function: write multiple block command
** 输   入: INT32U blockaddr: 块地址				Input:	  INT32U blockaddr: block address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	>0:  error code
*********************************************************************************************************************/
INT8U SD_WriteMultipleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD25, CMD25_R, blockaddr)); /* 写多块命令 command that write multiple block */
}
/********************************************************************************************************************
** 函数名称: INT8U SD_ProgramCSD()						Name:	  INT8U SD_ProgramCSD()
** 功能描述: 写CSD寄存器								Function: write CSD register
** 输   入: INT8U *buff   		 : CSD寄存器内容		Input:	  INT8U *buff   	  : the content of CSD register	
			 INT8U len	  		 : CSD寄存器长度			  	  INT8U len			  : the length of CSD register
** 输   出: 0:   正确    >0:   错误码		  			Output:	  0:  right		>0:  error code
********************************************************************************************************************/
#if SD_ProgramCSD_EN
INT8U SD_ProgramCSD(INT8U len, INT8U *buff)
{
	INT8U param[4] = {0,0,0,0},resp,ret;
	
	if (len != 16)
	{
		return SD_ERR_USER_PARAM;
	}
	
	ret = SD_SendCmd(CMD27, param, CMD27_R, &resp); 	/* 发送写CSD寄存器命令 send command that write CSD */

	if (ret != SD_NO_ERR)
	{
		return ret;
	}
	
    if (resp != 0) 
    {
        return SD_ERR_CMD_RESP;
    }	
	buff[15] = (SD_GetCRC7(buff, 15) << 1) + 0x01;  	/* 计算CSD中的crc 位域 calculate crc field in CSD */
		
	return(SD_WriteBlockData(0, 16, buff));
}
/********************************************************************************************************************
** 函数名称: INT8U SD_GetCRC7()						Name:	  INT8U SD_GetCRC7()
** 功能描述: 计算CRC7								Function: calculate crc7
** 输     入: INT8U *pSource: 数据					Input:    INT8U *pSource: data
			  INT16U len    : 数据长度				INT16U len   : data length
** 输    出: CRC7码								Output:	  CRC7 code
*********************************************************************************************************************/
INT8U SD_GetCRC7(INT8U *pSource, INT16U len)
{
	INT8U i = 0;
	INT8U j;
	INT8U reg = 0;
	
	do
	{
	    for (j = 0; j < 8; j++)
	    {
			reg <<= 1;
			reg ^= ((((pSource[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
	    }
	    i++;
	}
	while(i < len);
	
	return reg;
}	
#endif	
/********************************************************************************************************************
** 函数名称: INT8U SD_EraseStartBlock()				Name:	  INT8U SD_EraseStartBlock()
** 功能描述: 设置块擦除起始地址						Function: select the start block address of erasing operation 
** 输   入: INT32U startblock: 块地址				Input: 	  INT32U startblock	: block address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	   >0:  error code
*********************************************************************************************************************/
#if SD_EraseBlock_EN
INT8U SD_EraseStartBlock(INT32U startblock)
{
	return (SD_BlockCommand(CMD32, CMD32_R, startblock));	/* 发送擦除起始块地址 send the start block address of erasing operation */
}
/********************************************************************************************************************
** 函数名称: INT8U SD_EraseEndBlock()				Name:	  INT8U SD_EraseEndBlock()
** 功能描述: 设置块擦除终止地址						Function: select the end block address of erasing operation  
** 输   入: INT32U endblock: 块地址				Input:	  INT32U Length	: block address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	   >0:  error code
*********************************************************************************************************************/
INT8U SD_EraseEndBlock(INT32U endblock)
{
	return (SD_BlockCommand(CMD33, CMD33_R, endblock));     /* 发送擦除终止块地址 send the end block address of erasing operation */
}
/********************************************************************************************************************
** 函数名称: INT8U SD_EraseSelectedBlock()			Name:	  INT8U SD_EraseSelectedBlock()
** 功能描述: 擦除已选中的块							Function: erase block selected
** 输   入: 无										Input:	  NULL
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
INT8U SD_EraseSelectedBlock(void)
{
	INT8U param[4],resp,tmp;
	
	SD_PackParam(param, 0);
	
	tmp = SD_SendCmd(CMD38, param, CMD38_R, &resp);	 	    /* 擦除所选择的块  erase blocks selected */

	if (tmp != SD_NO_ERR)
	{
		return tmp;							 	
	}
	
	if (SD_WaitBusy(SD_WAIT_ERASE) != SD_NO_ERR)			/* 等待擦除完成 wait for finishing erasing */
	{
		return SD_ERR_TIMEOUT_ERASE;
	}
	else

	{
		return SD_NO_ERR;									
	}
}	
/*********************************************************************************************************************
** 函数名称: INT8U SD_EraseBlock()					Name:	  INT8U SD_EraseBlock()
** 功能描述: 擦除SD卡中的块							Function: Erase the block of sd card
** 输   入: INT32U startaddr: 起始地址				Input:    INT32U startaddr: start address
			 INT32U endaddr  : 终止地址						  INT32U endaddr  : end address
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
** 注    意: startaddr 和 blocknum 建议为sds.erase_uint的整数倍, 因为有的卡只能以sds.erase_uint为单位进行擦除
*********************************************************************************************************************/
INT8U SD_EraseBlock(INT32U startaddr, INT32U blocknum)
{
	INT32 tmp;
	INT8U ret;
	
	if ((startaddr + blocknum) > sds.block_num)	
	{
		return SD_ERR_OVER_CARDRANGE;							/* 操作超出卡容量范围 operate over the card range */
	}
	if (SD_ChkCardWP() == 1)
	{
		return SD_ERR_WRITE_PROTECT;							/* 卡有写保护 */
	}
	tmp = blocknum - sds.erase_unit;	
	while(tmp >= 0)												/* 每次擦除扇区大小 once erase is sector size */
	{	
		ret = SD_EraseStartBlock(startaddr);					/* 选择起始块地址 select start address */
		if (ret != SD_NO_ERR)
		{
			return ret;
		}
		ret = SD_EraseEndBlock(startaddr + sds.erase_unit - 1);	/* 选择终止块地址 select end address */
		if (ret != SD_NO_ERR)
		{
			return ret;
		}
		ret = SD_EraseSelectedBlock();							/* 擦除所选的块 erase blocks selected */
		if (ret != SD_NO_ERR)
		{
			return ret;
		}
		startaddr += sds.erase_unit;							/* 起始地址递增 */
		blocknum  -= sds.erase_unit;
		tmp = blocknum - sds.erase_unit;
	};		
	
	if (blocknum > 0)											/* 擦除不够擦除扇区大小的块 */
	{															/* erase blocks that numbers is not enough a sector */
		ret = SD_EraseStartBlock(startaddr);
		if (ret != SD_NO_ERR)
		{
			return ret;
		}
		ret = SD_EraseEndBlock(startaddr + blocknum - 1);
		if (ret != SD_NO_ERR)
		{
			return ret;
		}
		ret = SD_EraseSelectedBlock();
		if (ret != SD_NO_ERR)
		{
			return ret;
		}

⌨️ 快捷键说明

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