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 + -
显示快捷键?