📄 mc_operations.c
字号:
ret = MC_ERR_VOL_NOTSUSP; /* 不支持3.3V,返回错误码 */
goto MC_SD_ERR;
}
MC_CLK_MAX(); /* 9. 设置SPI时钟到最大值 */
#if MC_CRC_EN
ret = mc_enable_crc(1); /* 使能CRC校验 enable CRC check */
if (ret != MC_SUCCESS)
goto MC_SD_ERR;
#endif
ret = mc_set_block_length(MC_BLOCK_SIZE); /* 10. 设置块的长度: 512Bytes */
if (ret != MC_SUCCESS)
goto MC_SD_ERR;
ret = mc_get_card_info(); /* 11. 读CSD寄存器,获取SD/MMC卡信息 */
if (ret != MC_SUCCESS)
goto MC_SD_ERR;
return MC_SUCCESS;
MC_SD_ERR:
return ret;
}
/*********************************************************************************************************
** 函数名称: mc_erase_block
** 功能描述: MMC/SD按块檫出
**
** 参 数: blockaddr:块地址, blocknum: 块个数
**
** 返 回 值: error type
**
** 作 者: 罗辉联
** 日 期: 2006年6月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日 期: 2006年7月25日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
MC_RESULT_T mc_erase_block(UWORD32 blockaddr,UWORD32 blocknum)
{
WORD32 tmp;
UWORD8 ret;
if(MC_CARD_INSERTED_STATUS() == 0)
return MC_ERR_NO_CARD;
if ((blockaddr + blocknum) > mc_info.block_num)
return MC_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 */
if (MC_WP_STATUS() == 1)
return MC_ERR_WRITE_PROTECT; /* 卡有写保护 */
tmp = blocknum - mc_info.erase_unit; /* 一次最多只能檫出mc_info.erase_unit个块 */
while(tmp >= 0) /* 每次擦除扇区 */
{
ret = mc_erase_start_block(blockaddr,1); /* 选择起始块地址 */
if (ret != MC_SUCCESS)
{
return ret;
}
ret = mc_erase_end_block(blockaddr + mc_info.erase_unit - 1);/* 选择终止块地址 */
if (ret != MC_SUCCESS)
{
return ret;
}
ret = mc_erase_selected_block(); /* 擦除所选的块 */
if (ret != MC_SUCCESS)
{
return ret;
}
blockaddr += mc_info.erase_unit; /* 起始地址递增 */
blocknum -= mc_info.erase_unit;
tmp = blocknum - mc_info.erase_unit;
};
if (blocknum > 0) /* 擦除不够once_erase块 */
{
ret = mc_erase_start_block(blockaddr,1); /* 选择起始块地址 */
if (ret != MC_SUCCESS)
{
return ret;
}
ret = mc_erase_end_block(blockaddr + mc_info.erase_unit - 1);/* 选择终止块地址 */
if (ret != MC_SUCCESS)
{
return ret;
}
ret = mc_erase_selected_block(); /* 擦除所选的块 */
if (ret != MC_SUCCESS)
{
return ret;
}
}
return MC_SUCCESS;
}
/*********************************************************************************************************
** 函数名称: mc_read_block
** 功能描述: 读MMC/SD的块
**
** 参 数: blockaddr:块地址, blocknum: 块个数, recbuf:读缓冲区
**
** 返 回 值: error type
**
** 作 者: 罗辉联
** 日 期: 2006年6月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日 期: 2006年7月25日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
MC_RESULT_T mc_read_block(UWORD32 blockaddr,UWORD32 blocknum,UWORD8* recbuf)
{
UWORD8 ret;
UWORD32 i;
if(MC_CARD_INSERTED_STATUS() == 0)
return MC_ERR_NO_CARD;
if(blocknum == 1) /* 只读一个块 */
{
if (blockaddr > mc_info.block_num)
return MC_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 */
ret = mc_read_single_block(blockaddr); /* 读单块命令 */
if (ret != MC_SUCCESS)
return ret;
ret = mc_read_block_data(MC_BLOCK_SIZE, recbuf); /* 读出数据 */
}
else /* 读多块 */
{
if ((blockaddr + blocknum) > mc_info.block_num)
return MC_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 */
ret = mc_read_muti_block(blockaddr); /* 读多块命令 */
if (ret != MC_SUCCESS)
return ret;
for (i = 0; i < blocknum; i++)
{ /* 读出数据 */
ret = mc_read_block_data(MC_BLOCK_SIZE, recbuf);
if (ret == MC_SUCCESS)
recbuf = recbuf + MC_BLOCK_SIZE;
else
return ret;
}
ret = mc_stop_transmission(); /* 结束数据传输 */
}
return ret;
}
/*********************************************************************************************************
** 函数名称: mc_write_block
** 功能描述: 写MMC/SD的块
**
** 参 数: blockaddr:块地址, blocknum: 块个数, recbuf:读缓冲区
**
** 返 回 值: error type
**
** 作 者: 罗辉联
** 日 期: 2006年6月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日 期: 2006年7月25日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
MC_RESULT_T mc_write_block(UWORD32 blockaddr,UWORD32 blocknum,UWORD8* sendbuf)
{
UWORD32 i;
UWORD8 ret;
UWORD8 tmp[2];
if(MC_CARD_INSERTED_STATUS() == 0)
return MC_ERR_NO_CARD;
if (MC_WP_STATUS() == 1)
return MC_ERR_WRITE_PROTECT; /* 卡有写保护 */
if(blocknum == 1) /* 只写一块 */
{
if (blockaddr > mc_info.block_num)
return MC_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 */
ret = mc_write_single_block(blockaddr); /* 写单块命令 */
if (ret != MC_SUCCESS)
return ret;
ret = mc_write_block_data(0, MC_BLOCK_SIZE, sendbuf); /* 写入数据 */
if (ret == MC_SUCCESS) /* 读状态寄存器,检查写入是否成功*/
{
ret = mc_read_status(2, tmp);
if (ret != MC_SUCCESS)
return ret; /* 读寄存器失败 */
if((tmp[0] != 0) || (tmp[1] != 0))
ret = MC_ERR_WRITE_BLK; /* 响应指示写失败 */
}
}
else /* 写多个块 */
{
if ((blockaddr + blocknum) > mc_info.block_num)
return MC_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 */
ret = mc_write_muti_block(blockaddr); /* 写单块命令 */
if (ret != MC_SUCCESS)
return ret;
for (i = 0; i < blocknum; i++)
{ /* 写入数据 */
ret = mc_write_block_data(1,MC_BLOCK_SIZE, sendbuf);
if (ret == MC_SUCCESS)
sendbuf = sendbuf + MC_BLOCK_SIZE;
else
{ /* 写失败 */
mc_stop_transmission(); /* 停止数据传输 */
mc_wait_busy(MC_WAIT_WRITE); /* 等待 */
return ret;
}
}
mc_stop_multi_token(); /* 发送数据停止令牌 */
ret = mc_wait_busy(MC_WAIT_WRITE); /* 等待写入的完成 */
if(ret != MC_SUCCESS)
return MC_ERR_TIMEOUT_WRITE;
if(mc_info.card_type == SD_CARD)
{
ret = mc_get_write_nblock(&i); /* 读正确写入的块数 */
if (ret != MC_SUCCESS)
return ret;
if(i != blocknum)
ret = MC_ERR_WRITE_BLKNUMS; /* 正确写入块数错误 */
}
else
{
ret = mc_read_status(2, tmp);
if (ret != MC_SUCCESS)
return ret;
/* 读寄存器失败 */
if((tmp[0] != 0) || (tmp[1] != 0))
ret = MC_ERR_WRITE_BLK; /* 响应指示写失败 */
}
}
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -