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

📄 sdcmd.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
     93                  return SD_ERR_CMD_TIMEOUT;					 /* 返回命令超时 return response timeout of command */
   \   0000008A   1120               MOV         R0,#+0x11
   \   0000008C   0CE0               B           ??SD_SendCmd_7
     94              }
     95          
     96              for (i = rlen - 1; i >= 0; i--)
   \                     ??SD_SendCmd_10:
   \   0000008E   701E               SUB         R0,R6,#+0x1
   \   00000090   051C               MOV         R5,R0
   \                     ??SD_SendCmd_11:
   \   00000092   002D               CMP         R5,#+0
   \   00000094   05D4               BMI         ??SD_SendCmd_12
     97              {
     98                  resp[i] = tmp;
   \   00000096   6755               STRB        R7,[R4, R5]
     99                  tmp = SPI_RecByte();					 	 /* 循环的最后发送8clock  at the last recycle,clock out 8 clock */
   \   00000098   ........           _BLF        SPI_RecByte,SPI_RecByte??rT
   \   0000009C   071C               MOV         R7,R0
    100              }
   \   0000009E   6D1E               SUB         R5,#+0x1
   \   000000A0   F7E7               B           ??SD_SendCmd_11
    101          
    102              SPI_CS_Deassert();
   \                     ??SD_SendCmd_12:
   \   000000A2   ........           _BLF        SPI_CS_Deassert,SPI_CS_Deassert??rT
    103              return SD_NO_ERR;								 /* 返回执行成功 return perform sucessfully */
   \   000000A6   0020               MOV         R0,#+0
   \                     ??SD_SendCmd_7:
   \   000000A8   03B0               ADD         SP,#+0xC
   \   000000AA   F0BC               POP         {R4-R7}
   \   000000AC   02BC               POP         {R1}
   \   000000AE   0847               BX          R1                 ;; return
    104          }
    105          
    106          /********************************************************************************************************************
    107          ** 函数名称: void SD_PackParam()					Name:	  void SD_PackParam()
    108          ** 功能描述: 将32位的参数转为字节形式				Function: change 32bit parameter to bytes form
    109          ** 输   入: INT8U *parameter: 字节参数缓冲区		Input:	  INT8U *parameter: the buffer of bytes parameter
    110          			 INT32U value    : 32位参数						  INT32U value    : 32bit parameter
    111          ** 输   出: 无										Output:	  NULL
    112          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    113          void SD_PackParam(INT8U *parameter, INT32U value)
    114          {
    115              parameter[3] = (INT8U)(value >> 24);
   \                     SD_PackParam:
   \   00000000   0A1C               MOV         R2,R1
   \   00000002   120E               LSR         R2,R2,#+0x18
   \   00000004   C270               STRB        R2,[R0, #+0x3]
    116              parameter[2] = (INT8U)(value >> 16);
   \   00000006   0A1C               MOV         R2,R1
   \   00000008   120C               LSR         R2,R2,#+0x10
   \   0000000A   8270               STRB        R2,[R0, #+0x2]
    117              parameter[1] = (INT8U)(value >> 8);
   \   0000000C   0A1C               MOV         R2,R1
   \   0000000E   120A               LSR         R2,R2,#+0x8
   \   00000010   4270               STRB        R2,[R0, #+0x1]
    118              parameter[0] = (INT8U)(value);
   \   00000012   0A1C               MOV         R2,R1
   \   00000014   0270               STRB        R2,[R0, #+0]
    119          }
   \   00000016   7047               BX          LR                 ;; return
    120          
    121          /********************************************************************************************************************
    122          ** 函数名称: INT8U SD_BlockCommand()				Name:	  INT8U SD_BlockCommand()
    123          ** 功能描述: 块命令									Function: command about block operation
    124          ** 输   入: INT8U cmd	     : 命令字				Input:	  INT8U cmd	      : command byte
    125          			 INT8U resptype  : 响应类型						  INT8U resptype  : response type
    126          			 INT32U parameter: 块操作参数			 		  INT32U parameter: parameter of block operation
    127          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    128          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    129          INT8U SD_BlockCommand(INT8U cmd, INT8U resptype, INT32U parameter)
    130          {
   \                     SD_BlockCommand:
   \   00000000   F0B5               PUSH        {R4-R7,LR}
   \   00000002   82B0               SUB         SP,#+0x8
   \   00000004   041C               MOV         R4,R0
   \   00000006   0D1C               MOV         R5,R1
   \   00000008   171C               MOV         R7,R2
    131          	INT8U param[4],resp,ret;
    132          	
    133          	parameter <<= SD_BLOCKSIZE_NBITS;					 /* 调整地址:左移9位 adjust address: move 9 bits left */
   \   0000000A   7F02               LSL         R7,R7,#+0x9
    134          
    135          	SD_PackParam(param, parameter);						 /* 将参数转化为字节形式 change the parameter to bytes form */	
   \   0000000C   391C               MOV         R1,R7
   \   0000000E   01A8               ADD         R0,SP,#+0x4
   \   00000010   ........           BL          SD_PackParam
    136          
    137          	ret = SD_SendCmd(cmd, param, resptype, &resp);
   \   00000014   6B46               MOV         R3,SP
   \   00000016   2A1C               MOV         R2,R5
   \   00000018   01A9               ADD         R1,SP,#+0x4
   \   0000001A   201C               MOV         R0,R4
   \   0000001C   ........           BL          SD_SendCmd
   \   00000020   061C               MOV         R6,R0
    138          	if (ret != SD_NO_ERR)
   \   00000022   002E               CMP         R6,#+0
   \   00000024   01D0               BEQ         ??SD_BlockCommand_0
    139          	   	 return ret;							 		 /* 结束数据传输失败 stop transmission operation fail */
   \   00000026   301C               MOV         R0,R6
   \   00000028   06E0               B           ??SD_BlockCommand_1
    140          	
    141          	if (resp != 0)
   \                     ??SD_BlockCommand_0:
   \   0000002A   6846               MOV         R0,SP
   \   0000002C   0078               LDRB        R0,[R0, #+0]
   \   0000002E   0028               CMP         R0,#+0
   \   00000030   01D0               BEQ         ??SD_BlockCommand_2
    142          		 return SD_ERR_CMD_RESP;		 				 /* 响应错误 response is error */
   \   00000032   1220               MOV         R0,#+0x12
   \   00000034   00E0               B           ??SD_BlockCommand_1
    143          		
    144          	return SD_NO_ERR;
   \                     ??SD_BlockCommand_2:
   \   00000036   0020               MOV         R0,#+0
   \                     ??SD_BlockCommand_1:
   \   00000038   02B0               ADD         SP,#+0x8
   \   0000003A   F0BC               POP         {R4-R7}
   \   0000003C   02BC               POP         {R1}
   \   0000003E   0847               BX          R1                 ;; return
    145          }
    146          
    147          	/*
    148          	************************************************
    149          	
    150          	 	下面为SD卡SPI命令
    151          
    152          	************************************************
    153          	*/
    154          	
    155          /********************************************************************************************************************
    156          ** 函数名称: INT8U SD_ResetSD()						Name:	  INT8U SD_ResetSD()
    157          ** 功能描述: 复位SD/MMC卡							Function: reset SD/MMC card
    158          ** 输   入: 无										Input:	  NULL
    159          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    160          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    161          INT8U SD_ResetSD(void)
    162          {
   \                     SD_ResetSD:
   \   00000000   00B5               PUSH        {LR}
   \   00000002   82B0               SUB         SP,#+0x8
    163          	INT8U param[4] = {0,0,0,0},resp;
   \   00000004   6846               MOV         R0,SP
   \   00000006   0021               MOV         R1,#+0
   \   00000008   0160               STR         R1,[R0, #0]
    164          	
    165              return (SD_SendCmd(CMD0, param, CMD0_R, &resp));	/* 复位命令 command that reset card */
   \   0000000A   01AB               ADD         R3,SP,#+0x4
   \   0000000C   0122               MOV         R2,#+0x1
   \   0000000E   6946               MOV         R1,SP
   \   00000010   0020               MOV         R0,#+0
   \   00000012   ........           BL          SD_SendCmd
   \   00000016   02B0               ADD         SP,#+0x8
   \   00000018   02BC               POP         {R1}
   \   0000001A   0847               BX          R1                 ;; return
    166          }
    167          
    168          /********************************************************************************************************************
    169          ** 函数名称: INT8U SD_ReadCSD()						Name:	  INT8U SD_ReadCSD()
    170          ** 功能描述: 读SD/MMC卡的CSD寄存器					Function: read CSD register of SD/MMC card
    171          ** 输   入: INT8U csdlen  : 寄存器长度(固定为16)			  INT8U csdlen  : len of register (fixed,is 16)
    172          			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer	
    173          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    174          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    175          INT8U SD_ReadCSD(INT8U csdlen, INT8U *recbuf)
    176          {
   \                     SD_ReadCSD:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   82B0               SUB         SP,#+0x8
   \   00000004   041C               MOV         R4,R0
   \   00000006   0D1C               MOV         R5,R1
    177              INT8U param[4] = {0,0,0,0},resp,ret;
   \   00000008   01A8               ADD         R0,SP,#+0x4
   \   0000000A   0021               MOV         R1,#+0
   \   0000000C   0160               STR         R1,[R0, #0]
    178          
    179              ret = SD_SendCmd(CMD9, param, CMD9_R, &resp);		/* 读CSD寄存器命令 command that read CSD register */
   \   0000000E   6B46               MOV         R3,SP
   \   00000010   0122               MOV         R2,#+0x1
   \   00000012   01A9               ADD         R1,SP,#+0x4
   \   00000014   0920               MOV         R0,#+0x9
   \   00000016   ........           BL          SD_SendCmd
   \   0000001A   061C               MOV         R6,R0
    180              if (ret != SD_NO_ERR) 									
   \   0000001C   002E               CMP         R6,#+0
   \   0000001E   01D0               BEQ         ??SD_ReadCSD_0
    181                  return ret;									
   \   00000020   301C               MOV         R0,R6
   \   00000022   0BE0               B           ??SD_ReadCSD_1
    182          
    183              if (resp != 0)
   \                     ??SD_ReadCSD_0:
   \   00000024   6846               MOV         R0,SP
   \   00000026   0078               LDRB        R0,[R0, #+0]
   \   00000028   0028               CMP         R0,#+0
   \   0000002A   01D0               BEQ         ??SD_ReadCSD_2
    184                  return SD_ERR_CMD_RESP;							/* 响应错误 response is error */

⌨️ 快捷键说明

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