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

📄 sdcmd.c

📁 atmel de booloader 内有源代码 用blb编译
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************************************************** Function name: SD_WriteSingleBlock** Descriptions:  write single block command**                写单块命令** Input: 		  INT32U blockaddr: block address		INT32U blockaddr: block address** Output: 		  0:   正确    >0:   错误码		  		0:  right		>0:  error code** Created by:    MingYuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_WriteSingleBlock(INT32U blockaddr){	return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */}/*********************************************************************************************************** Function name: SD_ReadOCR** Descriptions:  read OCR register of card**                读操作条件寄存器OCR** Input: 		  INT8U ocrlen  : 寄存器长度(固定为4)	INT8U ocrlen  : len of register (fixed,is 4)				  INT8U *recbuf : 接收缓冲区			INT8U *recbuf : receive buffer	** Output: 		  0:   正确    >0:   错误码		  		0:  right		>0:  error code** Created by:    MingYuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadOCR(INT8U ocrlen, INT8U *recbuf){	INT32U param = 0;    INT8U response[6],tmp;    tmp = SD_SendCommand(CMD55, param, CMD55_R, response);    if (tmp != SD_NO_ERR)    	return tmp;        param = 0xF00000;										   /* 没有忙条件的OCR */    tmp = SD_SendCommand(ACMD41, param, ACMD41_R, response);   /* 读 OCR 寄存器命令 read OCR register command */    if (tmp != SD_NO_ERR)       	return tmp;                												    for (tmp = 0; tmp < 4; tmp++)							   /* 从响应中取得OCR   get OCR from response */    	recbuf[tmp] = response[tmp + 1];					           return SD_NO_ERR;}/*********************************************************************************************************** Function name: MMC_ReadOCR** Descriptions:  Read OCR register** Input: 		  INT8U ocrlen  : the length of the OCR register				  INT8U *recbuf : the content buffer of OCR register   ** Output: 		  NULL** Created by:    Ming Yuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U MMC_ReadOCR(INT8U ocrlen, INT8U *recbuf){	INT32U param = 0xF00000;								/* 没有忙条件的OCR */    INT8U response[6],tmp;					    tmp = SD_SendCommand(CMD1, param, CMD1_R, response);	/* 读 OCR 寄存器命令 read OCR register command */    if (tmp != SD_NO_ERR)       	return tmp;                												    for (tmp = 0; tmp < 4; tmp++)    	recbuf[tmp] = response[tmp + 1];					/* 复制OCR寄存器内容到接收缓冲区 */        return SD_NO_ERR;}/*********************************************************************************************************** Function name: SD_SetBusWidth** Descriptions:  set Bus SD/MMC data bus Width(SD card is D0 ~ D3, MMC card is D0) ** Input: 		  INT16U RCA	: the RCA of SD/MMC				  INT32U bwidth : 1: D0 ~ D3 is valid   0: only D0 is valid   ** Output: 		  0:  right		>0:  error code** Created by:    Ming Yuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_SetBusWidth(INT16U RCA, INT32U bwidth){	INT32U param;	INT8U response[6], ret;	    param = (INT32U)RCA << 16;	    ret = SD_SendCommand(CMD55, param, CMD55_R, response);    if (ret != SD_NO_ERR)    	return ret;			param = 0;	if (bwidth == 1) 		param = 0x02;				ret = SD_SendCommand(ACMD6, param, ACMD6_R, response); 		/* 发送写CSD寄存器命令 send command that write CSD */	if (ret != SD_NO_ERR)		return ret;		            ret = SD_JudgeResult(&response[1]);							/* 判断命令是否正确执行 */    if (ret != SD_NO_ERR)    	return ret;          return SD_NO_ERR;}		/*********************************************************				    	下面为一些数据传输函数  data transfer function				**********************************************************//*********************************************************************************************************** Function name: SD_ReadBlockData** Descriptions:  read block data from card**                从卡中读取数据块** Input: 		  INT32U len    : 长度				    INT32U len    : length				  INT8U *recbuf : 接收缓冲区			INT8U *recbuf : the buffer of receive				  INT32U timeout: 超时时间				INT32U timeout: time out** Output: 		  0:   正确    >0:   错误码		  		0:  right		>0:  error code** Created by:    MingYuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf, INT32U timeout){	int i = 0;	int cnt;	INT32U tmp;	INT32U stat = 0;      /* recycle to receive data */				    	/* 循环接收数据 */	while (i < len) 	{		stat = SDIDSTA;			                        /* read data status register */		if (!card_insert) 		{			SDIDSTA = stat;			return SD_ERR_NO_CARD;						/* 卡未插入,返回错误 card is not inserted, return error code */		}           /* 超时 timeout  */		if (stat & SDIDSTA_TOUT) 		{			SDIDSTA = stat; /* clear */			return SD_ERR_TIMEOUT_READ;		}		stat = SDIFSTA;                            		/* 读FIFO状态寄存器 read FIFO status register */		if (stat & SDIFSTA_RX) 		{			cnt = (stat & SDIFSTA_CNT);             	/* 读FIFO 计数器 	read FIFO counter */			while (cnt) 			{				tmp = SDIDAT;							/* 从FIFO中读出数据 read data from FIFO */				recbuf[i] = (INT8U)(tmp); 				recbuf[i + 1] = (INT8U)(tmp >> 8); 				recbuf[i + 2] = (INT8U)(tmp >> 16); 				recbuf[i + 3] = (INT8U)(tmp >> 24); 				i += sizeof(INT32U);				cnt -= sizeof(INT32U);			}		}	}	do 	{		stat = SDIDSTA;		if (!card_insert) 		{			SDIDSTA = stat;			return SD_ERR_NO_CARD;						/* 卡未插入,返回错误 card is not inserted, return error code */		}        	} while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN));        //不“超时”而且“数据未传输完成“时一直循环	SDIDSTA = stat; 									/* clear data status register */			return SD_NO_ERR; }/*********************************************************************************************************** Function name: SD_WriteBlockData** Descriptions:  write block data to SD/MMC card**                向SD/MMC卡写数据块** Input: 		  INT8U bmulti  : 是否为多块操作1:是0:否   INT8U bmulti   : multi blocks operate 1:Y 0:N 				  INT32U len    : 长度					   INT32U len     : length				  INT8U *sendbuf: 发送缓冲区			   INT8U *sendbuf : the buffer of send				  INT32U timeout: 超时时间			       INT32U timeout : time out** Output: 		  0:   正确    >0:   错误码		  		0:  right		>0:  error code** Created by:    MingYuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_WriteBlockData(INT8U bmulti, INT32U len, INT8U *sendbuf, INT32U timeout){	int i = 0;	int cnt;	INT32U stat;    /* recycle to write data to SD/MMC */			/* 下面的循环地往FIFO写入数据 */	while (i < len) 	{		stat = SDIDSTA;                             /* 读数据状态寄存器  read data status register */			if (!card_insert) 		{			SDIDSTA = stat;			return SD_ERR_NO_CARD;					/* 卡未插入,返回错误 card is not inserted, return error code */		}				stat = SDIFSTA;                    			/* 读FIFO状态寄存器  read FIFO status register */ 		if (stat & SDIFSTA_TX)  		{ 							           		/* 如果TX FIFO有效   if TX FIFO is valid  */    			cnt = SDI_MAX_TX_FIFO - (stat & SDIFSTA_CNT);			                                		/* 64 - FIFO中的字节数 */			while (cnt) 			{				SDIDAT = (sendbuf[i + 3] << 24) + (sendbuf[i + 2] << 16) +  				     	 (sendbuf[i + 1] << 8) + sendbuf[i];  				i += sizeof(INT32U);				cnt -= sizeof(INT32U);			}		}	}	do 	{		stat = SDIDSTA;		if (!card_insert)		{			SDIDSTA = stat;			return SD_ERR_NO_CARD;					/* 卡未插入,返回错误  card is not inserted, return error code */		}	}while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN));	SDIDSTA = stat; 								/* clear data status register */		return SD_NO_ERR;}/***********************************************************************************************************                            End Of File**********************************************************************************************************/

⌨️ 快捷键说明

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