sd_cmd.lis

来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,454 行 · 第 1/5 页

LIS
1,454
字号
                        .module SD_Cmd.c
                        .area text(rom, con, rel)
                ;           rlen -> y+4
                ;            tmp -> R12
                ;              i -> y+0
                ;           resp -> R10,R11
                ;       resptype -> R12
                ;          param -> y+18
                ;            cmd -> R14
                        .even
 0000           _SD_SendCmd::
 0000 3A93              st -y,r19
 0002 2A93              st -y,r18
 0004 0E940000          xcall push_gset5
 0008 E02E              mov R14,R16
 000A 2897              sbiw R28,8
 000C CC88              ldd R12,y+20
 000E AE88              ldd R10,y+22
 0010 BF88              ldd R11,y+23
 0012           ; /*--------------File Info-------------------------------------------------------
 0012           ; ** 文   件   名:    SD_Cmd.c
 0012           ; ** 最后修改日期:    2008.3.28
 0012           ; ** 版        本:    V1.0
 0012           ; ** 描        述:    sd 卡驱动软件包: SD卡物理层                                       
 0012           ; **------------------------------------------------------------------------------
 0012           ; ** Created   by:              
 0012           ; ** Created date:                      
 0012           ; *******************************************************************************/
 0012           ; 
 0012           ; #include "SYS_Config.h" 
 0012           ; #include "SD_Config.h" 
 0012           ; #include "SD_Hal.h" 
 0012           ; #include "SD_CRC.h" 
 0012           ; #include "SD_Cmd.h" 
 0012           ; #include "SD_Drive.h" 
 0012           ; 
 0012           ; /*******************************************************************************
 0012           ; ** 函数名称: INT8U SD_SendCmd()                                               
 0012           ; ** 功能描述: 向卡发送命令,并取得响应                           
 0012           ; ** 输   入: INT8U cmd            : 命令字                             
 0012           ;                INT8U *param   : 命令参数,长度为4字节                    
 0012           ;                INT8U resptype : 响应类型                                              
 0012           ;                INT8U *resp    : 响应,长度为1-5字节                    
 0012           ; ** 输   出: 0:   正确    >0:   错误码                                
 0012           ; *******************************************************************************/
 0012           ; INT8U SD_SendCmd(INT8U cmd,INT8U *param,INT8U resptype,INT8U *resp)
 0012           ; {
 0012           ;     INT32S i,rlen ;
 0012           ;     INT8U tmp ;
 0012           ;     
 0012           ;     SPI_CS_Assert();
 0012 0E940000          xcall _SPI_CS_Assert
 0016           ;     
 0016           ;     SPI_SendByte((cmd&0x3F)|0x40);
 0016 0E2D              mov R16,R14
 0018 0F73              andi R16,63
 001A 0064              ori R16,64
 001C 0E940000          xcall _SPI_SendByte
 0020           ;     /* 发送命令头和命令字 send command header and word */
 0020           ;     
 0020           ;     for(i=3;i>=0;i--)
 0020 43E0              ldi R20,3
 0022 50E0              ldi R21,0
 0024 60E0              ldi R22,0
 0026 70E0              ldi R23,0
 0028 FE01              movw R30,R28
 002A 4083              std z+0,R20
 002C 5183              std z+1,R21
 002E 6283              std z+2,R22
 0030 7383              std z+3,R23
 0032           L2:
 0032 FE01              movw R30,R28
 0034 AF93              push R26
 0036 BF93              push R27
 0038 A081              ldd R26,z+0
 003A B181              ldd R27,z+1
 003C FD01              movw R30,R26
 003E BF91              pop R27
 0040 AF91              pop R26
 0042 0A88              ldd R0,y+18
 0044 1B88              ldd R1,y+19
 0046 E00D              add R30,R0
 0048 F11D              adc R31,R1
 004A 0081              ldd R16,z+0
 004C 0E940000          xcall _SPI_SendByte
 0050           L3:
 0050 41E0              ldi R20,1
 0052 50E0              ldi R21,0
 0054 60E0              ldi R22,0
 0056 70E0              ldi R23,0
 0058 FE01              movw R30,R28
 005A 2080              ldd R2,z+0
 005C 3180              ldd R3,z+1
 005E 4280              ldd R4,z+2
 0060 5380              ldd R5,z+3
 0062 241A              sub R2,R20
 0064 350A              sbc R3,R21
 0066 460A              sbc R4,R22
 0068 570A              sbc R5,R23
 006A FE01              movw R30,R28
 006C 2082              std z+0,R2
 006E 3182              std z+1,R3
 0070 4282              std z+2,R4
 0072 5382              std z+3,R5
 0074 40E0              ldi R20,0
 0076 50E0              ldi R21,0
 0078 60E0              ldi R22,0
 007A 70E0              ldi R23,0
 007C FE01              movw R30,R28
 007E 2080              ldd R2,z+0
 0080 3180              ldd R3,z+1
 0082 4280              ldd R4,z+2
 0084 5380              ldd R5,z+3
 0086 2416              cp R2,R20
 0088 3506              cpc R3,R21
 008A 4606              cpc R4,R22
 008C 5706              cpc R5,R23
 008E 0CF0              brlt X2
 0090 D0CF              xjmp L2
 0092           X2:
 0092           ;         SPI_SendByte(param[i]);
 0092           ;     /* 发送参数 send parameters */
 0092           ;     
 0092           ;     #if SD_CRC_EN 
 0092           ;         tmp=SD_GetCmdByte6((cmd&0x3F)|0x40,param);
 0092           ;         SPI_SendByte(tmp);
 0092           ;     #else 
 0092           ;         SPI_SendByte(0x95);
 0092 05E9              ldi R16,149
 0094 0E940000          xcall _SPI_SendByte
 0098           ;         /* CRC校验码,只用于第1个命令 CRC,only used for the first command */
 0098           ;     #endif 
 0098           ;     
 0098           ;     rlen=0 ;
 0098 40E0              ldi R20,0
 009A 50E0              ldi R21,0
 009C 60E0              ldi R22,0
 009E 70E0              ldi R23,0
 00A0 FE01              movw R30,R28
 00A2 4483              std z+4,R20
 00A4 5583              std z+5,R21
 00A6 6683              std z+6,R22
 00A8 7783              std z+7,R23
 00AA           ;     /* 根据不同的命令,得到不同的响应长度 */
 00AA           ;     switch(resptype)
 00AA EC2C              mov R14,R12
 00AC FF24              clr R15
 00AE C701              movw R24,R14
 00B0 8130              cpi R24,1
 00B2 E0E0              ldi R30,0
 00B4 9E07              cpc R25,R30
 00B6 69F0              breq L9
 00B8 8230              cpi R24,2
 00BA E0E0              ldi R30,0
 00BC 9E07              cpc R25,R30
 00BE 49F0              breq L9
 00C0 8330              cpi R24,3
 00C2 E0E0              ldi R30,0
 00C4 9E07              cpc R25,R30
 00C6 79F0              breq L10
 00C8 8430              cpi R24,4
 00CA E0E0              ldi R30,0
 00CC 9E07              cpc R25,R30
 00CE A9F0              breq L11
 00D0 1EC0              xjmp L6
 00D2           X0:
 00D2           ;     {
 00D2           L9:
 00D2           ;         case R1 :
 00D2           ;         case R1B:rlen=1 ;break ;
 00D2 41E0              ldi R20,1
 00D4 50E0              ldi R21,0
 00D6 60E0              ldi R22,0
 00D8 70E0              ldi R23,0
 00DA FE01              movw R30,R28
 00DC 4483              std z+4,R20
 00DE 5583              std z+5,R21
 00E0 6683              std z+6,R22
 00E2 7783              std z+7,R23
 00E4 1BC0              xjmp L7
 00E6           L10:
 00E6           ;         case R2 :rlen=2 ;break ;
 00E6 42E0              ldi R20,2
 00E8 50E0              ldi R21,0
 00EA 60E0              ldi R22,0
 00EC 70E0              ldi R23,0
 00EE FE01              movw R30,R28
 00F0 4483              std z+4,R20
 00F2 5583              std z+5,R21
 00F4 6683              std z+6,R22
 00F6 7783              std z+7,R23
 00F8 11C0              xjmp L7
 00FA           L11:
 00FA           ;         case R3 :rlen=5 ;break ;
 00FA 45E0              ldi R20,5
 00FC 50E0              ldi R21,0
 00FE 60E0              ldi R22,0
 0100 70E0              ldi R23,0
 0102 FE01              movw R30,R28
 0104 4483              std z+4,R20
 0106 5583              std z+5,R21
 0108 6683              std z+6,R22
 010A 7783              std z+7,R23
 010C 07C0              xjmp L7
 010E           L6:
 010E           ;         default :
 010E           ; 	            SPI_SendByte(0xFF);
 010E 0FEF              ldi R16,255
 0110 0E940000          xcall _SPI_SendByte
 0114           ;                   SPI_CS_Deassert();
 0114 0E940000          xcall _SPI_CS_Deassert
 0118           ;         return SD_ERR_CMD_RESPTYPE ; // 返回命令响应类型错误 
 0118 00E1              ldi R16,16
 011A 85C0              xjmp L1
 011C           X1:
 011C           ;         break ;
 011C           L7:
 011C           ;     }
 011C           ;     
 011C           ;     i=0 ;
 011C 40E0              ldi R20,0
 011E 50E0              ldi R21,0
 0120 60E0              ldi R22,0
 0122 70E0              ldi R23,0
 0124 FE01              movw R30,R28
 0126 4083              std z+0,R20
 0128 5183              std z+1,R21
 012A 6283              std z+2,R22
 012C 7383              std z+3,R23
 012E           L12:
 012E           ;     /* 等待响应,响应的开始位为0 */
 012E           ;     do 
 012E           ;     {
 012E           ;         /* Wait for a response,a response is a start bit(zero) */
 012E           ;         tmp=SPI_RecByte();
 012E 0E940000          xcall _SPI_RecByte
 0132 C02E              mov R12,R16
 0134           ;         i++;
 0134 41E0              ldi R20,1
 0136 50E0              ldi R21,0
 0138 60E0              ldi R22,0
 013A 70E0              ldi R23,0
 013C FE01              movw R30,R28
 013E 2080              ldd R2,z+0
 0140 3180              ldd R3,z+1
 0142 4280              ldd R4,z+2
 0144 5380              ldd R5,z+3
 0146 240E              add R2,R20
 0148 351E              adc R3,R21
 014A 461E              adc R4,R22
 014C 571E              adc R5,R23
 014E FE01              movw R30,R28
 0150 2082              std z+0,R2
 0152 3182              std z+1,R3
 0154 4282              std z+2,R4
 0156 5382              std z+3,R5
 0158           ;     }
 0158           L13:
 0158           ;     while(((tmp&0x80)!=0)&&(i<SD_CMD_TIMEOUT));
 0158 C7FE              sbrs R12,7
 015A 0EC0              rjmp L15
 015C 4FEF              ldi R20,255
 015E 50E0              ldi R21,0
 0160 60E0              ldi R22,0
 0162 70E0              ldi R23,0
 0164 FE01              movw R30,R28
 0166 2080              ldd R2,z+0
 0168 3180              ldd R3,z+1
 016A 4280              ldd R4,z+2
 016C 5380              ldd R5,z+3
 016E 2416              cp R2,R20
 0170 3506              cpc R3,R21
 0172 4606              cpc R4,R22
 0174 5706              cpc R5,R23
 0176 DCF2              brlt L12
 0178           L15:
 0178           ;     
 0178           ;     if(i>=SD_CMD_TIMEOUT)
 0178 4FEF              ldi R20,255
 017A 50E0              ldi R21,0
 017C 60E0              ldi R22,0
 017E 70E0              ldi R23,0
 0180 FE01              movw R30,R28
 0182 2080              ldd R2,z+0
 0184 3180              ldd R3,z+1
 0186 4280              ldd R4,z+2
 0188 5380              ldd R5,z+3
 018A 2416              cp R2,R20
 018C 3506              cpc R3,R21
 018E 4606              cpc R4,R22
 0190 5706              cpc R5,R23

⌨️ 快捷键说明

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