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

📄 sdcmd.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 5 页
字号:
/***********************************
  CMD12: 停止传输Stop Transmission
************************************/
/*******************************************************************************************************************
** 函数名称: SdCmd_Send_Stop()				
**
** 功能描述: CMD12, 停止数据传输命令
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: 该命令的argument域不必关心, 当主机需要停止读多个数据块或停止写多个数据块时调用该函数
********************************************************************************************************************/
INT8U SpiCmd_Stop_Transmission(sd_struct *sds)
{
	INT8U param[4] = {0,0,0,0},resp;
	
 	return (SdSpi_SendCmd(sds, CMD12, param, CMD12_R, &resp));		/* 结束数据传输命令失败 stop transmission command fail */
}



/*********
  CMD13
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Send_Status()				
**
** 功能描述: 读SD/MMC卡的 Card Status 寄存器
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT8U len       : 寄存器长度(固定为2)  
**
** 输   出: INT8U *recbuf : 接收缓冲区
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: 
********************************************************************************************************************/
INT8U SpiCmd_Send_Status(sd_struct *sds, INT8U len, INT8U *buffer)
{
    INT8U param[4] = {0,0,0,0};

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


/*********
  CMD16 
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Set_BlockLen()				
**
** 功能描述: 设置卡的数据块长度
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT32U length	 : 数据块的长度值  
**
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: 通常卡的一个读数据块长度与一个写数据块长度一样
********************************************************************************************************************/
INT8U SpiCmd_Set_BlockLen(sd_struct *sds, INT32U length)
{
	INT8U param[4],resp,ret;
  
    SdSpi_PackParam(param, length);					/* 将参数转化为字节形式 change the parameter to bytes form */
          												
    ret = SdSpi_SendCmd(sds, 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 */			
}


/*********
  CMD17 
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Read_Single_Block()				
**
** 功能描述: 读单块命令
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT32U blockaddr: 块地址  
**
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: blockaddr是以块为单位的块地址
********************************************************************************************************************/
INT8U SpiCmd_Read_Single_Block(sd_struct *sds, INT32U blockaddr)
{
	return (SdSpi_BlockCommand(sds, CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */
}


/*********
  CMD18 
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Read_Single_Block()				
**
** 功能描述: 读多块命令
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT32U blockaddr: 块地址  
**
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: blockaddr是以块为单位的块地址
********************************************************************************************************************/
INT8U SpiCmd_Read_Multiple_Block(sd_struct *sds, INT32U blockaddr)
{
	return (SdSpi_BlockCommand(sds, CMD18, CMD18_R, blockaddr)); /* 读多块命令 command that read multiple block */
}


/*********
  CMD24 
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Write_Single_Block()				
**
** 功能描述: 写单块命令
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT32U blockaddr: 块地址  
**
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: blockaddr是以块为单位的块地址
********************************************************************************************************************/
INT8U SpiCmd_Write_Single_Block(sd_struct *sds, INT32U blockaddr)
{
	return (SdSpi_BlockCommand(sds, CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */
}


/*********
  CMD25 
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Write_Multiple_Block()				
**
** 功能描述: 写多块命令
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT32U blockaddr: 块地址  
**
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: blockaddr是以块为单位的块地址
********************************************************************************************************************/
INT8U SpiCmd_Write_Multiple_Block(sd_struct *sds, INT32U blockaddr)
{
	return (SdSpi_BlockCommand(sds, CMD25, CMD25_R, blockaddr)); /* 写多块命令 command that write multiple block */
}


/*********
  CMD25 
**********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_Program_CSD()				
**
** 功能描述: 写CSD寄存器
**
** 输   入: sd_struct *sds  : SD/MMC卡信息结构体
**	         INT8U *buff   	 : CSD寄存器内容  
**           INT8U len	  	 : CSD寄存器长度  
** 
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: 
********************************************************************************************************************/
INT8U SpiCmd_Program_CSD(sd_struct *sds, INT8U len, INT8U *buff)
{
	INT8U param[4] = {0,0,0,0},resp,ret;
	
	if (len != 16) return SD_ERR_USER_PARAM;

	ret = SdSpi_SendCmd(sds, 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] = (SdSpi_GetCRC7(buff, 15) << 1) + 0x01;  	        /* 计算CSD中的crc 位域 calculate crc field in CSD */
		
	return(SdSpi_WriteBlockData(sds, 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 SdSpi_GetCRC7(INT8U *pSource, INT16U len)
{
	INT8U i = 0, 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;
}	
	

#if SD_EraseBlock_EN
/***************
  CMD32或CMD35 
***************/
/*******************************************************************************************************************
** 函数名称: SdCmd_Erase_Wr_Blk_Start()				
**
** 功能描述: 设置块擦除起始地址
**
** 输   入: sd_struct *sds    : SD/MMC卡信息结构体
**	         INT32U startblock : 块地址
** 
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: startblock是以块为单位的块地址
********************************************************************************************************************/
INT8U SdCmd_Erase_Wr_Blk_Start(sd_struct *sds, INT32U startblock)
{
	if (sds->card_type == CARDTYPE_SD)
		return (SdSpi_BlockCommand(sds, CMD32, CMD32_R, startblock));	/* 发送擦除起始块地址 send the start block address of erasing operation */
	else
		return (SdSpi_BlockCommand(sds, CMD35, CMD35_R, startblock));	/* 发送擦除起始块地址 send the start block address of erasing operation */
}


/*****************
  CMD33 或 CMD36
*****************/
/*******************************************************************************************************************
** 函数名称: SdCmd_Erase_Wr_Blk_End()				
**
** 功能描述: 设置块擦除终止地址
**
** 输   入: sd_struct *sds    : SD/MMC卡信息结构体
**	         INT32U endblock   : 块地址
** 
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: startblock是以块为单位的块地址
********************************************************************************************************************/
INT8U SdCmd_Erase_Wr_Blk_End(sd_struct *sds, INT32U endblock)
{
	if (sds->card_type == CARDTYPE_SD)
		return (SdSpi_BlockCommand(sds, CMD33, CMD33_R, endblock));     /* 发送擦除终止块地址 send the end block address of erasing operation */
	else
		return (SdSpi_BlockCommand(sds, CMD36, CMD36_R, endblock));     /* 发送擦除终止块地址 send the end block address of erasing operation */
}


/*****************
  CMD38
*****************/
/*******************************************************************************************************************
** 函数名称: SdCmd_Erase()				
**
** 功能描述: 擦除已选中的块
**
** 输   入: sd_struct *sds    : SD/MMC卡信息结构体
** 
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
**
** 注	 意: startblock是以块为单位的块地址
********************************************************************************************************************/
INT8U SdCmd_Erase(sd_struct *sds)
{
	INT8U param[4],resp,tmp;
	
	SdSpi_PackParam(param, 0);
	
	tmp = SdSpi_SendCmd(sds, CMD38, param, CMD38_R, &resp);	 	    /* 擦除所选择的块  erase blocks selected */
	if (tmp != SD_NO_ERR)
		return tmp;							 	
	
	if (SdSpi_WaitBusy(sds, SD_WAIT_ERASE) != SD_NO_ERR)			/* 等待擦除完成 wait for finishing erasing */
		return SD_ERR_TIMEOUT_ERASE;
	else
		return SD_NO_ERR;									
}	
#endif


/*****************
  CMD58
*****************/
/*******************************************************************************************************************
** 函数名称: SpiCmd_ReadOCR()				
**
** 功能描述: 读所选择的卡的操作条件寄存器OCR
**
** 输   入: sd_struct *sds   : SD/MMC卡信息结构体
**
** 输   出: INT32U *ocrbuf   : OCR寄存器内容, 长度为1 
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件
********************************************************************************************************************/
INT8U SpiCmd_ReadOCR(sd_struct *sds, INT32U *ocrbuf)
{
    INT8U param[4] = {0,0,0,0},resp[5],tmp;

    tmp = SdSpi_SendCmd(sds, CMD58, param, CMD58_R, resp);	/* 读 OCR 寄存器命令 */
    if (tmp != SD_NO_ERR)								/* read OCR register command */
    	return tmp;		 										
    												
    if (resp[4] != 0)
        return SD_ERR_CMD_RESP;			 				/* 响应错误 response is error */
          
    *ocrbuf = (resp[3] << 24) + (resp[2] << 16) +
              (resp[1] << 8) + resp[0];                 /* 复制OCR寄存器内容到接收缓冲区 */
            
    return SD_NO_ERR;
}


/********
  CMD59
*********/
/*******************************************************************************************************************
** 函数名称: SpiCmd_CRC_ON_OFF()				
**
** 功能描述: SPI模式下, 使能主机与卡之间的数据传输是否使用CRC校验
**
** 输   入: sd_struct *sds   : SD/MMC卡信息结构体
**           INT8U bEnable    : 1: 使能;  0: 禁止 
**
** 输   出: 无
**
** 返 回 值: 0:   正确    >0:   错误码, 见 sddriver.h 文件

⌨️ 快捷键说明

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