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

📄 sdcmd.c

📁 SD卡的SPI驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_ReadSingleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* command that read single block */
}

/*********************************************************************************************************
** Function name:    SD_ReadMultipleBlock
**
** Descriptions:     Issue read multiple block command 
**                   
** input parameters:   INT32U blockaddr: block address
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_ReadMultipleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD18, CMD18_R, blockaddr)); /* command that read multiple block */
}

/*********************************************************************************************************
** Function name:    SD_WriteSingleBlock
**
** Descriptions:     Issue write single block command
**                   
** input parameters:   INT32U blockaddr: block address
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_WriteSingleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* command that write single block */
}

/*********************************************************************************************************
** Function name:    SD_WriteMultipleBlock
**
** Descriptions:     Issue write multiple block command
**                   
** input parameters:   INT32U blockaddr: block address
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_WriteMultipleBlock(INT32U blockaddr)
{
	return (SD_BlockCommand(CMD25, CMD25_R, blockaddr)); /* command that write multiple block */
}

/*********************************************************************************************************
** Function name:    SD_ProgramCSD
**
** Descriptions:     write CSD register
**                   
** input parameters:   INT8U *buff	  : the content of CSD register	
**                     INT8U len	  : the length of CSD register
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
#if SD_ProgramCSD_EN
int 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); 	/* 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;  	/* calculate crc field in CSD */
		
	return(SD_WriteBlockData(0, 16, buff));
}

/*********************************************************************************************************
** Function name:    SD_GetCRC7
**
** Descriptions:     calculate crc7
**                   
** input parameters:   INT8U *pSource: data	
**                     INT16U len    : data length
**
** Returned value:     CRC7 code
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT8U SD_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;
}	
#endif	

#if SD_EraseBlock_EN

/*********************************************************************************************************
** Function name:    SD_EraseStartBlock
**
** Descriptions:     Select the start block address of erasing operation 
**                   
** input parameters:   INT32U startblock: block address	
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_EraseStartBlock(INT32U startblock)
{
	return (SD_BlockCommand(CMD32, CMD32_R, startblock));	/* send the start block address of erasing operation */
}

/*********************************************************************************************************
** Function name:    SD_EraseEndBlock
**
** Descriptions:     select the end block address of erasing operation  
**                   
** input parameters:   INT32U Length: block address	
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_EraseEndBlock(INT32U endblock)
{
	return (SD_BlockCommand(CMD33, CMD33_R, endblock));     /* 发送擦除终止块地址 send the end block address of erasing operation */
}


/*********************************************************************************************************
** Function name:    SD_EraseSelectedBlock
**
** Descriptions:     Erase block selected 
**                   
** input parameters:   None
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int 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;									
}	
#endif

/*********************************************************************************************************
** Function name:    SD_ReadOCR
**
** Descriptions:     Read OCR register of SD card 
**                   
** input parameters:   INT8U ocrlen  : len of register (fixed,is 4)
**                     INT8U *recvbuf: received buffer
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
int SD_ReadOCR(INT8U ocrlen, INT8U *recvbuf)
{
    INT8U param[4] = {0,0,0,0},resp[5],tmp;

    tmp = SD_SendCmd(CMD58, param, CMD58_R, resp);			
    if (tmp != SD_NO_ERR)									/* read OCR register command */
    	return tmp;		 										
    												
    if (resp[0] != 0)
        return SD_ERR_CMD_RESP;			 					/* response is error */
    
    for (tmp = 0; tmp < 4; tmp++)
    	recvbuf[tmp] = resp[tmp + 1];						
    
    return SD_NO_ERR;
}

/*********************************************************************************************************
** Function name:    SD_EnableCRC
**
** Descriptions:     Enable crc check of SD Card 
**                   
** input parameters:   INT8U bEnable : 1:enable  0: disable
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
#if SD_CRC_EN
int SD_EnableCRC(INT8U bEnable)
{
	INT8U param[4],resp,ret;
		
	if (bEnable == 1)
		param[0] = 1;											/* enable crc */
	else
		param[1] = 0; 											/* disalbe crc */

	ret = SD_SendCmd(CMD59, param, CMD59_R, &resp);				/* enable/disable crc command */
	if (ret != SD_NO_ERR)
        return ret;							 
    
    if (resp != 0)    
       	return SD_ERR_CMD_RESP;									/* response is error */		
 	
	return SD_NO_ERR;

}
#endif

/*********************************************************************************************************
** Function name:    SD_ReadSD_Status
**
** Descriptions:     read SD_Status register of sd card 
**                   
** input parameters:   INT8U sdslen: len of register (fixed,is 64)
**                     INT8U *recvbuf: received buffer
**
** Returned value:     SD_NO_ERR:  successful
**                     Others   :  fail,errors occur
**                       
**         
** Used global variables: None
** Calling modules:       
**
** Created by:        Ming Yuan Zheng
** Created Date:      2005-1-6
**-------------------------------------------------------------------------------------------------------
** Modified by:       Jing.Zhang
** Modified date:     2005-12-21
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/	
#if SD_ReadSD_Status_EN
int SD_ReadSD_Status(INT8U sdslen, INT8U *recvbuf)
{
    INT8U param[4] = {0,0,0,0},resp[2],ret;
    
    ret = SD_SendCmd(CMD55, param, CMD55_R, resp);			
    if (ret != SD_NO_ERR)
    	return ret;											/* command that the followed commnad is a specific application */
    												 
    if (resp[0] != 0)
        return SD_ERR_CMD_RESP;								/* response is error */
    
    ret = SD_SendCmd(ACMD13, param, ACMD13_R, resp);		/* SD_Status */
    if (ret != SD_NO_ERR)
    	return ret;											/* command that read SD_Status register */
   												
    if ((resp[0] != 0) || (resp[1] != 0))
        return SD_ERR_CMD_RESP;								/* response is error */
        
	return (SD_ReadBlockData(sdslen, recvbuf));				/* read the content of the register */
}
#endif


/*********************************************************************************************************
** Function name:    SD_ReadSCR
**
** Descriptions:     read SCR register of sd card 
**                   
** input parameters:   INT8U scrlen	 : len of register (fixed,is 8)

⌨️ 快捷键说明

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