⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mc_commands.h

📁 用于arm(STR710系列)对sd卡的操作
💻 H
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                         STR710 Development team
**                                        
**
**                                 
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: mc_command.h
** 创 建 人:DGQ
** 创建日期: 2006年5月28日
** 描    述: SD/MMC 读写模块: 物理层 ---- SD/MMC 卡SPI模式支持的命令(头文件) 
**
**--------------版本信息--------------------------------------------------------------------------------
** 修 改 人: lhl
** 版    本: V1.0
** 日   期: 2006年7月25日
** 描   述: 把COMMAND相关的定义放在一个文件中
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#ifndef __MC_COMMANDS_H
#define __MC_COMMANDS_H


/*****************************************************************************************************

     							MMC/SD卡SPI模式下命令集

*****************************************************************************************************/

/********************************************* 基本命令集  ******************************************/
/* 复位SD卡到空闲状态命令  */
#define CMD0 0
#define CMD0_R R1

/* 读OCR寄存器命令(MMC Mode 不使用该命令)*/
#define CMD1 1
#define CMD1_R R1

/* 读CSD寄存器命令 */
#define CMD9 9
#define CMD9_R R1

/* 读CID寄存器命令 */
#define CMD10 10
#define CMD10_R R1

/* 停止读多块时的数据传输命令 */
#define CMD12 12
#define CMD12_R R1B

/* 读 Card_Status 寄存器命令 */
#define CMD13 13
#define CMD13_R R2

/************************************************* 块读命令集  **************************************/

/* 设置块的长度命令 */
#define CMD16 16
#define CMD16_R R1

/* 读单块命令 */
#define CMD17 17
#define CMD17_R R1

/* 读多块,直至主机发送CMD12为止命令 */
#define CMD18 18
#define CMD18_R R1

/********************************************* 块写命令集 *******************************************/
/* 写单块命令 */
#define CMD24 24
#define CMD24_R R1

/* 写多块命令*/
#define CMD25 25
#define CMD25_R R1

/* 写CSD寄存器命令 */
#define CMD27 27
#define CMD27_R R1

/****************************************************** 写保护  ***************************************/
/* 设置写保护命令 */
#define CMD28 28
#define CMD28_R R1B

/* 清楚写保护命令 */
#define CMD29 29
#define CMD29_R R1B

/* 获得卡写保护状态命令 */
#define CMD30 30
#define CMD30_R R1

/**************************************************** 擦除命令 ****************************************/
/* 设置擦除块的起始地址(只用于SD卡)命令 */
#define CMD32 32
#define CMD32_R R1

/* 设置擦除块的终止地址(只用于SD卡) 命令 */
#define CMD33 33
#define CMD33_R R1

/* 设置擦除块的起始地址(只用于MMC卡) 命令 */
#define CMD35 35
#define CMD35_R R1

/* 设置擦除块的终止地址(只用于MMC卡)命令 */
#define CMD36 36
#define CMD36_R R1

/* 擦除所选择的块命令 */
#define CMD38 38
#define CMD38_R R1B

/****************************************************** 锁卡命令  *************************************/
/* 设置/复位密码或上锁/解锁卡命令 */
#define CMD42 42
#define CMD42_R	R1B

/* Commands from 42 to 54, not defined here */

/***************************************************** 应用命令  ***************************************/
/* 禁止下一个命令为应用命令*/
#define CMD55 55
#define CMD55_R R1

/* 应用命令的通用I/O命令 */
#define CMD56 56
#define CMD56_R R1

/* 读OCR寄存器命令*/
#define CMD58 58
#define CMD58_R R3

/* 使能或禁止命令*/
#define CMD59 59
#define CMD59_R R1

/**************************************************** 应用命令  *************************v**************/
/* 获取 SD Status寄存器命令 */
#define ACMD13 13
#define ACMD13_R R2

/* 得到已写入卡中的块的个数命令 */
#define ACMD22 22
#define ACMD22_R R1

/* 在写之前,设置预先擦除的块的个命令 */
#define ACMD23 23
#define ACMD23_R R1

/* 读取OCR寄存器命令 */
#define ACMD41 41
#define ACMD41_R R1

/* 连接/断开CD/DATA[3]引脚上的上拉电阻命令 */
#define ACMD42 42
#define ACMD42_R R1

/* 读取SCR寄存器命令 */
#define ACMD51 51
#define ACMD51_R R1



/* CSD中一些域的字节位置(高字节在前) */
#define TAAC_POS 			1				//TACC
#define NSAC_POS			2				//NSAC

#define READ_BL_LEN_POS		5				//READ_BL_LEN

#define C_SIZE_POS1			6				//C_SIZE upper  2-bit
#define C_SIZE_POS2			7				//C_SIZE middle 8-bit
#define C_SIZE_POS3			8				//C_SIZE lower	2-bit

#define C_SIZE_MULT_POS1	9				//C_SIZE_MULT upper 2-bit
#define C_SIZE_MULT_POS2	10				//C_SIZE_MULT lower 1-bit	

#define SECTOR_SIZE_POS1	10				//SECTOR_SIZE upper 5-bit
#define SECTOR_SIZE_POS2	11				//SECTOR_SIZE lower 2-bit

#define R2WFACTOR_POS 		12				//R2WFACTOR_POS

/**/
#define ERASE_GRP_SIZE_POS   	10			//MMC卡 ERASE_GRP_SIZE 5-bit
#define ERASE_GRP_MULTI_POS1 	10			//MMC卡 ERASE_GRP_MULTI 2-bit
#define ERASE_GRP_MULTI_POS2 	11			//MMC卡 ERASE_GRP_MULTI 3-bit


//CSD中一些域的掩码
#define TAAC_MSK			0x07			//TACC 域掩码
#define NSAC_MSK			0x78			//NSAC 域掩码

#define READ_BL_LEN_MSK		0x0F			//READ_BL_LEN 的掩码

#define C_SIZE_MSK1			0x03			//C_SIZE 高2位掩码
#define C_SIZE_MSK3			0xC0			//C_SIZE 低2位掩码

#define C_SIZE_MULT_MSK1 	0x03			//C_SIZE_MULT 的高2位掩码
#define C_SIZE_MULT_MSK2 	0x80			//C_SIZE_MULT 的低2位掩码

#define R2WFACTOR_MSK		0x1C			//R2WFACTOR 掩码

#define SECTOR_SIZE_MSK1	0x3F			//SECTOR_SIZE 的高5位
#define SECTOR_SIZE_MSK2	0x80			//SECTOR_SIZE 的低2位

#define ERASE_GRP_SIZE_MSK 		0x7C		//MMC卡 ERASE_GRP_SIZE 掩码
#define ERASE_GRP_MULTI_MSK1 	0x03		//MMC卡 ERASE_GRP_MULTI 高2位掩码
#define ERASE_GRP_MULTI_MSK2 	0xE0		//MMC卡 ERASE_GRP_NULTI 低3位掩码


/* OCR寄存器电压范围定义 */
#define MSK_OCR_33			 	0x30//0xC0

/* 定义在初始化阶段,等待SD卡退出空闲状态的重试次数 */
#define MC_IDLE_WAIT_MAX     	10000


/* SD卡命令超时时间(单位 8clock)*/
/* timeout of command */
#define MC_CMD_TIMEOUT   	 	1000
#define MC_READREG_TIMEOUT      100	
#define MC_RTOS_SMALL_WAIT		256				// 运行RTOS时的小等待时间

/* 100ms 相当的SPI时钟数(单位 unit: 8 clocks) */
#define READ_TIMEOUT_100MS      100 * SPI_CLOCK / 1000 / 8

/* 250ms 相当的SPI时钟数(单位 unit: 8 clocks) */
#define WRITE_TIMEOUT_250MS		250 * SPI_CLOCK / 1000 / 8   


/**************************************  枚举类型定义  *******************************************/

/* 命令响应定义 */
typedef enum
{
    R1 = 1,
    R1B = 2,
    R2 = 3,
    R3 = 4
}CMD_REUESE_T;

/* R1和R2高字节错误码 */
typedef enum
{
    MSK_IDLE    =  0x01,
    MSK_ERASE_RST = 0x02,
    MSK_ILL_CMD  =  0x04,
    MSK_CRC_ERR  = 0x08,
    MSK_ERASE_SEQ_ERR = 0x10,
    MSK_ADDR_ERR  = 0x20,
    MSK_PARAM_ERR  = 0x40
}MASK_HBYTE_ERROR_T;

/* R2低字节错误码 */
typedef enum
{
    MSK_TOK_ERROR = 0x01,
    MSK_TOK_CC_ERROR = 0x02,
    MSK_TOK_ECC_FAILED = 0x04,
    MSK_TOK_CC_OUTOFRANGE = 0x08,
    MSK_TOK_CC_LOCKED = 0x10
}MASK_LBYTE_ERROR_T;

/* 数据令牌 */
typedef enum
{
    MC_TOK_READ_STARTBLOCK = 0xFE,
    MC_TOK_WRITE_STARTBLOCK = 0xFE,
    MC_TOK_READ_STARTBLOCK_M = 0xFE,
    MC_TOK_WRITE_STARTBLOCK_M = 0xFC,
    MC_TOK_STOP_MULTI = 0xFD
}MC_TOKEN_T;

/* 数据响应令牌  */
typedef enum
{
    MC_RESP_DATA_MSK = 0x0F,				//数据响应掩码
    MC_RESP_DATA_ACCETPTED = 0x05,			//数据被接受
    MC_RESP_DATA_REJECT_CRC = 0x0B,      	//由于CRC错误而被拒绝
    MC_RESP_DATA_REJECT_WRITE = 0x0D		//由于写错误而被拒绝
}REQUEST_TOKEN_T;

/* 等待类型 */
typedef enum
{
    MC_WAIT_READ = 0x00,					//读等待
    MC_WAIT_WRITE = 0x01,					//写等待
    MC_WAIT_ERASE = 0x02					//擦除等待
}OPERATION_WAIT_T;


/* 错误码 */
typedef enum
{
    MC_SUCCESS = 0x00,						// 函数执行成功
    MC_ERR_NO_CARD = 0x01,					// 卡没有完全插入到卡座中
    MC_ERR_USER_PARAM = 0x02,				// 用户使用API函数时,入口参数有错误
    MC_ERR_CARD_PARAM = 0x03,				// 卡中参数有错误(与本模块不兼容)
    MC_ERR_VOL_NOTSUSP = 0x04,				// 卡不支持3.3V供电
    MC_ERR_OVER_CARDRANGE = 0x05,			// 操作超出卡容量范围
    MC_ERR_UNKNOWN_CARD = 0x06,				// 无法识别卡型
    /* SD命令可能返回的错误码 */
    MC_ERR_CMD_RESPTYPE = 0x10,				// 命令类型错误
    MC_ERR_CMD_TIMEOUT = 0x11,				// 卡命令响应超时
    MC_ERR_CMD_RESP = 0x12,					// 卡命令响应错误
    /* 数据流错误码 */
    MC_ERR_DATA_CRC16 = 0x20,				// 数据流CRC16校验不通过
    MC_ERR_DATA_START_TOK = 0x21,			// 读单块或多块时,数据开始令牌不正确
    MC_ERR_DATA_RESP = 0x22,				// 写单块或多块时,卡数据响应令牌不正确
    /* 等待错误码 */
    MC_ERR_TIMEOUT_WAIT = 0x30,				// 写或擦操作时,发生超时错误
    MC_ERR_TIMEOUT_READ = 0x31,				// 读操作超时错误
    MC_ERR_TIMEOUT_WRITE = 0x32,			// 写操作超时错误
    MC_ERR_TIMEOUT_ERASE = 0x33,			// 擦除操作超时错误
    MC_ERR_TIMEOUT_WAITIDLE = 0x34,			// 初始化卡时,等待卡退出空闲状态超时错误
    /* 写操作可能返回的错误码 */
    MC_ERR_WRITE_BLK = 0x40,				// 写块数据错误
    MC_ERR_WRITE_BLKNUMS = 0x41,			// 写多块时,想要写入的块与正确写入的块数不一致
    MC_ERR_WRITE_PROTECT = 0x42				// 卡外壳的写保护开关打在写保护位置

 }MC_RESULT_T;
 

/************************************** 结构体类型定义  ******************************************/

typedef struct 								/* SD/MMC 信息结构体定义*/
{	
	UWORD8 card_type;
	UWORD32 block_num;						/* 卡中块的数量 */
	UWORD32 block_len;						/* 卡的块长度(单位:字节) */
	UWORD32 erase_unit;						/* 一次可擦除的块个数 */
	
	UWORD32 timeout_read;					/* 读块超时时间(单位: 8 SPI clock) */
	UWORD32 timeout_write;					/* 写块超时时间(单位: 8 SPI clock) */
	UWORD32 timeout_erase;					/* 擦块超时时间(单位: 8 SPI clock) */
	
}MC_INFO_STRUCT;

/************************************* 全局外部变量声明 *****************************************/

extern MC_INFO_STRUCT mc_info;				/* SD卡信息结构体变量 */ 


/********************************** 全局外部函数原型声明 *****************************************/

UWORD8 mc_send_command(UWORD8 cmd, UWORD8 *param, UWORD8 resptype, UWORD8 *resp);/* 一个SPI命令 */  
void mc_convert_param(UWORD8 *parameter, UWORD32 value);						 /* 封装参数	*/  	 
UWORD8 mc_block_command(UWORD8 cmd, UWORD8 resptype, UWORD32 parameter);		 /* 块命令      */		 

	
UWORD8 mc_reset(void);											/* 复位SD卡		*/		

UWORD8 mc_read_csd(UWORD8 csdlen, UWORD8 *recbuf);				/* 读CSD 		*/			
UWORD8 mc_read_cid(UWORD8 cidlen, UWORD8 *recbuf);				/* 读CID		*/			
UWORD8 mc_stop_transmission(void);								/* 停止传输 	*/			

UWORD8 mc_read_status(UWORD8 len, UWORD8 *buffer);				/* 读Card Status */	
UWORD8 mc_set_block_length(UWORD32 length);						/* 设置块长度 	*/		

UWORD8 mc_read_single_block(UWORD32 blockaddr);					/* 读单块 		*/			
UWORD8 mc_read_muti_block(UWORD32 blockaddr);					/* 读多块 		*/			

UWORD8 mc_write_single_block(UWORD32 blockaddr);				/* 写单块 		*/			
UWORD8 mc_write_muti_block(UWORD32 blockaddr);					/* 写多块 		*/ 			


UWORD8 mc_program_csd(UWORD32 len, UWORD8 *buff);				/* 写CSD寄存器 	*/ 	

UWORD8 mc_erase_start_block(UWORD32 startblock, UWORD8 sd);		/* 擦块起始地址	*/	
UWORD8 mc_erase_end_block(UWORD8 endblock);						/* 擦块终止地址	*/	
UWORD8 mc_erase_selected_block(void);							/* 擦除所选的块	*/	


UWORD8 mc_read_ocr(UWORD8 ocrlen, UWORD8 *recbuf);				/* 读OCR 		*/			
UWORD8 mc_enable_crc(UWORD8 bEnable);							/* 使能CRC校验 	*/		


// 特殊应用命令
UWORD8 mc_get_write_nblock(UWORD32 *blocknum);					/* 得到正确写入块数 */
UWORD8 mc_read_scr(UWORD8 scrlen, UWORD8 *recbuf);				/* 读SCR 	 */ 			

// 数据流函数
UWORD8 mc_read_register(UWORD32 len, UWORD8 *recbuf);			/* 读寄存器 */ 
UWORD8 mc_read_block_data(UWORD32 len, UWORD8 *recbuf);			/* 读块数据	*/ 
UWORD8 mc_write_block_data(UWORD8 bmulti, UWORD32 len, UWORD8 *sendbuf);/* 写块数据 */	 

// 其它函数
void mc_stop_multi_token(void);									/* 停止多块写令牌 */	 
UWORD8 mc_wait_busy(UWORD8 waittype);							/* 忙 */ 				 
void mc_delay(UWORD16 value);									/* 发生SPI时钟 */		 


#endif













⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -