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

📄 cjsd.c

📁 没有谁会编写低速模式的下的SDHC驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
        return ret;							 
    
    if (resp != 0)    
       	return SD_ERR_CMD_RESP;									/* 响应错误 response is error */		
 	
	return SD_NO_ERR;

}
#endif

/*********************************************************************************************************************
** 函数名称: unsigned char SD_Read_SD_Status()				     Name:	   unsigned char SD_Read_SD_Status()
** 功能描述: 读SD卡的 SD_Status 寄存器				     Function: read SD_Status register of sd card 
** 输   入: unsigned char sdslen  		: 寄存器长度(固定为64)	 Input:    unsigned char sdslen: len of register (fixed,is 64)
			 unsigned char *recbuf 		: 接收缓冲区				       unsigned char *recbuf: recbuffer	
** 输   出: 0:   正确    >0:   错误码		  			 Output:	  0:  right		>0:  error code
**********************************************************************************************************************/
#if SD_ReadSD_Status_EN
unsigned char SD_ReadSD_Status(unsigned char sdslen, unsigned char *recbuf)
{
    unsigned char 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, recbuf));				/* 读出寄存器内容 read the content of the register */
}
#endif

/*******************************************************************************************************************
** 函数名称: unsigned char SD_ReadSCR()							Name:	  unsigned char SD_ReadSCR()
** 功能描述: 读SD卡的 SCR 寄存器						Function: read SCR register of sd card 
** 输   入: unsigned char scrlen  		: 寄存器长度(固定为8) 	Input:    unsigned char scrlen		 : len of register (fixed,is 8)
			 unsigned char *recbuf 		: 接收缓冲区					  unsigned char *recbuf		 : recbuffer	
** 输   出: 0:   正确    >0:   错误码		  			Output:	  0:  right		>0:  error code
********************************************************************************************************************/
#if SD_ReadSCR_EN
unsigned char SD_ReadSCR(unsigned char scrlen, unsigned char *recbuf)
{
    unsigned char param[4] = {0,0,0,0},resp,ret;
    
    ret = SD_SendCmd(CMD55, param, CMD55_R, &resp);					/* 后续命令为一个应用命令 */
    if (ret != SD_NO_ERR)											/* command that the followed commnad is a specific application */
    	return ret;													
    												 
    if (resp != 0)
        return SD_ERR_CMD_RESP;										/* 响应错误 response is error */
    
    ret = SD_SendCmd(ACMD51, param, ACMD51_R, &resp);   			/* 发送读 SD_Status 命令*/
    if (ret != SD_NO_ERR)											/* command that read SD_Status register */
   		return ret;													
				    															
    if (resp != 0)
        return SD_ERR_CMD_RESP;						 				/* 响应错误 response is error */
        
	return (SD_ReadBlockData(scrlen, recbuf));	 	/* 读出寄存器内容 read the content of the register */
}
#endif

/********************************************************************************************************************
** 函数名称: unsigned char SD_GetNumWRBlcoks()				Name:	  unsigned char SD_GetNumWRBlcoks()
** 功能描述: 得到正确写入的块数						Function: get the block numbers that written correctly
** 输   入: unsigned long *blocknum: 返回的块数			Input:	  unsigned long blocknum	: the block numbers returned
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
#if SD_WriteMultiBlock_EN
unsigned char SD_GetNumWRBlcoks(unsigned long *blocknum)
{
    unsigned char tmp[4] = {0,0,0,0},resp,ret;
  
    ret = SD_SendCmd(CMD55, tmp, CMD55_R, &resp);	  			/* 后续命令为一个应用命令 */
    if (ret != SD_NO_ERR) 										/* command that the followed commnad is a specific application */
    	return ret;
    	 
    if (resp != 0)
    	return SD_ERR_CMD_RESP;    	
 											
   	ret = SD_SendCmd(ACMD22, tmp, ACMD22_R, &resp);  			/* 读取正确写入的块数命令 */
   	if (ret != SD_NO_ERR)										/* command that read the numbers of block written correctly */
   		return ret;											    
   		 														
	if (resp != 0)
    	return SD_ERR_CMD_RESP;									/* 响应错误 response is error */
    		
    ret = SD_ReadBlockData(4, tmp);								/* 读块数 read the numbvers of block */
    if (ret != SD_NO_ERR)
    	return ret;
    	
    *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];	
    															/* 转换为32位 change to 32 bits */

	return SD_NO_ERR;    										/* 返回执行成功 return perform sucessfully */		
}
#endif

		/*********************************************************
		
		    			下面为一些数据传输函数
		
		**********************************************************/

/********************************************************************************************************************
** 函数名称: unsigned char SD_ReadRegister()				Name:	  unsigned char SD_ReadRegister()
** 功能描述: 从SD卡读取数据							Function: read data from SD card
** 输   入: unsigned long len	  : 长度					Input:	  unsigned long len   : length
			 unsigned char *recbuf: 接收缓冲区					 	  unsigned char *recbuf: receive buffer
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
unsigned char SD_ReadRegister(unsigned long len, unsigned char *recbuf)
{	
	unsigned long i = 0;
	unsigned char resp;

    SPI_CS_Assert();
    do{    											/* 等待数据起始令牌 wait for data start token */
        resp = SPI_RecByte();
    	i++;
    }while((resp == 0xFF) && (i < SD_READREG_TIMEOUT));    
    
    if (i >= SD_READREG_TIMEOUT)
    {
    	SPI_CS_Deassert();
    	return SD_ERR_TIMEOUT_READ;					/* 超时, 返回错误 timeout, return error */
  	}
  	
   	if (resp != SD_TOK_READ_STARTBLOCK)				
   	{												/* 不是收到数据起始令牌 not receive data start token */
		recbuf[0] = resp;							
		i = 1;										/* 还有len - 1个字节要接收 still len - 1 bytes will be received */
   	}
   	else
   		i = 0;										/* 收到数据起始令牌,还有len个字节要接收 received data start token,still len bytes will be received */
   	  	
    for (; i < len; i++)
   		recbuf[i] = SPI_RecByte();					/* 接收数据 receive data */
   		
    i = SPI_RecByte();								
    i = (i << 8) + SPI_RecByte();    				/* 读取16位CRC get 16-bit CRC */	

#if SD_CRC_EN 
   	if (i != SD_GetCRC16(recbuf, len))
   	{												/* CRC校验错误 CRC check is error */
   		SPI_CS_Deassert();
   		SPI_SendByte(0xFF);    						
  		return SD_ERR_DATA_CRC16;					/* 返回RCR16错误  return error of CRC16 */				
  	}    
#endif   
  
    SPI_SendByte(0xFF);								/* 返回之前发送8个clock  clock out 8 clk before return */
    SPI_CS_Deassert();	
    	
	return SD_NO_ERR;
}	

/*******************************************************************************************************************
** 函数名称: unsigned char SD_ReadBlockData()			Name:	  unsigned char SD_ReadBlockData()
** 功能描述: 从SD卡中读取数据块					Function: read block data from sd card
** 输   入: unsigned long len    : 长度				Input:	  unsigned long len    : length
			 unsigned char *recbuf : 接收缓冲区					  unsigned char *recbuf : the buffer of receive
** 输   出: 0:   正确    >0:   错误码		  	Output:	  0:  right		>0:  error code
*******************************************************************************************************************/
unsigned char SD_ReadBlockData(unsigned long len, unsigned char *recbuf)
{
    unsigned char tmp;
    unsigned long i = 0;
    
    SPI_CS_Assert();    
    do
    { 											    /* 等待接收数据开始令牌0xFE  wait for receiving data start token 0xFE */
        tmp = SPI_RecByte();
        i++;
     }while((tmp == 0xFF) && (i < sds.timeout_read));
	
	if (i >= sds.timeout_read)
	{
		SPI_CS_Deassert();
       	return SD_ERR_TIMEOUT_READ;					/* 返回读超时错误码  return error timeout error code of reading */
	}
		
	if (tmp != SD_TOK_READ_STARTBLOCK)				/* 块读开始令牌错误 read start block token is error */
	{
		SPI_SendByte(0xFF);
		SPI_CS_Deassert();
		return SD_ERR_DATA_START_TOK;
	}
	
	for (i = 0; i < len; i++)
   		recbuf[i] = SPI_RecByte();					/* 接收数据 receive data */
   		
    i = SPI_RecByte();								
    i = (i << 8) + SPI_RecByte();    				/* 读取16位CRC get 16-bit CRC */	

#if SD_CRC_EN 
   	if (i != SD_GetCRC16(recbuf, len))
   	{												/* CRC校验错误 CRC check is error */
   		SPI_SendByte(0xFF); 
   		SPI_CS_Deassert();  						
  		return SD_ERR_DATA_CRC16;					/* 返回CRC16错误  return error of CRC16 */				
  	}    
#endif   

	SPI_SendByte(0xFF); 
	SPI_CS_Deassert();

  	return SD_NO_ERR;								/* 返回函数执行成功 return function perform sucessfully */
}

/*******************************************************************************************************************
** 函数名称: unsigned char SD_WriteBlockData()				Name:	  unsigned char SD_WriteBlockData()
** 功能描述: 向sd卡写数据块							Function: write block data to sd card
** 输   入: unsigned char bmulti  : 是否为多块操作1:是0:否 Input:	  unsigned char bmulti   : multi blocks operate 1:Y 0:N 
			 unsigned long len    : 长度						  	  unsigned long len     : length
			 unsigned char *sendbuf: 发送缓冲区					 	  unsigned char *sendbuf : the buffer of send
** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
********************************************************************************************************************/
unsigned char SD_WriteBlockData(unsigned char bmulti, unsigned long len, unsigned char *sendbuf)
{
	unsigned short i;
	unsigned char tmp;

	SPI_CS_Assert();
		
    SPI_SendByte(0xFF);								/* 开始发送数据之前发送8个clock clock out 8 clk before start */
    
    if (bmulti == 1)
        SPI_SendByte(SD_TOK_WRITE_STARTBLOCK_M);	/* 写多块开始令牌 start token of write multi blocks */
	else
		SPI_SendByte(SD_TOK_WRITE_STARTBLOCK);		/* 写单块开始令牌 start token of write single block */

	for (i = 0; i < len; i++)
        SPI_SendByte(sendbuf[i]);					/* 发送数据 send data */

#if SD_CRC_EN	
	i = SD_GetCRC16(sendbuf,len);					/* 计算CRC16 calculate CRC16 */
#endif

	SPI_SendByte((i >> 8) & 0xFF);
	SPI_SendByte(i & 0xFF); 						/* 发送CRC16校验码 send CRC16 check code */
			    
	tmp = SPI_RecByte();
  	if ((tmp & SD_RESP_DATA_MSK) != SD_RESP_DATA_ACCETPTED)	
  	{		
   		SPI_SendByte(0xFF);							/* 返回之前发送8个clock  clock out 8 clk before return */
   		SPI_CS_Deassert();
   		return SD_ERR_DATA_RESP;					/* 数据响应错误 data response error */
    }
        
    SPI_CS_Deassert();
     		
    if (SD_WaitBusy(SD_WAIT_WRITE) != SD_NO_ERR)			
    	return SD_ERR_TIMEOUT_WRITE;				/* 写入超时 write time out */
    else
    	return SD_NO_ERR; 							/* 写入正确 write right */
 }

/*******************************************************************************************************************
** 函数名称: void SD_StopMultiToken()				Name:	  void SD_StopMultiToken(void)

⌨️ 快捷键说明

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