📄 sdcmd.c
字号:
**
** 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 + -