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

📄 mc_operations.c

📁 基于STR710 spi接口的MMC/SD卡(SPI模式)驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    	ret = MC_ERR_VOL_NOTSUSP;								/* 不支持3.3V,返回错误码   */
    	goto MC_SD_ERR;
    }
    
    MC_CLK_MAX();											    /* 9. 设置SPI时钟到最大值  */
    
#if MC_CRC_EN        
    ret = mc_enable_crc(1);										/* 使能CRC校验 enable CRC check */
	if (ret != MC_SUCCESS)  
	  	goto MC_SD_ERR;
#endif

    ret = mc_set_block_length(MC_BLOCK_SIZE);					/* 10. 设置块的长度: 512Bytes  */
    
    if (ret != MC_SUCCESS)  
        goto MC_SD_ERR;
        
     ret = mc_get_card_info();									/* 11. 读CSD寄存器,获取SD/MMC卡信息  */    
	if (ret != MC_SUCCESS)
		goto MC_SD_ERR;
		
	return MC_SUCCESS;
	
MC_SD_ERR:	
	return ret;
}
/*********************************************************************************************************
** 函数名称: mc_erase_block
** 功能描述: MMC/SD按块檫出
** 
** 参    数: blockaddr:块地址, blocknum: 块个数
**          
** 返 回 值: error type
**         
** 作   者: 罗辉联
** 日   期: 2006年6月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日   期: 2006年7月25日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
MC_RESULT_T mc_erase_block(UWORD32 blockaddr,UWORD32 blocknum)
{
	WORD32  tmp;
	UWORD8  ret;
	
	
	if(MC_CARD_INSERTED_STATUS() == 0)
		return MC_ERR_NO_CARD;
	
	if ((blockaddr + blocknum) > mc_info.block_num)	
		return MC_ERR_OVER_CARDRANGE;							/* 操作超出卡容量范围  */
		
	if (MC_WP_STATUS() == 1)
		return MC_ERR_WRITE_PROTECT;							/* 卡有写保护 */
		

	tmp = blocknum - mc_info.erase_unit;						/* 一次最多只能檫出mc_info.erase_unit个块 */
		
	while(tmp >= 0)												/* 每次擦除扇区  */
	{	
		ret = mc_erase_start_block(blockaddr,1);				/* 选择起始块地址  */
		if (ret != MC_SUCCESS)
		{
			return ret;
		}
		
		ret = mc_erase_end_block(blockaddr + mc_info.erase_unit - 1);/* 选择终止块地址  */
		if (ret != MC_SUCCESS)
		{
			return ret;
		}
			
		ret = mc_erase_selected_block();							/* 擦除所选的块 */
		if (ret != MC_SUCCESS)
		{
			return ret;
		}

		blockaddr += mc_info.erase_unit;							/* 起始地址递增 */
		blocknum  -= mc_info.erase_unit;
		tmp = blocknum - mc_info.erase_unit;
	};		
	
	if (blocknum > 0)												/* 擦除不够once_erase块 */
	{															

		ret = mc_erase_start_block(blockaddr,1);					/* 选择起始块地址 */
		if (ret != MC_SUCCESS)
		{
			return ret;
		}
		ret = mc_erase_end_block(blockaddr + mc_info.erase_unit - 1);/* 选择终止块地址  */
		if (ret != MC_SUCCESS)
		{
			return ret;
		}
			
		ret = mc_erase_selected_block();							/* 擦除所选的块 */
		if (ret != MC_SUCCESS)
		{
			return ret;
		}
	}

	return MC_SUCCESS;

}

/*********************************************************************************************************
** 函数名称: mc_read_block
** 功能描述: 读MMC/SD的块
** 
** 参    数: blockaddr:块地址, blocknum: 块个数, recbuf:读缓冲区
**          
** 返 回 值: error type
**         
** 作   者: 罗辉联
** 日   期: 2006年6月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日   期: 2006年7月25日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
MC_RESULT_T mc_read_block(UWORD32 blockaddr,UWORD32 blocknum,UWORD8* recbuf)
{	
   UWORD8 ret; 
   UWORD32 i;
   
   if(MC_CARD_INSERTED_STATUS() == 0)
		return MC_ERR_NO_CARD;

  	if(blocknum == 1)										/* 只读一个块 */
  	{
		
		if (blockaddr > mc_info.block_num)	
			return MC_ERR_OVER_CARDRANGE;					/* 操作超出卡容量范围  */
			
	
 		ret = mc_read_single_block(blockaddr);				/* 读单块命令  */
 								
 		if (ret != MC_SUCCESS)
 			return ret;
 
 	
  		ret = mc_read_block_data(MC_BLOCK_SIZE, recbuf);	/* 读出数据  */	
	
  	}
  	else													/* 读多块 */
  	{
 		if ((blockaddr + blocknum) > mc_info.block_num)	
			return MC_ERR_OVER_CARDRANGE;					/* 操作超出卡容量范围  */      
    
		ret = mc_read_muti_block(blockaddr);				/* 读多块命令  */
		if (ret != MC_SUCCESS)
			return ret;
    	
    
    	for (i = 0; i < blocknum; i++)
    	{													/* 读出数据  */
    		ret = mc_read_block_data(MC_BLOCK_SIZE, recbuf);
    		if (ret == MC_SUCCESS)
       			recbuf = recbuf + MC_BLOCK_SIZE;
    		else
    			return ret;
    	}
    
 		ret = mc_stop_transmission();				    	/* 结束数据传输 */ 
  }
  
  return ret; 
  
}

/*********************************************************************************************************
** 函数名称: mc_write_block
** 功能描述: 写MMC/SD的块
** 
** 参    数: blockaddr:块地址, blocknum: 块个数, recbuf:读缓冲区
**          
** 返 回 值: error type
**         
** 作   者: 罗辉联
** 日   期: 2006年6月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日   期: 2006年7月25日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
MC_RESULT_T mc_write_block(UWORD32 blockaddr,UWORD32 blocknum,UWORD8* sendbuf)
{
	UWORD32 i;
	UWORD8 	ret;
	UWORD8 	tmp[2];
	
	if(MC_CARD_INSERTED_STATUS() == 0)
		return MC_ERR_NO_CARD;
		
	if (MC_WP_STATUS() == 1)
		return MC_ERR_WRITE_PROTECT;							/* 卡有写保护 					*/
		
		
	if(blocknum == 1)											/* 只写一块 					*/
	{
		if (blockaddr > mc_info.block_num)	
			return MC_ERR_OVER_CARDRANGE;						/* 操作超出卡容量范围			*/
			
		ret = mc_write_single_block(blockaddr);					/* 写单块命令					*/
		
		if (ret != MC_SUCCESS)
			return ret;
	
		ret = mc_write_block_data(0, MC_BLOCK_SIZE, sendbuf);	/* 写入数据				 		*/	
		
		if (ret == MC_SUCCESS)									/* 读状态寄存器,检查写入是否成功*/
 		{															
 			ret = mc_read_status(2, tmp);
 			
 			if (ret != MC_SUCCESS)
 				return ret;										/* 读寄存器失败  				*/
		

 		if((tmp[0] != 0) || (tmp[1] != 0))
			ret = MC_ERR_WRITE_BLK; 			     			/* 响应指示写失败 				*/
 		
 		}		
		
	}
	else														/* 写多个块 					*/
	{
		if ((blockaddr + blocknum) > mc_info.block_num)	
			return MC_ERR_OVER_CARDRANGE;						/* 操作超出卡容量范围  			*/   
			
		ret = mc_write_muti_block(blockaddr);					/* 写单块命令					*/  
		if (ret != MC_SUCCESS)
			return ret;
			
		for (i = 0; i < blocknum; i++)
    	{														/* 写入数据  					*/
    		ret = mc_write_block_data(1,MC_BLOCK_SIZE, sendbuf);
    		if (ret == MC_SUCCESS)
       			sendbuf = sendbuf + MC_BLOCK_SIZE;
    		else
    		{													/* 写失败 						*/
				mc_stop_transmission();							/* 停止数据传输 				*/	
				mc_wait_busy(MC_WAIT_WRITE);					/* 等待 						*/
				return ret;
			}
    	}
    
 		mc_stop_multi_token();									/* 发送数据停止令牌  			*/
 		
 		ret = mc_wait_busy(MC_WAIT_WRITE);						/* 等待写入的完成 				*/
 		
 		if(ret != MC_SUCCESS)
    		return MC_ERR_TIMEOUT_WRITE;
    		
    	if(mc_info.card_type == SD_CARD)
    	{
    		ret = mc_get_write_nblock(&i);						/* 读正确写入的块数  			*/
    		
    		if (ret != MC_SUCCESS)
   		  		return ret;
   			
   			if(i != blocknum)
				ret =  MC_ERR_WRITE_BLKNUMS;					/* 正确写入块数错误 			*/
    	}
    	else
   		{
   	 		ret = mc_read_status(2, tmp);
 			if (ret != MC_SUCCESS)
 				return ret;	
 																/* 读寄存器失败  */
 			if((tmp[0] != 0) || (tmp[1] != 0))
				ret = MC_ERR_WRITE_BLK; 			     		/* 响应指示写失败 */
   		}
    
	}
	
 	return ret;
  
}









⌨️ 快捷键说明

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