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

📄 mc_commands.c

📁 基于STR710 spi接口的MMC/SD卡(SPI模式)驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    UWORD8 resp;
    UWORD8 ret;
  
    mc_convert_param(param, length);					/* 将参数转化为字节形式 */
          												
    ret = mc_send_command(CMD16, param, CMD16_R, &resp);
    if (ret != MC_SUCCESS)
 	return ret;											/* 设置块的长度为length失败  */
	
    if (resp != 0)
    	return MC_ERR_CMD_RESP;			   				/* 响应错误  */
    
    return MC_SUCCESS; 									/* 返回执行成功*/			
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_single_block()		
;** 功能描述: 读单块命令				
;** 
;** 参    数: UWORD32 blockaddr: 块地址		
;**			  		
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_single_block(UWORD32 blockaddr)
{
	return (mc_block_command(CMD17, CMD17_R, blockaddr)); /* 读单块命令 */
}

/*********************************************************************************************************
;** 函数名称: UWORD8 SD_ReadMultipleBlock()		
;** 功能描述: 读多块命令			
;** 
;** 参    数: UWORD32 blockaddr: 块地址		
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_muti_block(UWORD32 blockaddr)
{
	return (mc_block_command(CMD18, CMD18_R, blockaddr)); /* 读多块命令*/
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_write_single_block()		
;** 功能描述: 写单块命令		
;** 
;** 参    数: UWORD32 blockaddr: block address			
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_write_single_block(UWORD32 blockaddr)
{
	return (mc_block_command(CMD24, CMD24_R, blockaddr)); /* 写单块命令 */
}

/*********************************************************************************************************
;** 函数名称:UWORD8 mc_write_muti_block()		
;** 功能描述: 写多块命令			
;** 
;** 参    数: UWORD32 blockaddr: 块地址		
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_write_muti_block(UWORD32 blockaddr)
{
	return (mc_block_command(CMD25, CMD25_R, blockaddr)); /* 写多块命令*/
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_program_csd()		
;** 功能描述: 写CSD寄存器			
;** 
;** 参    数: UWORD8 *buff  : CSD寄存器内容		
;**			  UWORD32 len : CSD寄存器长度	
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

UWORD8 mc_program_csd(UWORD32 len, UWORD8 *buff)
{
    UWORD8  param[4] = {0,0,0,0};
    UWORD8 resp;
    UWORD8 ret;
	
    if (len != 16) return MC_ERR_USER_PARAM;
    
    ret = mc_send_command(CMD27, param, CMD27_R, &resp); 	/* 发送写CSD寄存器命令*/
    if (ret != MC_SUCCESS)
    	return ret;
    	        
    if (resp != 0)    
        return MC_ERR_CMD_RESP;
    	
    buff[15] = (mc_get_crc7(buff, 15) << 1) + 0x01;  		/* 计算CSD中的crc 位域*/
    	
    return(mc_write_block_data(0, 16, buff));
}

/*********************************************************************************************************
;** 函数名称:UWORD8 mc_erase_start_block()		
;** 功能描述:设置块擦除起始地址		
;** 
;** 参    数: INT32U startblock: 块地址					
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_erase_start_block(UWORD32 startblock, UWORD8 sd)
{
	if (mc_info.card_type == SD_CARD)
		return (mc_block_command(CMD32, CMD32_R, startblock));	/* 发送擦除起始块地址*/
	else
		return (mc_block_command(CMD35, CMD35_R, startblock));	/* 发送擦除起始块地址*/
}

/*********************************************************************************************************
;** 函数名称:UWORD8 mc_erase_end_block()			
;** 功能描述:设置块擦除终止地址		
;** 
;** 参    数: UWORD32 endblock: 块地址			
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_erase_end_block(UWORD8 endblock)
{
	if (mc_info.card_type == SD_CARD)
		return (mc_block_command(CMD33, CMD33_R, endblock));     /* 发送擦除终止块地址 */
	else
		return (mc_block_command(CMD36, CMD36_R, endblock));     /* 发送擦除终止块地址 */
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_erase_selected_block()			
;** 功能描述: 擦除已选中的块			
;** 
;** 参    数: none		
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_erase_selected_block(void)
{
    UWORD8  param[4] = {0,0,0,0};
    UWORD8  resp;
    UWORD8  tmp;
	
    mc_convert_param(param, 0);
    
    tmp = mc_send_command(CMD38, param, CMD38_R, &resp);	 	    /* 擦除所选择的块 */
    if (tmp != MC_SUCCESS)
    	return tmp;							 	
    
    if (mc_wait_busy(MC_WAIT_ERASE) != MC_SUCCESS)					/* 等待擦除完成 */
    	return MC_ERR_TIMEOUT_ERASE;
    else
    	return MC_SUCCESS;									
}	

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_ocr()	
;** 功能描述: 读操作条件寄存器OCR		
;** 
;** 参    数: UWORD8 ocrlen  : 寄存器长度(固定为4)
;**			  UWORD8 *recbuf : 接收缓冲区	
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_ocr(UWORD8 ocrlen, UWORD8 *recbuf)
{
    UWORD8  param[4] = {0,0,0,0};
    UWORD8  resp[5];
    UWORD8  tmp;

    tmp = mc_send_command(CMD58, param, CMD58_R, resp);		/* 读 OCR 寄存器命令 */
    if (tmp != MC_SUCCESS)								
    	return tmp;		 										
    												
    if (resp[0] != 0)
        return MC_ERR_CMD_RESP;			 					/* 响应错误  */
    
    for (tmp = 0; tmp < 4; tmp++)
    	recbuf[tmp] = resp[tmp + 1];						/* 复制OCR寄存器内容到接收缓冲区 */
    
    return MC_SUCCESS;
}

/*********************************************************************************************************
;** 函数名称:UWORD8 mc_enable_crc()						
;** 功能描述:使能SD卡的CRC校验功能		
;** 
;** 参    数: UWORD8 bEnable : 1:使能 0:禁止		
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
#if MC_CRC_EN
UWORD8 mc_enable_crc(UWORD8 bEnable)
{
    UWORD8  param[4];
    UWORD8  resp;
    UWORD8  ret;
    	
    if (bEnable == 1)
    	param[0] = 1;											/* 使能crc  */
    else
    	param[1] = 0; 											/* 禁止crc  */
    
    ret = mc_send_command(CMD59, param, CMD59_R, &resp);		/* "使能/禁止CRC"命令 */
    if (ret != MC_SUCCESS)
        return ret;							 
    
    if (resp != 0)    
        return MC_ERR_CMD_RESP;									/* 响应错误 */		
    	
    return MC_SUCCESS;
    
}
#endif


/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_scr()	
;** 功能描述: 读SD卡的 SCR 寄存器		
;** 
;** 参    数: UWORD8 scrlen  : 寄存器长度(固定为8) 	
;**			  UWORD8 *recbuf  : 接收缓冲区
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_scr(UWORD8 scrlen, UWORD8 *recbuf)
{
    UWORD8  param[4];
    UWORD8  resp;
    UWORD8  ret;
    
    ret = mc_send_command(CMD55, param, CMD55_R, &resp);		/* 后续命令为一个应用命令 */
    if (ret != MC_SUCCESS)								
    	return ret;													
    												 
    if (resp != 0)
        return MC_ERR_CMD_RESP;									/* 响应错误 */
    
    ret = mc_send_command(ACMD51, param, ACMD51_R, &resp);   	/* 发送读命令*/
    if (ret != MC_SUCCESS)								
   		return ret;													
				    															
    if (resp != 0)
        return MC_ERR_CMD_RESP;						 			/* 响应错误  */
        
    return (mc_read_block_data(scrlen, recbuf));	 			/* 读出寄存器内容 */
}

/*********************************************************************************************************
;** 函数名称:UWORD8 mc_get_write_nblock()		
;** 功能描述:得到正确写入的块数	
;** 
;** 参    数: UWORD32 *blocknum: 返回的块数	
;**			 				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

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