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