📄 mc_commands.c
字号:
UWORD8 resp;
UWORD8 ret;
mc_convert_param(param, length); /* 将参数转化为字节形式 */
ret = mc_send_command(CMD16, param, CMD16_R, &resp);
if (ret != MC_SUCCESS)
return ret; /* 设置块的长度为length失败 */
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
return MC_SUCCESS; /* 返回执行成功*/
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_single_block()
;** 功能描述: 读单块命令
;**
;** 参 数: UWORD32 blockaddr: 块地址
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_single_block(UWORD32 blockaddr)
{
return (mc_block_command(CMD17, CMD17_R, blockaddr)); /* 读单块命令 */
}
/*********************************************************************************************************
;** 函数名称: UWORD8 SD_ReadMultipleBlock()
;** 功能描述: 读多块命令
;**
;** 参 数: UWORD32 blockaddr: 块地址
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_muti_block(UWORD32 blockaddr)
{
return (mc_block_command(CMD18, CMD18_R, blockaddr)); /* 读多块命令*/
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_write_single_block()
;** 功能描述: 写单块命令
;**
;** 参 数: UWORD32 blockaddr: block address
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_write_single_block(UWORD32 blockaddr)
{
return (mc_block_command(CMD24, CMD24_R, blockaddr)); /* 写单块命令 */
}
/*********************************************************************************************************
;** 函数名称:UWORD8 mc_write_muti_block()
;** 功能描述: 写多块命令
;**
;** 参 数: UWORD32 blockaddr: 块地址
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_write_muti_block(UWORD32 blockaddr)
{
return (mc_block_command(CMD25, CMD25_R, blockaddr)); /* 写多块命令*/
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_program_csd()
;** 功能描述: 写CSD寄存器
;**
;** 参 数: UWORD8 *buff : CSD寄存器内容
;** UWORD32 len : CSD寄存器长度
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_program_csd(UWORD32 len, UWORD8 *buff)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp;
UWORD8 ret;
if (len != 16) return MC_ERR_USER_PARAM;
ret = mc_send_command(CMD27, param, CMD27_R, &resp); /* 发送写CSD寄存器命令*/
if (ret != MC_SUCCESS)
return ret;
if (resp != 0)
return MC_ERR_CMD_RESP;
buff[15] = (mc_get_crc7(buff, 15) << 1) + 0x01; /* 计算CSD中的crc 位域*/
return(mc_write_block_data(0, 16, buff));
}
/*********************************************************************************************************
;** 函数名称:UWORD8 mc_erase_start_block()
;** 功能描述:设置块擦除起始地址
;**
;** 参 数: INT32U startblock: 块地址
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_erase_start_block(UWORD32 startblock, UWORD8 sd)
{
if (mc_info.card_type == SD_CARD)
return (mc_block_command(CMD32, CMD32_R, startblock)); /* 发送擦除起始块地址*/
else
return (mc_block_command(CMD35, CMD35_R, startblock)); /* 发送擦除起始块地址*/
}
/*********************************************************************************************************
;** 函数名称:UWORD8 mc_erase_end_block()
;** 功能描述:设置块擦除终止地址
;**
;** 参 数: UWORD32 endblock: 块地址
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_erase_end_block(UWORD8 endblock)
{
if (mc_info.card_type == SD_CARD)
return (mc_block_command(CMD33, CMD33_R, endblock)); /* 发送擦除终止块地址 */
else
return (mc_block_command(CMD36, CMD36_R, endblock)); /* 发送擦除终止块地址 */
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_erase_selected_block()
;** 功能描述: 擦除已选中的块
;**
;** 参 数: none
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_erase_selected_block(void)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp;
UWORD8 tmp;
mc_convert_param(param, 0);
tmp = mc_send_command(CMD38, param, CMD38_R, &resp); /* 擦除所选择的块 */
if (tmp != MC_SUCCESS)
return tmp;
if (mc_wait_busy(MC_WAIT_ERASE) != MC_SUCCESS) /* 等待擦除完成 */
return MC_ERR_TIMEOUT_ERASE;
else
return MC_SUCCESS;
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_ocr()
;** 功能描述: 读操作条件寄存器OCR
;**
;** 参 数: UWORD8 ocrlen : 寄存器长度(固定为4)
;** UWORD8 *recbuf : 接收缓冲区
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_ocr(UWORD8 ocrlen, UWORD8 *recbuf)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp[5];
UWORD8 tmp;
tmp = mc_send_command(CMD58, param, CMD58_R, resp); /* 读 OCR 寄存器命令 */
if (tmp != MC_SUCCESS)
return tmp;
if (resp[0] != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
for (tmp = 0; tmp < 4; tmp++)
recbuf[tmp] = resp[tmp + 1]; /* 复制OCR寄存器内容到接收缓冲区 */
return MC_SUCCESS;
}
/*********************************************************************************************************
;** 函数名称:UWORD8 mc_enable_crc()
;** 功能描述:使能SD卡的CRC校验功能
;**
;** 参 数: UWORD8 bEnable : 1:使能 0:禁止
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
#if MC_CRC_EN
UWORD8 mc_enable_crc(UWORD8 bEnable)
{
UWORD8 param[4];
UWORD8 resp;
UWORD8 ret;
if (bEnable == 1)
param[0] = 1; /* 使能crc */
else
param[1] = 0; /* 禁止crc */
ret = mc_send_command(CMD59, param, CMD59_R, &resp); /* "使能/禁止CRC"命令 */
if (ret != MC_SUCCESS)
return ret;
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
return MC_SUCCESS;
}
#endif
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_scr()
;** 功能描述: 读SD卡的 SCR 寄存器
;**
;** 参 数: UWORD8 scrlen : 寄存器长度(固定为8)
;** UWORD8 *recbuf : 接收缓冲区
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_scr(UWORD8 scrlen, UWORD8 *recbuf)
{
UWORD8 param[4];
UWORD8 resp;
UWORD8 ret;
ret = mc_send_command(CMD55, param, CMD55_R, &resp); /* 后续命令为一个应用命令 */
if (ret != MC_SUCCESS)
return ret;
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
ret = mc_send_command(ACMD51, param, ACMD51_R, &resp); /* 发送读命令*/
if (ret != MC_SUCCESS)
return ret;
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
return (mc_read_block_data(scrlen, recbuf)); /* 读出寄存器内容 */
}
/*********************************************************************************************************
;** 函数名称:UWORD8 mc_get_write_nblock()
;** 功能描述:得到正确写入的块数
;**
;** 参 数: UWORD32 *blocknum: 返回的块数
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -