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

📄 sdcmd.h

📁 NIOS II 的几个源代码
💻 H
字号:
#ifndef __SDCMD_H__
#define __SDCMD_H__

// 命令响应定义
#define R1      1
#define R1B     2
#define R2      3
#define R3      4

// R1和R2高字节错误码
#define MSK_IDLE          		    0x01
#define MSK_ERASE_RST     		    0x02
#define MSK_ILL_CMD       		    0x04
#define MSK_CRC_ERR       		    0x08
#define MSK_ERASE_SEQ_ERR 		    0x10
#define MSK_ADDR_ERR      		    0x20
#define MSK_PARAM_ERR     		    0x40

// R2低字节错误码
#define MSK_TOK_ERROR             0x01
#define MSK_TOK_CC_ERROR          0x02
#define MSK_TOK_ECC_FAILED        0x04
#define MSK_TOK_CC_OUTOFRANGE     0x08
#define MSK_TOK_CC_LOCKED         0x10

// 数据令牌
#define SD_TOK_READ_STARTBLOCK    0xFE
#define SD_TOK_WRITE_STARTBLOCK   0xFE
#define SD_TOK_READ_STARTBLOCK_M  0xFE
#define SD_TOK_WRITE_STARTBLOCK_M 0xFC
#define SD_TOK_STOP_MULTI         0xFD

// 数据响应令牌
#define SD_RESP_DATA_MSK		      0x0F		//数据响应掩码
#define SD_RESP_DATA_ACCETPTED	  0x05		//数据被接受
#define SD_RESP_DATA_REJECT_CRC	  0x0B    //由于CRC错误而被拒绝
#define SD_RESP_DATA_REJECT_WRITE 0x0D		//由于写错误而被拒绝

// 等待类型
#define SD_WAIT_READ			        0x00		//读等待
#define SD_WAIT_WRITE			        0x01		//写等待
#define SD_WAIT_ERASE		 	        0x02		//擦除等待

#define SD_READREG_TIMEOUT		    8

/******************************** 基本命令集 **************************/
// 复位SD 卡
#define CMD0 0
#define CMD0_R R1

// 读OCR寄存器
#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

/***************************** 块读命令集 Block read commands **************************/

// 设置块的长度
#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

/***************************** 擦除命令 Erase commands *******************************/
// 设置擦除块的起始地址 Set the address of the first write block to be erased */
#define CMD32 32
#define CMD32_R R1

// 设置擦除块的终止地址 Set the address of the last write block to be erased */
#define CMD33 33
#define CMD33_R R1

// 擦除所选择的块 Erase the selected write blocks */
#define CMD38 38
#define CMD38_R R1B

/***************************** 锁卡命令 ***************************/
// 设置/复位密码或上锁/解锁卡 Set/reset the password or lock/unlock the card */
#define CMD42 42
#define CMD42_R	R1B

/***************************** 应用命令 ****************/
// 禁止下一个命令为应用命令
#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

/***************************** 应用命令 ***************/
// 获取 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



INT8U SD_SendCmd(INT8U cmd, INT8U *param, INT8U resptype, INT8U *resp);  // 一个SPI命令 
void SD_PackParam(INT8U *parameter, INT32U value);		// 封装参数
INT8U SD_BlockCommand(INT8U cmd, INT8U resptype, INT32U parameter);		 // 块命令 
	
INT8U SD_ResetSD(void);										           	// 复位SD卡

INT8U SD_ReadCSD(INT8U csdlen, INT8U *recbuf);				// 读CSD 			read CSD register
INT8U SD_ReadCID(INT8U cidlen, INT8U *recbuf);				// 读CID			read CID register
INT8U SD_StopTransmission(void);							       	// 停止传输			

INT8U SD_ReadCard_Status(INT8U len, INT8U *buffer);		// 读Card Status	read Card Status register
INT8U SD_SetBlockLen(INT32U length);							    // 设置块长度

INT8U SD_ReadSingleBlock(INT32U blockaddr);						// 读单块
INT8U SD_ReadMultipleBlock(INT32U blockaddr);					// 读多块

INT8U SD_WriteSingleBlock(INT32U blockaddr);					// 写单块
INT8U SD_WriteMultipleBlock(INT32U blockaddr);				// 写多块 

INT8U SD_ProgramCSD(INT8U len, INT8U *buff);					// 写CSD寄存器  	write CSD register 

INT8U SD_EraseStartBlock(INT32U startblock);					// 擦块起始地址
INT8U SD_EraseEndBlock(INT32U endblock);						  // 擦块终止地址
INT8U SD_EraseSelectedBlock(void);								    // 擦除所选的块

INT8U SD_ReadOCR(INT8U ocrlen,INT8U *recbuf);					// 读OCR			read OCR register
INT8U SD_EnableCRC(INT8U bEnable);								    // 使能CRC校验		enable CRC

// 特殊应用命令
INT8U SD_ReadSD_Status(INT8U sdslen, INT8U *recbuf);	// 读SD_Status  read SD_Status 
INT8U SD_GetNumWRBlcoks(INT32U *blocknum);						// 得到正确写入块数
INT8U SD_ReadSCR(INT8U scrlen, INT8U *recbuf);				// 读SCR 		read SCR register

// 数据流函数
INT8U SD_ReadRegister(INT32U len, INT8U *recbuf);			// 读数据
INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf);		// 读块数据
INT8U SD_WriteBlockData(INT8U bmulti, INT32U len, INT8U *sendbuf);	 // 写块数据

// 其它函数
void SD_StopMultiToken(void);									        // 停止多块写令牌
INT8U SD_WaitBusy(INT8U waittype);								    // 忙
void SD_SPIDelay(INT8U value);									      // 发生SPI时钟

#endif

⌨️ 快捷键说明

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