sd_cmd.lis

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

LIS
1,454
字号
 0192 24F0              brlt L16
 0194           ;     {
 0194           ;         SPI_CS_Deassert();
 0194 0E940000          xcall _SPI_CS_Deassert
 0198           ;         return SD_ERR_CMD_TIMEOUT ;
 0198 01E1              ldi R16,17
 019A 45C0              xjmp L1
 019C           L16:
 019C           ;         /* 返回命令超时 return response timeout of command */
 019C           ;     }
 019C           ;     
 019C           ;     for(i=rlen-1;i>=0;i--)
 019C 41E0              ldi R20,1
 019E 50E0              ldi R21,0
 01A0 60E0              ldi R22,0
 01A2 70E0              ldi R23,0
 01A4 FE01              movw R30,R28
 01A6 2480              ldd R2,z+4
 01A8 3580              ldd R3,z+5
 01AA 4680              ldd R4,z+6
 01AC 5780              ldd R5,z+7
 01AE 241A              sub R2,R20
 01B0 350A              sbc R3,R21
 01B2 460A              sbc R4,R22
 01B4 570A              sbc R5,R23
 01B6 FE01              movw R30,R28
 01B8 2082              std z+0,R2
 01BA 3182              std z+1,R3
 01BC 4282              std z+2,R4
 01BE 5382              std z+3,R5
 01C0 20C0              xjmp L21
 01C2           L18:
 01C2 FE01              movw R30,R28
 01C4 AF93              push R26
 01C6 BF93              push R27
 01C8 A081              ldd R26,z+0
 01CA B181              ldd R27,z+1
 01CC FD01              movw R30,R26
 01CE BF91              pop R27
 01D0 AF91              pop R26
 01D2 EA0D              add R30,R10
 01D4 FB1D              adc R31,R11
 01D6 C082              std z+0,R12
 01D8 0E940000          xcall _SPI_RecByte
 01DC C02E              mov R12,R16
 01DE           L19:
 01DE 41E0              ldi R20,1
 01E0 50E0              ldi R21,0
 01E2 60E0              ldi R22,0
 01E4 70E0              ldi R23,0
 01E6 FE01              movw R30,R28
 01E8 2080              ldd R2,z+0
 01EA 3180              ldd R3,z+1
 01EC 4280              ldd R4,z+2
 01EE 5380              ldd R5,z+3
 01F0 241A              sub R2,R20
 01F2 350A              sbc R3,R21
 01F4 460A              sbc R4,R22
 01F6 570A              sbc R5,R23
 01F8 FE01              movw R30,R28
 01FA 2082              std z+0,R2
 01FC 3182              std z+1,R3
 01FE 4282              std z+2,R4
 0200 5382              std z+3,R5
 0202           L21:
 0202 40E0              ldi R20,0
 0204 50E0              ldi R21,0
 0206 60E0              ldi R22,0
 0208 70E0              ldi R23,0
 020A FE01              movw R30,R28
 020C 2080              ldd R2,z+0
 020E 3180              ldd R3,z+1
 0210 4280              ldd R4,z+2
 0212 5380              ldd R5,z+3
 0214 2416              cp R2,R20
 0216 3506              cpc R3,R21
 0218 4606              cpc R4,R22
 021A 5706              cpc R5,R23
 021C 0CF0              brlt X3
 021E D1CF              xjmp L18
 0220           X3:
 0220           ;     {
 0220           ;         resp[i]=tmp ;
 0220           ;         tmp=SPI_RecByte();
 0220           ;         /* 循环的最后发送8clock  at the last recycle,clock out 8 clock */
 0220           ;     }
 0220           ;     
 0220           ;     SPI_CS_Deassert();
 0220 0E940000          xcall _SPI_CS_Deassert
 0224           ;     return SD_NO_ERR ;
 0224 0027              clr R16
 0226           L1:
 0226 2896              adiw R28,8
 0228 0E940000          xcall pop_gset5
 022C 2296              adiw R28,2
 022E                   .dbline 0 ; func end
 022E 0895              ret
 0230           ;          value -> y+2
 0230           ;      parameter -> R20,R21
                        .even
 0230           _SD_PackParam::
 0230 3A93              st -y,r19
 0232 2A93              st -y,r18
 0234 0E940000          xcall push_gset1
 0238 A801              movw R20,R16
 023A           ;     /* 返回执行成功 return perform sucessfully */
 023A           ; }
 023A           ; 
 023A           ; /*******************************************************************************
 023A           ; ** 函数名称: void SD_PackParam()                                      
 023A           ; ** 功能描述: 将32位的参数转为字节形式                         
 023A           ; ** 输   入: INT8U *parameter: 字节参数缓冲区         
 023A           ;                INT32U value    : 32位参数             
 023A           ; ** 输   出: 无                                                               
 023A           ; *******************************************************************************/
 023A           ; void SD_PackParam(INT8U *parameter,INT32U value)
 023A           ; {
 023A           ;     parameter[3]=(INT8U)(value>>24);
 023A 88E1              ldi R24,24
 023C 90E0              ldi R25,0
 023E FE01              movw R30,R28
 0240 2280              ldd R2,z+2
 0242 3380              ldd R3,z+3
 0244 4480              ldd R4,z+4
 0246 5580              ldd R5,z+5
 0248 8A93              st -y,R24
 024A 8101              movw R16,R2
 024C 9201              movw R18,R4
 024E 0E940000          xcall lsr32
 0252 FA01              movw R30,R20
 0254 0383              std z+3,R16
 0256           ;     parameter[2]=(INT8U)(value>>16);
 0256 FE01              movw R30,R28
 0258 2280              ldd R2,z+2
 025A 3380              ldd R3,z+3
 025C 4480              ldd R4,z+4
 025E 5580              ldd R5,z+5
 0260 1201              movw R2,R4
 0262 4424              clr R4
 0264 5524              clr R5
 0266 FA01              movw R30,R20
 0268 2282              std z+2,R2
 026A           ;     parameter[1]=(INT8U)(value>>8);
 026A 88E0              ldi R24,8
 026C 90E0              ldi R25,0
 026E FE01              movw R30,R28
 0270 2280              ldd R2,z+2
 0272 3380              ldd R3,z+3
 0274 4480              ldd R4,z+4
 0276 5580              ldd R5,z+5
 0278 8A93              st -y,R24
 027A 8101              movw R16,R2
 027C 9201              movw R18,R4
 027E 0E940000          xcall lsr32
 0282 FA01              movw R30,R20
 0284 0183              std z+1,R16
 0286           ;     parameter[0]=(INT8U)(value);
 0286 FE01              movw R30,R28
 0288 2280              ldd R2,z+2
 028A 3380              ldd R3,z+3
 028C 4480              ldd R4,z+4
 028E 5580              ldd R5,z+5
 0290 FA01              movw R30,R20
 0292 2082              std z+0,R2
 0294           L22:
 0294 0E940000          xcall pop_gset1
 0298 2296              adiw R28,2
 029A                   .dbline 0 ; func end
 029A 0895              ret
 029C           ;           resp -> y+8
 029C           ;          param -> y+4
 029C           ;            ret -> R20
 029C           ;      parameter -> y+13
 029C           ;       resptype -> R22
 029C           ;            cmd -> R20
                        .even
 029C           _SD_BlockCommand::
 029C 0E940000          xcall push_gset2
 02A0 622F              mov R22,R18
 02A2 402F              mov R20,R16
 02A4 2997              sbiw R28,9
 02A6           ; }
 02A6           ; 
 02A6           ; /*******************************************************************************
 02A6           ; ** 函数名称: INT8U SD_BlockCommand()                          
 02A6           ; ** 功能描述: 块命令                                                                   
 02A6           ; ** 输   入: INT8U cmd             : 命令字                           
 02A6           ;                        INT8U resptype  : 响应类型                                              
 02A6           ;                        INT32U parameter: 块操作参数                                     
 02A6           ; ** 输   出: 0:   正确    >0:   错误码                                
 02A6           ; *******************************************************************************/
 02A6           ; INT8U SD_BlockCommand(INT8U cmd,INT8U resptype,INT32U parameter)
 02A6           ; {
 02A6           ;     INT8U param[4],resp,ret ;
 02A6           ;     
 02A6           ;     parameter<<=SD_BLOCKSIZE_NBITS ;
 02A6 89E0              ldi R24,9
 02A8 90E0              ldi R25,0
 02AA FE01              movw R30,R28
 02AC 2584              ldd R2,z+13
 02AE 3684              ldd R3,z+14
 02B0 4784              ldd R4,z+15
 02B2 5088              ldd R5,z+16
 02B4 8A93              st -y,R24
 02B6 8101              movw R16,R2
 02B8 9201              movw R18,R4
 02BA 0E940000          xcall lsl32
 02BE FE01              movw R30,R28
 02C0 0587              std z+13,R16
 02C2 1687              std z+14,R17
 02C4 2787              std z+15,R18
 02C6 308B              std z+16,R19
 02C8           ;     /* 调整地址:左移9位 adjust address: move 9 bits left */
 02C8           ;     
 02C8           ;     SD_PackParam(param,parameter);
 02C8 FE01              movw R30,R28
 02CA 2584              ldd R2,z+13
 02CC 3684              ldd R3,z+14
 02CE 4784              ldd R4,z+15
 02D0 5088              ldd R5,z+16
 02D2 4882              std y+0,R4
 02D4 5982              std y+1,R5
 02D6 9101              movw R18,R2
 02D8 8E01              movw R16,R28
 02DA 0C5F              subi R16,252  ; offset = 4
 02DC 1F4F              sbci R17,255
 02DE A8DF              xcall _SD_PackParam
 02E0           ;     /* 将参数转化为字节形式 change the parameter to bytes form */
 02E0           ;     
 02E0           ;     ret=SD_SendCmd(cmd,param,resptype,&resp);
 02E0 CE01              movw R24,R28
 02E2 0896              adiw R24,8
 02E4 9B83              std y+3,R25
 02E6 8A83              std y+2,R24
 02E8 6883              std y+0,R22
 02EA 9E01              movw R18,R28
 02EC 2C5F              subi R18,252  ; offset = 4
 02EE 3F4F              sbci R19,255
 02F0 042F              mov R16,R20
 02F2 86DE              xcall _SD_SendCmd
 02F4 402F              mov R20,R16
 02F6           ;     if(ret!=SD_NO_ERR)
 02F6 0023              tst R16
 02F8 09F0              breq L24
 02FA           ;         return ret ;
 02FA 06C0              xjmp L23
 02FC           L24:
 02FC           ;     /* 结束数据传输失败 stop transmission operation fail */
 02FC           ;     
 02FC           ;     if(resp!=0)
 02FC 2884              ldd R2,y+8
 02FE 2220              tst R2
 0300 11F0              breq L26
 0302           ;         return SD_ERR_CMD_RESP ;
 0302 02E1              ldi R16,18
 0304 01C0              xjmp L23
 0306           L26:
 0306           ;     /* 响应错误 response is error */
 0306           ;     
 0306           ;     return SD_NO_ERR ;
 0306 0027              clr R16
 0308           L23:
 0308 2996              adiw R28,9
 030A 0E940000          xcall pop_gset2
 030E                   .dbline 0 ; func end
 030E 0895              ret
                        .area lit(rom, con, rel)
 0000           L29:
 0000 0000              .byte 0,0
 0002 0000              .byte 0,0
                        .area text(rom, con, rel)
                ;           resp -> y+8
                ;          param -> y+4
                        .even
 0310           _SD_ResetSD::
 0310 2997              sbiw R28,9
 0312           ; }
 0312           ; 
 0312           ; /*************************************************
 0312           ;       
 0312           ; 下面为SD卡SPI命令
 0312           ; 
 0312           ; /*******************************************************************************
 0312           ; ** 函数名称: INT8U SD_ResetSD()                                               
 0312           ; ** 功能描述: 复位SD卡                                                         
 0312           ; ** 输   入: 无                                                                               
 0312           ; ** 输   出: 0:   正确    >0:   错误码                                
 0312           ; *******************************************************************************/
 0312           ; INT8U SD_ResetSD(void)
 0312           ; {
 0312           ;     INT8U param[4]={0,0,0,0},resp ;

⌨️ 快捷键说明

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