📄 mc_commands.c
字号:
/****************************************Copyright (c)**************************************************
**
** 公 司
** 部 门
**
** http://www.chipapp.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: mc_command.c
** 创 建 人: 邓国强
** 创建日期: 2006年5月28日
** 描 述: SD/MMC 读写模块: 物理层 ---- SD/MMC 卡SPI模式支持的命令
**
**--------------版本信息--------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 版 本: V1.0
** 日 期: 2006年7月25日
** 描 述: 把COMMAND相关的定义放在一个文件中
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
/***************************************** 全局变量定义 ************************************************/
MC_INFO_STRUCT mc_info; /* SD卡信息结构体变量 */
/***************************************** 函数原型声明 ************************************************/
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_send_command()
;** 功能描述: 向卡发送命令,并取得响应
;**
;** 参 数: UWORD8 cmd : 命令字
;** UWORD8 *param : 命令参数,长度为4字节
;** UWORD8 resptype : 响应类型
;** UWORD8 *resp : 响应,长度为1-5字节
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_send_command(UWORD8 cmd, UWORD8 *param,UWORD8 resptype, UWORD8 *resp)
{
WORD32 i,rlen;
UWORD8 tmp;
UWORD8 array[6];
MC_CS_ENABLE();
/* 发送命令头和命令字 */
array[0] = (cmd & 0x3F) | 0x40;
mc_send_byte(array[0]);
for (i = 3; i >= 0; i--)
{
array[4-i] = param[i];
mc_send_byte(param[i]);
}
#if MC_CRC_EN
tmp = mc_get_cmd_byte6((cmd & 0x3F) | 0x40, param);
mc_send_byte(tmp);
#else
tmp = 0x95;
mc_send_byte(tmp);
#endif
array[5] = tmp;
rlen = 0;
switch (resptype) /* 根据不同的命令,得到不同的响应长度 */
{
case R1:
case R1B: rlen = 1; break;
case R2: rlen = 2; break;
case R3: rlen = 5; break;
default:
tmp = 0xff;
mc_send_byte(tmp);
MC_CS_DISABLE();
return MC_ERR_CMD_RESPTYPE; /* 返回命令响应类型错误 */
break;
}
i = 0;
do /* 等待响应,响应的开始位为0 */
{
tmp = mc_receive_byte();
i++;
}while (((tmp & 0x80) != 0) && (i < MC_CMD_TIMEOUT));
if (i >= MC_CMD_TIMEOUT)
{
MC_CS_DISABLE();
return MC_ERR_CMD_TIMEOUT; /* 返回命令超时 */
}
for (i = rlen - 1; i >= 0; i--)
{
resp[i] = tmp;
tmp = mc_receive_byte();
}
MC_CS_DISABLE();
return MC_SUCCESS; /* 返回执行成功 */
}
/*********************************************************************************************************
;** 函数名称: void mc_convert_param()
;** 功能描述:将32位的参数转为字节形式
;**
;** 参 数: UWORD8 * parameter: 字节参数缓冲区
;** UWORD32 value : 32位参数
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void mc_convert_param(UWORD8 *parameter, UWORD32 value)
{
parameter[3] = (UWORD8)(value >> 24);
parameter[2] = (UWORD8)(value >> 16);
parameter[1] = (UWORD8)(value >> 8);
parameter[0] = (UWORD8)(value);
}
/*********************************************************************************************************
;** 函数名称:UWORD8 mc_block_command()
;** 功能描述:块命令
;**
;** 参 数: UWORD8 cmd : 命令字
;** UWORD8 resptype : 响应类型
;** UWORD32 parameter: 块操作参数
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_block_command(UWORD8 cmd, UWORD8 resptype, UWORD32 parameter)
{
UWORD8 param[4];
UWORD8 resp;
UWORD8 ret;
parameter <<= MC_BLOCKSIZE_NBITS; /* 调整地址:左移9位 */
mc_convert_param(param, parameter); /* 将参数转化为字节形式 */
ret = mc_send_command(cmd, param, resptype, &resp);
if (ret != MC_SUCCESS)
return ret; /* 结束数据传输失败 */
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
return MC_SUCCESS;
}
/*************************************************
SD卡SPI命令
*************************************************/
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_reset(void)
;** 功能描述: 复位SD/MMC卡
;**
;** 参 数: none
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_reset(void)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp;
return (mc_send_command(CMD0, param, CMD0_R, &resp)); /* 复位命令 */
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_csd()
;** 功能描述: 读SD/MMC卡的CSD寄存器
;**
;** 参 数: UWORD8 csdlen : 寄存器长度(固定为16)
;** UWORD8 *recbuf : 接收缓冲区
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_csd(UWORD8 csdlen, UWORD8 *recbuf)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp;
UWORD8 ret;
ret = mc_send_command(CMD9, param, CMD9_R, &resp); /* 读CSD寄存器命令 */
if (ret != MC_SUCCESS)
return ret;
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
return (mc_read_register(csdlen, recbuf));
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_cid()
;** 功能描述: 读SD卡的CID寄存器
;**
;** 参 数: UWORD8 cidlen : 寄存器长度(固定为16)
;** UWORD8 *recbuf : 接收缓冲区
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_cid(UWORD8 cidlen, UWORD8 *recbuf)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp;
UWORD8 ret;
ret = mc_send_command(CMD10, param, CMD10_R, &resp); /* 读CID寄存器命令 */
if ( ret != MC_SUCCESS)
return ret;
if (resp != 0)
return MC_ERR_CMD_RESP; /* 响应错误 */
return (mc_read_register(cidlen, recbuf));
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_stop_transmission()
;** 功能描述: 停止数据传输
;**
;** 参 数:
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_stop_transmission(void)
{
UWORD8 param[4] = {0,0,0,0};
UWORD8 resp;
return (mc_send_command(CMD12, param, CMD12_R, &resp)); /* 结束数据传输命令失败 */
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_read_status()
;** 功能描述: 读SD/MMC卡的 Card Status 寄存器
;**
;** 参 数: UWORD8 len: 寄存器长度(固定为2)
;** UWORD8 *recbuf : 接收缓冲区
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_read_status(UWORD8 len, UWORD8 *buffer)
{
UWORD8 param[4] = {0,0,0,0};
return (mc_send_command(CMD13, param, CMD13_R, buffer)); // 读 Card Status 寄存器
}
/*********************************************************************************************************
;** 函数名称: UWORD8 mc_set_block_length()
;** 功能描述: 设置一个块的长度
;**
;** 参 数: UWORD32 length : 块的长度值
;**
;** 返 回 值: 0: 正确 >0: 错误码
;**
;** 作 者: 邓国强
;** 日 期: 2006年5月29日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD8 mc_set_block_length(UWORD32 length)
{
UWORD8 param[4] = {0,0,0,0};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -