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

📄 sdcmd.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \                     ??SD_ReadOCR_3:
   \   0000003C   3606               LSL         R6,R6,#+0x18       ;; ZeroExt     R6,R6,#+0x18,#+0x18
   \   0000003E   360E               LSR         R6,R6,#+0x18
   \   00000040   042E               CMP         R6,#+0x4
   \   00000042   09D2               BCS         ??SD_ReadOCR_4
    432              	recbuf[tmp] = resp[tmp + 1];					/* 复制OCR寄存器内容到接收缓冲区 */
   \   00000044   3606               LSL         R6,R6,#+0x18       ;; ZeroExt     R6,R6,#+0x18,#+0x18
   \   00000046   360E               LSR         R6,R6,#+0x18
   \   00000048   3606               LSL         R6,R6,#+0x18       ;; ZeroExt     R6,R6,#+0x18,#+0x18
   \   0000004A   360E               LSR         R6,R6,#+0x18
   \   0000004C   01A8               ADD         R0,SP,#+0x4
   \   0000004E   8019               ADD         R0,R0,R6
   \   00000050   4078               LDRB        R0,[R0, #+0x1]
   \   00000052   A855               STRB        R0,[R5, R6]
   \   00000054   761C               ADD         R6,#+0x1
   \   00000056   F1E7               B           ??SD_ReadOCR_3
    433          
    434              return SD_NO_ERR;
   \                     ??SD_ReadOCR_4:
   \   00000058   0020               MOV         R0,#+0
   \                     ??SD_ReadOCR_1:
   \   0000005A   03B0               ADD         SP,#+0xC
   \   0000005C   70BC               POP         {R4-R6}
   \   0000005E   02BC               POP         {R1}
   \   00000060   0847               BX          R1                 ;; return
    435          }
    436          
    437          /********************************************************************************************************************
    438          ** 函数名称: INT8U SD_EnableCRC()					Name:	  INT8U SD_EnableCRC()
    439          ** 功能描述: 使能SD卡的CRC校验功能					Function: enable crc check of SD Card
    440          ** 输   入: INT8U bEnable : 1:使能 0:禁止			Input:	  INT8U bEnable : 1:enable  0: disable
    441          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    442          *********************************************************************************************************************/
    443          #if SD_CRC_EN
    444          INT8U SD_EnableCRC(INT8U bEnable)
    445          {
    446          	INT8U param[4],resp,ret;
    447          		
    448          	if (bEnable == 1)
    449          		param[0] = 1;											/* 使能crc enable crc */
    450          	else
    451          		param[1] = 0; 											/* 禁止crc disalbe crc */
    452          
    453          	ret = SD_SendCmd(CMD59, param, CMD59_R, &resp);				/* "使能/禁止CRC"命令 enable/disable crc command */
    454          	if (ret != SD_NO_ERR)
    455                  return ret;							
    456          
    457              if (resp != 0)
    458                 	return SD_ERR_CMD_RESP;									/* 响应错误 response is error */		
    459           	
    460          	return SD_NO_ERR;
    461          
    462          }
    463          #endif
    464          
    465          /*********************************************************************************************************************
    466          ** 函数名称: INT8U SD_ReadSD_Status()				     Name:	   INT8U SD_ReadSD_Status()
    467          ** 功能描述: 读SD卡的 SD_Status 寄存器				     Function: read SD_Status register of sd card
    468          ** 输   入: INT8U sdslen  		: 寄存器长度(固定为64)	 Input:    INT8U sdslen: len of register (fixed,is 64)
    469          			 INT8U *recbuf 		: 接收缓冲区				       INT8U *recbuf: recbuffer	
    470          ** 输   出: 0:   正确    >0:   错误码		  			 Output:	  0:  right		>0:  error code
    471          ** 注    意: 只有SD卡才有SD Status 寄存器				 Note:     only SD card have SD Status Register
    472          **********************************************************************************************************************/
    473          #if SD_ReadSD_Status_EN
    474          INT8U SD_ReadSD_Status(INT8U sdslen, INT8U *recbuf)
    475          {
    476              INT8U param[4] = {0,0,0,0},resp[2],ret;
    477          
    478              ret = SD_SendCmd(CMD55, param, CMD55_R, resp);			/* 后续命令为一个应用命令 */
    479              if (ret != SD_NO_ERR)
    480              	return ret;											/* command that the followed commnad is a specific application */
    481              												
    482              if (resp[0] != 0)
    483                  return SD_ERR_CMD_RESP;								/* 响应错误 response is error */
    484          
    485              ret = SD_SendCmd(ACMD13, param, ACMD13_R, resp);		/* 读 SD_Status 命令 */
    486              if (ret != SD_NO_ERR)
    487              	return ret;											/* command that read SD_Status register */
    488             												
    489              if ((resp[0] != 0) || (resp[1] != 0))
    490                  return SD_ERR_CMD_RESP;								/* 响应错误 response is error */
    491          
    492          	return (SD_ReadBlockData(sdslen, recbuf));				/* 读出寄存器内容 read the content of the register */
    493          }
    494          #endif
    495          
    496          /*******************************************************************************************************************
    497          ** 函数名称: INT8U SD_ReadSCR()							Name:	  INT8U SD_ReadSCR()
    498          ** 功能描述: 读SD卡的 SCR 寄存器						Function: read SCR register of SD card
    499          ** 输   入: INT8U scrlen  		: 寄存器长度(固定为8) 	Input:    INT8U scrlen		 : len of register (fixed,is 8)
    500          			 INT8U *recbuf 		: 接收缓冲区					  INT8U *recbuf		 : recieve buffer	
    501          ** 输   出: 0:   正确    >0:   错误码		  			Output:	  0:  right		>0:  error code
    502          ** 备	 注: MMC卡没有该寄存器							Note:	  MMC Card have not this register
    503          ********************************************************************************************************************/
    504          #if SD_ReadSCR_EN
    505          INT8U SD_ReadSCR(INT8U scrlen, INT8U *recbuf)
    506          {
    507              INT8U param[4] = {0,0,0,0},resp,ret;
    508          
    509              ret = SD_SendCmd(CMD55, param, CMD55_R, &resp);		/* 后续命令为一个应用命令 */
    510              if (ret != SD_NO_ERR)								/* command that the followed commnad is a specific application */
    511              	return ret;													
    512              												
    513              if (resp != 0)
    514                  return SD_ERR_CMD_RESP;							/* 响应错误 response is error */
    515          
    516              ret = SD_SendCmd(ACMD51, param, ACMD51_R, &resp);   /* 发送读 SD Status 命令*/
    517              if (ret != SD_NO_ERR)								/* command that read SD Status register */
    518             		return ret;													
    519          				    															
    520              if (resp != 0)
    521                  return SD_ERR_CMD_RESP;						 	/* 响应错误 response is error */
    522          
    523          	return (SD_ReadBlockData(scrlen, recbuf));	 		/* 读出寄存器内容 read the content of the register */
    524          }
    525          #endif
    526          
    527          /********************************************************************************************************************
    528          ** 函数名称: INT8U SD_GetNumWRBlcoks()				Name:	  INT8U SD_GetNumWRBlcoks()
    529          ** 功能描述: 得到正确写入的块数						Function: get the block numbers that written correctly
    530          ** 输   入: INT32U *blocknum: 返回的块数			Input:	  INT32U blocknum	: the block numbers returned
    531          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    532          ** 注	 意: MMC卡没有该命令						Note:     MMC Card have no this command
    533          *********************************************************************************************************************/
    534          #if SD_WriteMultiBlock_EN
    535          INT8U SD_GetNumWRBlcoks(INT32U *blocknum)
    536          {
    537              INT8U tmp[4] = {0,0,0,0},resp,ret;
    538          
    539              ret = SD_SendCmd(CMD55, tmp, CMD55_R, &resp);	  	 /* 后续命令为一个应用命令 */
    540              if (ret != SD_NO_ERR) 								 /* command that the followed commnad is a specific application */
    541              	return ret;
    542              	
    543              if (resp != 0)
    544              	return SD_ERR_CMD_RESP;    	
    545           											
    546             	ret = SD_SendCmd(ACMD22, tmp, ACMD22_R, &resp);  	 /* 读取正确写入的块数命令 */
    547             	if (ret != SD_NO_ERR)								 /* command that read the numbers of block written correctly */
    548             		return ret;											
    549             		 														
    550          	if (resp != 0)
    551              	return SD_ERR_CMD_RESP;							 /* 响应错误 response is error */
    552              		
    553              ret = SD_ReadBlockData(4, tmp);						 /* 读块数 read the numbvers of block */
    554              if (ret != SD_NO_ERR)
    555              	return ret;
    556              	
    557              *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];	
    558              													 /* 转换为32位 change to 32 bits */
    559          
    560          	return SD_NO_ERR;    								 /* 返回执行成功 return perform sucessfully */		
    561          }
    562          #endif
    563          
    564          		/*********************************************************
    565          		
    566          		    			下面为一些数据传输函数
    567          		
    568          		**********************************************************/
    569          
    570          /********************************************************************************************************************
    571          ** 函数名称: INT8U SD_ReadRegister()				Name:	  INT8U SD_ReadRegister()
    572          ** 功能描述: 从SD卡读取数据							Function: read data from SD card
    573          ** 输   入: INT32U len	  : 长度					Input:	  INT32U len   : length
    574          			 INT8U *recbuf: 接收缓冲区					 	  INT8U *recbuf: receive buffer
    575          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    576          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    577          INT8U SD_ReadRegister(INT32U len, INT8U *recbuf)
    578          {	
   \                     SD_ReadRegister:
   \   00000000   F0B5               PUSH        {R4-R7,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    579          	INT32U i = 0;
   \   00000006   0020               MOV         R0,#+0
   \   00000008   071C               MOV         R7,R0
    580          	INT8U resp;
    581          
    582              SPI_CS_Assert();
   \   0000000A   ........           _BLF        SPI_CS_Assert,SPI_CS_Assert??rT
    583              do{    											/* 等待数据起始令牌 wait for data start token */
    584                  resp = SPI_RecByte();
   \                     ??SD_ReadRegister_0:
   \   0000000E   ........           _BLF        SPI_RecByte,SPI_RecByte??rT
   \   00000012   061C               MOV         R6,R0
    585              	i++;
   \   00000014   7F1C               ADD         R7,#+0x1
    586              }while((resp == 0xFF) && (i < SD_READREG_TIMEOUT));
   \   00000016   FF2E               CMP         R6,#+0xFF
   \   00000018   01D1               BNE         ??SD_ReadRegister_1
   \   0000001A   082F               CMP         R7,#+0x8
   \   0000001C   F7D3               BCC         ??SD_ReadRegister_0
    587          
    588              if (i >= SD_READREG_TIMEOUT)
   \                     ??SD_ReadRegister_1:
   \   0000001E   082F               CMP         R7,#+0x8
   \   00000020   03D3               BCC         ??SD_ReadRegister_2
    589              {
    590              	SPI_CS_Deassert();
   \   00000022   ........           _BLF        SPI_CS_Deassert,SPI_CS_Deassert??rT
    591              	return SD_ERR_TIMEOUT_READ;					/* 超时, 返回错误 timeout, return error */
   \   00000026   3120               MOV       

⌨️ 快捷键说明

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