sd_cmd.lis

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

LIS
1,454
字号
 0556 CE01              movw R24,R28
 0558 0896              adiw R24,8
 055A 9B83              std y+3,R25
 055C 8A83              std y+2,R24
 055E 82E0              ldi R24,2
 0560 8883              std y+0,R24
 0562 9E01              movw R18,R28
 0564 2C5F              subi R18,252  ; offset = 4
 0566 3F4F              sbci R19,255
 0568 06E2              ldi R16,38
 056A 4ADD              xcall _SD_SendCmd
 056C A02E              mov R10,R16
 056E           ;     /* 擦除所选择的块  erase blocks selected */
 056E           ;     if(tmp!=SD_NO_ERR)
 056E 0023              tst R16
 0570 09F0              breq L52
 0572           ;         return tmp ;
 0572 07C0              xjmp L51
 0574           L52:
 0574           ;     
 0574           ;     /* 等待擦除完成 wait for finishing erasing */
 0574           ;     if(SD_WaitBusy(SD_WAIT_ERASE)!=SD_NO_ERR)
 0574 02E0              ldi R16,2
 0576 34D2              xcall _SD_WaitBusy
 0578 0023              tst R16
 057A 11F0              breq L54
 057C           ;         return SD_ERR_TIMEOUT_ERASE ;
 057C 03E3              ldi R16,51
 057E 01C0              xjmp L51
 0580           L54:
 0580           ;     else 
 0580           ;         return SD_NO_ERR ;
 0580 0027              clr R16
 0582           L51:
 0582 2996              adiw R28,9
 0584 0E940000          xcall pop_gset3
 0588                   .dbline 0 ; func end
 0588 0895              ret
                        .area lit(rom, con, rel)
 0010           L57:
 0010 0000              .byte 0,0
 0012 0000              .byte 0,0
                        .area text(rom, con, rel)
                ;          param -> y+9
                ;           resp -> y+4
                ;            tmp -> R20
                ;         recbuf -> R22,R23
                ;         ocrlen -> R20
                        .even
 058A           _SD_ReadOCR::
 058A 0E940000          xcall push_gset2
 058E B901              movw R22,R18
 0590 402F              mov R20,R16
 0592 2D97              sbiw R28,13
 0594           ; }
 0594           ; #endif 
 0594           ; 
 0594           ; /******************************************************************************
 0594           ; ** 函数名称: INT8U SD_ReadOCR()                                               
 0594           ; ** 功能描述: 读操作条件寄存器OCR                                      
 0594           ; ** 输   入: INT8U ocrlen  : 寄存器长度(固定为4)      
 0594           ;                INT8U *recbuf : 接收缓冲区                     
 0594           ; ** 输   出: 0:   正确    >0:   错误码                                
 0594           ; *******************************************************************************/
 0594           ; INT8U SD_ReadOCR(INT8U ocrlen,INT8U *recbuf)
 0594           ; {
 0594           ;     INT8U param[4]={0,0,0,0},resp[5],tmp ;
 0594 80E0              ldi R24,<L57
 0596 90E0              ldi R25,>L57
 0598 FE01              movw R30,R28
 059A 3996              adiw R30,9
 059C 04E0              ldi R16,4
 059E 10E0              ldi R17,0
 05A0 FA93              st -y,R31
 05A2 EA93              st -y,R30
 05A4 9A93              st -y,R25
 05A6 8A93              st -y,R24
 05A8 0E940000          xcall asgncblk
 05AC           ;     
 05AC           ;       ocrlen=ocrlen;
 05AC           ;     tmp=SD_SendCmd(CMD58,param,CMD58_R,resp);
 05AC CE01              movw R24,R28
 05AE 0496              adiw R24,4
 05B0 9B83              std y+3,R25
 05B2 8A83              std y+2,R24
 05B4 84E0              ldi R24,4
 05B6 8883              std y+0,R24
 05B8 9E01              movw R18,R28
 05BA 275F              subi R18,247  ; offset = 9
 05BC 3F4F              sbci R19,255
 05BE 0AE3              ldi R16,58
 05C0 1FDD              xcall _SD_SendCmd
 05C2 402F              mov R20,R16
 05C4           ;     /* 读 OCR 寄存器命令 */
 05C4           ;     /* read OCR register command */
 05C4           ;     if(tmp!=SD_NO_ERR)
 05C4 0023              tst R16
 05C6 09F0              breq L58
 05C8           ;         return tmp ;
 05C8 17C0              xjmp L56
 05CA           L58:
 05CA           ;     
 05CA           ;     if(resp[0]!=0)
 05CA 2C80              ldd R2,y+4
 05CC 2220              tst R2
 05CE 11F0              breq L60
 05D0           ;         return SD_ERR_CMD_RESP ;
 05D0 02E1              ldi R16,18
 05D2 12C0              xjmp L56
 05D4           L60:
 05D4           ;     /* 响应错误 response is error */
 05D4           ;     
 05D4           ;     for(tmp=0;tmp<4;tmp++)
 05D4 4427              clr R20
 05D6 0DC0              xjmp L65
 05D8           L62:
 05D8 CE01              movw R24,R28
 05DA 0596              adiw R24,5
 05DC E42F              mov R30,R20
 05DE FF27              clr R31
 05E0 E80F              add R30,R24
 05E2 F91F              adc R31,R25
 05E4 2080              ldd R2,z+0
 05E6 E42F              mov R30,R20
 05E8 FF27              clr R31
 05EA E60F              add R30,R22
 05EC F71F              adc R31,R23
 05EE 2082              std z+0,R2
 05F0           L63:
 05F0 4395              inc R20
 05F2           L65:
 05F2 4430              cpi R20,4
 05F4 88F3              brlo L62
 05F6           ;         recbuf[tmp]=resp[tmp+1];/* 复制OCR寄存器内容到接收缓冲区 */
 05F6           ;       
 05F6           ;     return SD_NO_ERR ;
 05F6 0027              clr R16
 05F8           L56:
 05F8 2D96              adiw R28,13
 05FA 0E940000          xcall pop_gset2
 05FE                   .dbline 0 ; func end
 05FE 0895              ret
 0600           ;           resp -> R12
 0600           ;              i -> y+0
 0600           ;         recbuf -> R10,R11
 0600           ;            len -> y+12
                        .even
 0600           _SD_ReadRegister::
 0600 0E940000          xcall push_arg4
 0604 0E940000          xcall push_gset4
 0608 2497              sbiw R28,4
 060A A888              ldd R10,y+16
 060C B988              ldd R11,y+17
 060E           ; }
 060E           ; 
 060E           ; /*******************************************************************************
 060E           ; ** 函数名称: INT8U SD_EnableCRC()                                     
 060E           ; ** 功能描述: 使能SD卡的CRC校验功能                                    
 060E           ; ** 输   入: INT8U bEnable : 1:使能 0:禁止                    
 060E           ; ** 输   出: 0:   正确    >0:   错误码                                
 060E           ; *******************************************************************************/
 060E           ; #if SD_CRC_EN 
 060E           ; INT8U SD_EnableCRC(INT8U bEnable)
 060E           ; {
 060E           ;     INT8U param[4],resp,ret ;
 060E           ;     
 060E           ;     if(bEnable==1)
 060E           ;         param[0]=1 ;/* 使能crc enable crc */
 060E           ;     else 
 060E           ;         param[1]=0 ;/* 禁止crc disalbe crc */
 060E           ;     
 060E           ;     ret=SD_SendCmd(CMD59,param,CMD59_R,&resp);
 060E           ;     /* "使能/禁止CRC"命令 enable/disable crc command */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     
 060E           ;     if(resp!=0)
 060E           ;         return SD_ERR_CMD_RESP ;/* 响应错误 response is error */
 060E           ;     
 060E           ;     return SD_NO_ERR ; 
 060E           ; }
 060E           ; #endif 
 060E           ; 
 060E           ; /*******************************************************************************
 060E           ; ** 函数名称: INT8U SD_Read_SD_Status()                                    
 060E           ; ** 功能描述: 读SD卡的 SD_Status 寄存器                                     
 060E           ; ** 输   入: INT8U sdslen: 寄存器长度(固定为64)       
 060E           ;            INT8U *recbuf : 接收缓冲区                         
 060E           ; ** 输   出: 0:   正确    >0:   错误码                                        
 060E           ; *******************************************************************************/
 060E           ; #if SD_ReadSD_Status_EN 
 060E           ; INT8U SD_ReadSD_Status(INT8U sdslen,INT8U *recbuf)
 060E           ; {
 060E           ;     INT8U param[4]={0,0,0,0},resp[2],ret ;
 060E           ;     
 060E           ;     ret=SD_SendCmd(CMD55,param,CMD55_R,resp);
 060E           ;     /* 后续命令为一个应用命令 */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     /* command that the followed commnad is a specific application */
 060E           ;     
 060E           ;     if(resp[0]!=0)
 060E           ;         return SD_ERR_CMD_RESP ;
 060E           ;     /* 响应错误 response is error */
 060E           ;     
 060E           ;     ret=SD_SendCmd(ACMD13,param,ACMD13_R,resp);
 060E           ;     /* 读 SD_Status 命令 */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     /* command that read SD_Status register */
 060E           ;     
 060E           ;     if((resp[0]!=0)||(resp[1]!=0))
 060E           ;         return SD_ERR_CMD_RESP ;/* 响应错误 response is error */
 060E           ;     
 060E           ;     return(SD_ReadBlockData(sdslen,recbuf));
 060E           ;     /* 读出寄存器内容 read the content of the register */
 060E           ; }
 060E           ; #endif 
 060E           ; 
 060E           ; /*******************************************************************************
 060E           ; ** 函数名称: INT8U SD_ReadSCR()                                                       
 060E           ; ** 功能描述: 读SD卡的 SCR 寄存器                                              
 060E           ; ** 输   入: INT8U scrlen             : 寄存器长度(固定为8)   
 060E           ;            INT8U *recbuf              : 接收缓冲区                                    
 060E           ; ** 输   出: 0:   正确    >0:   错误码                                        
 060E           ; *******************************************************************************/
 060E           ; #if SD_ReadSCR_EN 
 060E           ; INT8U SD_ReadSCR(INT8U scrlen,INT8U *recbuf)
 060E           ; {
 060E           ;     INT8U param[4]={0,0,0,0},resp,ret ;
 060E           ;     
 060E           ;     ret=SD_SendCmd(CMD55,param,CMD55_R,&resp);
 060E           ;     /* 后续命令为一个应用命令 */
 060E           ;     /* command that the followed commnad is a specific application */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     
 060E           ;     if(resp!=0)
 060E           ;         return SD_ERR_CMD_RESP ;
 060E           ;     /* 响应错误 response is error */
 060E           ;     
 060E           ;     ret=SD_SendCmd(ACMD51,param,ACMD51_R,&resp);
 060E           ;     /* 发送读 SD_Status 命令*/
 060E           ;     /* command that read SD_Status register */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     
 060E           ;     if(resp!=0)
 060E           ;         return SD_ERR_CMD_RESP ;
 060E           ;     /* 响应错误 response is error */
 060E           ;     
 060E           ;     return(SD_ReadBlockData(scrlen,recbuf));
 060E           ;     /* 读出寄存器内容 read the content of the register */
 060E           ; }
 060E           ; #endif 
 060E           ; 
 060E           ; /*******************************************************************************
 060E           ; ** 函数名称: INT8U SD_GetNumWRBlcoks()                                
 060E           ; ** 功能描述: 得到正确写入的块数                                               
 060E           ; ** 输   入: INT32U *blocknum: 返回的块数                     
 060E           ; ** 输   出: 0:   正确    >0:   错误码                                
 060E           ; *******************************************************************************/
 060E           ; #if SD_WriteMultiBlock_EN 
 060E           ; INT8U SD_GetNumWRBlcoks(INT32U *blocknum)
 060E           ; {
 060E           ;     INT8U tmp[4]={0,0,0,0},resp,ret ;
 060E           ;     
 060E           ;     ret=SD_SendCmd(CMD55,tmp,CMD55_R,&resp);
 060E           ;     /* 后续命令为一个应用命令 */
 060E           ;     /* command that the followed commnad is a specific application */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     
 060E           ;     if(resp!=0)
 060E           ;         return SD_ERR_CMD_RESP ;
 060E           ;     
 060E           ;     ret=SD_SendCmd(ACMD22,tmp,ACMD22_R,&resp);
 060E           ;     /* 读取正确写入的块数命令 */
 060E           ;     /* command that read the numbers of block written correctly */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;         return ret ;
 060E           ;     
 060E           ;     if(resp!=0)
 060E           ;         return SD_ERR_CMD_RESP ;
 060E           ;     /* 响应错误 response is error */
 060E           ;     
 060E           ;     ret=SD_ReadBlockData(4,tmp);
 060E           ;     /* 读块数 read the numbvers of block */
 060E           ;     if(ret!=SD_NO_ERR)
 060E           ;        

⌨️ 快捷键说明

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