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

📄 mc_commands.c

📁 基于STR710 spi接口的MMC/SD卡(SPI模式)驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                          公 司
**                                          部 门
**
**                                 http://www.chipapp.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: mc_command.c
** 创 建 人: 邓国强
** 创建日期: 2006年5月28日
** 描    述: SD/MMC 读写模块: 物理层 ---- SD/MMC 卡SPI模式支持的命令
**
**--------------版本信息--------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 版    本: V1.0
** 日   期: 2006年7月25日
** 描   述: 把COMMAND相关的定义放在一个文件中
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"


/***************************************** 全局变量定义  ************************************************/

MC_INFO_STRUCT mc_info;				/* SD卡信息结构体变量 */

/***************************************** 函数原型声明  ************************************************/


/*********************************************************************************************************
;** 函数名称: UWORD8 mc_send_command()		
;** 功能描述: 向卡发送命令,并取得响应	
;** 
;** 参    数: UWORD8 cmd	    : 命令字				
;**			  UWORD8 *param	: 命令参数,长度为4字节 
;**			  UWORD8 resptype : 响应类型					
;**			  UWORD8 *resp	: 响应,长度为1-5字节		
;**
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_send_command(UWORD8 cmd, UWORD8 *param,UWORD8 resptype, UWORD8 *resp)
{
    WORD32 i,rlen;
    UWORD8 tmp;
    UWORD8 array[6];

    MC_CS_ENABLE();
 									/* 发送命令头和命令字 */
    array[0] = (cmd & 0x3F) | 0x40;
    mc_send_byte(array[0]);
    
    for (i = 3; i >= 0; i--)
    {        
        array[4-i] = param[i];
	 	mc_send_byte(param[i]);
    }

#if MC_CRC_EN
    tmp = mc_get_cmd_byte6((cmd & 0x3F) | 0x40, param);
    mc_send_byte(tmp);
#else
    tmp = 0x95;
    mc_send_byte(tmp);
#endif 

    array[5] = tmp;
	
	 
    rlen = 0;
    switch (resptype)								 /* 根据不同的命令,得到不同的响应长度 */
    {												 
    	case R1:
    	case R1B: rlen = 1;  break;
       		 
    	case R2:  rlen = 2;	 break;
       		 
    	case R3:  rlen = 5;	 break;
       		 
    	default:  
		tmp = 0xff;
		mc_send_byte(tmp);
		MC_CS_DISABLE();						 
        	return MC_ERR_CMD_RESPTYPE;		 		/* 返回命令响应类型错误  			*/
    		break;
    }
    
    i = 0;	
    			
    do 												 /* 等待响应,响应的开始位为0 		*/
    {												 
       tmp = mc_receive_byte();
		i++;
    }while (((tmp & 0x80) != 0) && (i < MC_CMD_TIMEOUT));

	
    if (i >= MC_CMD_TIMEOUT)
    {												 
        MC_CS_DISABLE();
        return MC_ERR_CMD_TIMEOUT;					 /* 返回命令超时 					*/
    }
    
    for (i = rlen - 1; i >= 0; i--)
    {
        resp[i] = tmp;
        tmp = mc_receive_byte();
    }
 
	
    MC_CS_DISABLE();
    return MC_SUCCESS;								 /* 返回执行成功 					*/
}

/*********************************************************************************************************
;** 函数名称: void mc_convert_param()	
;** 功能描述:将32位的参数转为字节形式		
;** 
;** 参    数:        UWORD8 * parameter: 字节参数缓冲区
;**				  UWORD32  value    : 32位参数		  
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void mc_convert_param(UWORD8 *parameter, UWORD32 value)
{
    parameter[3] = (UWORD8)(value >> 24);
    parameter[2] = (UWORD8)(value >> 16);
    parameter[1] = (UWORD8)(value >> 8);
    parameter[0] = (UWORD8)(value);
}

/*********************************************************************************************************
;** 函数名称:UWORD8 mc_block_command()		
;** 功能描述:块命令	
;** 
;** 参    数: UWORD8 cmd	     : 命令字		
;**			  UWORD8 resptype  :   响应类型		
;**			  UWORD32 parameter: 块操作参数		
;**
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_block_command(UWORD8 cmd, UWORD8 resptype, UWORD32 parameter)
{
	UWORD8  param[4];
	UWORD8  resp;
	UWORD8  ret;
	
	parameter <<= MC_BLOCKSIZE_NBITS;					 	/* 调整地址:左移9位  		*/

	mc_convert_param(param, parameter);						/* 将参数转化为字节形式  	*/	

	ret = mc_send_command(cmd, param, resptype, &resp);
	if (ret != MC_SUCCESS)
	   	 return ret;							 		 	/* 结束数据传输失败 		*/
	
	if (resp != 0)
		 return MC_ERR_CMD_RESP;		 				 	/* 响应错误 				*/
		 
	return MC_SUCCESS;
}

	/*************************************************
	
	 	SD卡SPI命令

	*************************************************/
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_reset(void)			
;** 功能描述: 复位SD/MMC卡		
;** 
;** 参    数: none
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_reset(void)
{
	UWORD8 param[4] = {0,0,0,0};
	UWORD8 resp;
	
    return (mc_send_command(CMD0, param, CMD0_R, &resp));		/* 复位命令 */
}
	
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_csd()			
;** 功能描述: 读SD/MMC卡的CSD寄存器		
;** 
;** 参    数: UWORD8 csdlen  : 寄存器长度(固定为16)	
;**			  UWORD8 *recbuf : 接收缓冲区				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_csd(UWORD8 csdlen, UWORD8 *recbuf)
{
    UWORD8  param[4] = {0,0,0,0};
    UWORD8 resp;
    UWORD8 ret;
  
    ret = mc_send_command(CMD9, param, CMD9_R, &resp);		/* 读CSD寄存器命令 */
    if (ret != MC_SUCCESS) 									
        return ret;									
  
    if (resp != 0)
        return MC_ERR_CMD_RESP;								/* 响应错误 		*/
    
    return (mc_read_register(csdlen, recbuf));
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_cid()				
;** 功能描述: 读SD卡的CID寄存器		
;** 
;** 参    数: UWORD8 cidlen  : 寄存器长度(固定为16)
;**			  UWORD8 *recbuf : 接收缓冲区		
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

UWORD8 mc_read_cid(UWORD8 cidlen, UWORD8 *recbuf)
{
    UWORD8  param[4] = {0,0,0,0};
    UWORD8 resp;
    UWORD8 ret;
   
    ret = mc_send_command(CMD10, param, CMD10_R, &resp);		/* 读CID寄存器命令 	*/
    if ( ret != MC_SUCCESS)
   	 return ret;			  									
   
    if (resp != 0)
        return MC_ERR_CMD_RESP;									/* 响应错误			*/
      
    return (mc_read_register(cidlen, recbuf));
}

/*********************************************************************************************************
;** 函数名称:  UWORD8 mc_stop_transmission()	
;** 功能描述:  停止数据传输			
;** 
;** 参    数: 
;**			  				
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_stop_transmission(void)
{
    UWORD8  param[4] = {0,0,0,0};
    UWORD8 resp;
	
    return (mc_send_command(CMD12, param, CMD12_R, &resp));		/* 结束数据传输命令失败 */
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_status()			
;** 功能描述: 读SD/MMC卡的 Card Status 寄存器	
;** 
;** 参    数: UWORD8 len: 	 寄存器长度(固定为2)	
;**			  UWORD8 *recbuf : 接收缓冲区					
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_status(UWORD8 len, UWORD8 *buffer)
{
    UWORD8 param[4] = {0,0,0,0};

    return (mc_send_command(CMD13, param, CMD13_R, buffer));    // 读 Card Status 寄存器 
    									 	 			               
}

/*********************************************************************************************************
;** 函数名称: UWORD8 mc_set_block_length()	
;** 功能描述: 设置一个块的长度				
;** 
;** 参    数: UWORD32 length	: 块的长度值	
;**			  			
;** 返 回 值: 0:   正确    >0:   错误码
;**         
;** 作   者: 邓国强
;** 日   期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_set_block_length(UWORD32 length)
{
    UWORD8  param[4] = {0,0,0,0};

⌨️ 快捷键说明

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