sd_drive.lis

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

LIS
1,540
字号
 00F2           ; *******************************************************************************/
 00F2           ; #if SD_Read_Dword_EN 
 00F2           ; INT32U SD_Read_Dword(INT32U blockaddr,INT16U offset)
 00F2           ; {
 00F2           ;     INT8U  *buff;
 00F2           ;     INT32U resp;
 00F2           ;     
 00F2           ;     buff=Data_Buf;
 00F2           ;     
 00F2           ;     if( SD_ReadBlock(blockaddr,buff)==0 )
 00F2           ;     {
 00F2           ;         resp=buff[offset+3];
 00F2           ;       resp=(resp<<8)+buff[offset+2];
 00F2           ;       resp=(resp<<8)+buff[offset+1];
 00F2           ;       resp=(resp<<8)+buff[offset];
 00F2           ;       return resp;
 00F2           ;     }
 00F2           ;     return 0xFFFFFFFF;
 00F2           ; }
 00F2           ; #endif
 00F2           ; 
 00F2           ; 
 00F2           ; /*******************************************************************************
 00F2           ; ** 函数名称: INT8U SD_ReadMultiBlock()                                
 00F2           ; ** 功能描述: 从SD卡中读多个块                                         
 00F2           ; ** 输   入: INT32U blockaddr: 块地址                         
 00F2           ;            INT32U blocknum : 块数量                                   
 00F2           ;            INT8U *recbuf   : 接收缓冲区,每块512字节            
 00F2           ; ** 输   出: 0:   正确    >0:   错误码                                
 00F2           ; *******************************************************************************/
 00F2           ; #if SD_ReadMultiBlock_EN 
 00F2           ; INT8U SD_ReadMultiBlock(INT32U blockaddr,INT32U blocknum,INT8U*recbuf)
 00F2           ; {
 00F2           ;     INT32U i ;
 00F2           ;     INT8U ret ;
 00F2           ;     
 00F2           ;     if((blockaddr+blocknum)>sds.block_num)
 00F2           ;         return SD_ERR_OVER_CARDRANGE ;
 00F2           ;     /* 操作超出卡容量范围 operate over the card range */
 00F2           ;     
 00F2           ;     ret=SD_ReadMultipleBlock(blockaddr);
 00F2           ;     /* 读多块命令 read multiple blocks command */
 00F2           ;     if(ret!=SD_NO_ERR)
 00F2           ;         return ret ;
 00F2           ;     
 00F2           ;     for(i=0;i<blocknum;i++)
 00F2           ;     {
 00F2           ;         /* 读出数据 read data from sd card */
 00F2           ;         ret=SD_ReadBlockData(SD_BLOCKSIZE,recbuf);
 00F2           ;         if(ret==SD_NO_ERR)
 00F2           ;             recbuf=recbuf+SD_BLOCKSIZE ;
 00F2           ;         else 
 00F2           ;             return ret ;
 00F2           ;     }
 00F2           ;     return(SD_StopTransmission());
 00F2           ;     /* 结束数据传输 stop transmission operation */
 00F2           ; }
 00F2           ; #endif 
 00F2           ; 
 00F2           ; /*******************************************************************************
 00F2           ; ** 函数名称: INT8U SD_WriteBlock()                                    
 00F2           ; ** 功能描述: 向SD卡中写入一个块                                               
 00F2           ; ** 输   入: INT32U blockaddr: 块地址                         
 00F2           ;            INT8U *sendbuf  : 发送缓冲区,长度512Bytes          
 00F2           ; ** 输   出: 0:   正确    >0:   错误码                                
 00F2           ; *******************************************************************************/
 00F2           ; INT8U SD_WriteBlock(INT32U blockaddr,INT8U *sendbuf)
 00F2           ; {
 00F2           ;     INT8U ret,tmp[2];
 00F2           ;     
 00F2           ;     if(blockaddr>sds.block_num)
 00F2 40900200          lds R4,_sds+2
 00F6 50900300          lds R5,_sds+2+1
 00FA 20900000          lds R2,_sds
 00FE 30900100          lds R3,_sds+1
 0102 FE01              movw R30,R28
 0104 6484              ldd R6,z+12
 0106 7584              ldd R7,z+13
 0108 8684              ldd R8,z+14
 010A 9784              ldd R9,z+15
 010C 2614              cp R2,R6
 010E 3704              cpc R3,R7
 0110 4804              cpc R4,R8
 0112 5904              cpc R5,R9
 0114 10F4              brsh L21
 0116           ;         return SD_ERR_OVER_CARDRANGE ;
 0116 05E0              ldi R16,5
 0118 35C0              xjmp L20
 011A           L21:
 011A           ;     /* 操作超出卡容量范围 operate over the card range */
 011A           ;     
 011A           ;     if(SD_ChkCardWP()==1)
 011A 0E940000          xcall _SD_ChkCardWP
 011E 0130              cpi R16,1
 0120 11F4              brne L23
 0122           ;         return SD_ERR_WRITE_PROTECT ;
 0122 02E4              ldi R16,66
 0124 2FC0              xjmp L20
 0126           L23:
 0126           ;     /* 卡有写保护 */
 0126           ;     
 0126           ;     ret=SD_WriteSingleBlock(blockaddr);
 0126 FE01              movw R30,R28
 0128 0485              ldd R16,z+12
 012A 1585              ldd R17,z+13
 012C 2685              ldd R18,z+14
 012E 3785              ldd R19,z+15
 0130 0E940000          xcall _SD_WriteSingleBlock
 0134 A02E              mov R10,R16
 0136           ;     /* 写单块命令 write single block */
 0136           ;     if(ret!=SD_NO_ERR)
 0136 0023              tst R16
 0138 09F0              breq L25
 013A           ;         return ret ;
 013A 24C0              xjmp L20
 013C           L25:
 013C           ;     
 013C           ;     ret=SD_WriteBlockData(0,SD_BLOCKSIZE,sendbuf);
 013C 0888              ldd R0,y+16
 013E 1988              ldd R1,y+17
 0140 1B82              std y+3,R1
 0142 0A82              std y+2,R0
 0144 40E0              ldi R20,0
 0146 52E0              ldi R21,2
 0148 60E0              ldi R22,0
 014A 70E0              ldi R23,0
 014C 6883              std y+0,R22
 014E 7983              std y+1,R23
 0150 9A01              movw R18,R20
 0152 0027              clr R16
 0154 0E940000          xcall _SD_WriteBlockData
 0158 A02E              mov R10,R16
 015A           ;     /* 写入数据 write data */
 015A           ;     /* 读Card Status寄存器, 检查写入是否成功 */
 015A           ;     if(ret==SD_NO_ERR)
 015A 0023              tst R16
 015C 91F4              brne L27
 015E           ;     {
 015E           ;         /* read Card Status register to check write wheather sucessfully */
 015E           ;         ret=SD_ReadCard_Status(2,tmp);
 015E 9E01              movw R18,R28
 0160 2C5F              subi R18,252  ; offset = 4
 0162 3F4F              sbci R19,255
 0164 02E0              ldi R16,2
 0166 0E940000          xcall _SD_ReadCard_Status
 016A A02E              mov R10,R16
 016C           ;         if(ret!=SD_NO_ERR)
 016C 0023              tst R16
 016E 09F0              breq L29
 0170           ;             return ret ;
 0170 09C0              xjmp L20
 0172           L29:
 0172           ;         /* 读寄存器失败 read register fail */
 0172           ;         
 0172           ;         if((tmp[0]!=0)||(tmp[1]!=0))
 0172 2C80              ldd R2,y+4
 0174 2220              tst R2
 0176 19F4              brne L34
 0178 2D80              ldd R2,y+5
 017A 2220              tst R2
 017C 11F0              breq L31
 017E           L34:
 017E           ;         ret=SD_ERR_WRITE_BLK ;
 017E 80E4              ldi R24,64
 0180 A82E              mov R10,R24
 0182           L31:
 0182           ;         /* 响应指示写失败 response indicate write fail */
 0182           ;     }
 0182           L27:
 0182           ;     return ret ;/* 返回写入结果 return the result of writing */
 0182 0A2D              mov R16,R10
 0184           L20:
 0184 2696              adiw R28,6
 0186 0E940000          xcall pop_gset3
 018A 2496              adiw R28,4
 018C                   .dbline 0 ; func end
 018C 0895              ret
 018E           ;            tmp -> y+0
 018E           ;            ret -> R10
 018E           ;       blocknum -> y+14
 018E           ;      startaddr -> y+10
                        .even
 018E           _SD_EraseBlock::
 018E 0E940000          xcall push_arg4
 0192 0E940000          xcall push_gset3
 0196 2497              sbiw R28,4
 0198           ; }
 0198           ; 
 0198           ; /*******************************************************************************
 0198           ; ** 函数名称: INT8U SD_WriteMultiBlock()                               
 0198           ; ** 功能描述: 向SD卡中写入多个块                                               
 0198           ; ** 输   入: INT32U blockaddr: 块地址                         
 0198           ;            INT32U blocknum : 块数量                                   
 0198           ;            INT8U *sendbuf  : 发送缓冲区每块512字节            
 0198           ; ** 输   出: 0:   正确    >0:   错误码                                
 0198           ; *******************************************************************************/
 0198           ; #if SD_WriteMultiBlock_EN 
 0198           ; INT8U SD_WriteMultiBlock(INT32U blockaddr,INT32U blocknum,INT8U *sendbuf)
 0198           ; {
 0198           ;     INT32U i ;
 0198           ;     INT8U ret ;
 0198           ;     
 0198           ;     if((blockaddr+blocknum)>sds.block_num)
 0198           ;         return SD_ERR_OVER_CARDRANGE ;
 0198           ;     /* 操作超出卡容量范围 operate over the card range */
 0198           ;     
 0198           ;     if(SD_ChkCardWP()==1)
 0198           ;         return SD_ERR_WRITE_PROTECT ;
 0198           ;     /* 卡有写保护 */
 0198           ;     
 0198           ;     ret=SD_WriteMultipleBlock(blockaddr);
 0198           ;     /* 写多块命令 write multiple blocks command */
 0198           ;     if(ret!=SD_NO_ERR)
 0198           ;         return ret ;
 0198           ;     
 0198           ;     for(i=0;i<blocknum;i++)
 0198           ;     {
 0198           ;         ret=SD_WriteBlockData(1,SD_BLOCKSIZE,sendbuf);
 0198           ;         /* 写入数据 write data */
 0198           ;         if(ret==SD_NO_ERR)
 0198           ;             sendbuf=sendbuf+SD_BLOCKSIZE ;
 0198           ;         else 
 0198           ;         {
 0198           ;             /* 写失败 write fail */
 0198           ;             SD_StopTransmission();
 0198           ;             /* 停止数据传输 stop data transmission */
 0198           ;             SD_WaitBusy(SD_WAIT_WRITE);
 0198           ;             /* 等待 waiting */
 0198           ;             return ret ;
 0198           ;         }
 0198           ;     }
 0198           ;     
 0198           ;     SD_StopMultiToken();
 0198           ;     /* 发送数据停止令牌 send data stop token */
 0198           ;     
 0198           ;     ret=SD_WaitBusy(SD_WAIT_WRITE);
 0198           ;     /* 等待写入的完成 wait for finishing writing */
 0198           ;     if(ret!=SD_NO_ERR)
 0198           ;        return SD_ERR_TIMEOUT_WRITE ;
 0198           ;     
 0198           ;     ret=SD_GetNumWRBlcoks(&i);
 0198           ;     /* 读正确写入的块数 read the blocks that be written correctly */
 0198           ;     if(ret!=SD_NO_ERR)
 0198           ;        return ret ;
 0198           ;     
 0198           ;     if(i!=blocknum)
 0198           ;        return SD_ERR_WRITE_BLKNUMS ;
 0198           ;     /* 正确写入块数错误 the blocks that be written correctly is error */
 0198           ;     
 0198           ;     return SD_NO_ERR ;
 0198           ;     /* 返回写入成功 return write sucessfully */
 0198           ; }
 0198           ; #endif 
 0198           ; 
 0198           ; /*******************************************************************************
 0198           ; ** 函数名称: INT8U SD_EraseBlock()                                    
 0198           ; ** 功能描述: 擦除SD卡中的块                                                   
 0198           ; ** 输   入: INT32U startaddr: 起始地址                               
 0198           ;            INT32U endaddr  : 终止地址                         
 0198           ; ** 输   出: 0:   正确    >0:   错误码                                
 0198           ; ** 注    意: startaddr 和 blocknum 建议为sds.erase_uint的整数倍, 
 0198           ;              因为有的卡只能以sds.erase_uint为单位进行擦除
 0198           ; *******************************************************************************/
 0198           ; #if SD_EraseBlock_EN 
 0198           ; INT8U SD_EraseBlock(INT32U startaddr,INT32U blocknum)
 0198           ; {
 0198           ;     INT32S tmp ;
 0198           ;     INT8U ret ;
 0198           ;     
 0198           ;     if((startaddr+blocknum)>sds.block_num)
 0198 FE01              movw R30,R28
 019A 2684              ldd R2,z+14
 019C 3784              ldd R3,z+15
 019E 4088              ldd R4,z+16
 01A0 5188              ldd R5,z+17
 01A2 FE01              movw R30,R28
 01A4 6284              ldd R6,z+10
 01A6 7384              ldd R7,z+11
 01A8 8484              ldd R8,z+12
 01AA 9584              ldd R9,z+13
 01AC 620C              add R6,R2
 01AE 731C              adc R7,R3
 01B0 841C              adc R8,R4
 01B2 951C              adc R9,R5
 01B4 40900200          lds R4,_sds+2
 01B8 50900300          lds R5,_sds+2+1
 01BC 20900000          lds R2,_sds
 01C0 30900100          lds R3,_sds+1
 01C4 2614              cp R2,R6
 01C6 3704              cpc R3,R7
 01C8 4804              cpc R4,R8
 01CA 5904              cpc R5,R9
 01CC 10F4              brsh L36
 01CE           ;         return SD_ERR_OVER_CARDRANGE ;
 01CE 05E0              ldi R16,5
 01D0 DFC0              xjmp L35
 01D2           L36:
 01D2           ;     /* 操作超出卡容量范围 operate over the card range */
 01D2           ;     
 01D2           ;     if(SD_ChkCardWP()==1)
 01D2 0E940000          xcall _SD_ChkCardWP
 01D6 0130              cpi R16,1
 01D8 11F4              brne L38
 01DA           ;         return SD_ERR_WRITE_PROTECT ;
 01DA 02E4              ldi R16,66
 01DC D9C0              xjmp L35
 01DE           L38:
 01DE           ;     /* 卡有写保护 */

⌨️ 快捷键说明

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