sd_drive.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,540 行 · 第 1/5 页
LIS
1,540 行
01DE ;
01DE ; tmp=blocknum-sds.erase_unit ;
01DE 40900A00 lds R4,_sds+8+2
01E2 50900B00 lds R5,_sds+8+2+1
01E6 20900800 lds R2,_sds+8
01EA 30900900 lds R3,_sds+8+1
01EE FE01 movw R30,R28
01F0 6684 ldd R6,z+14
01F2 7784 ldd R7,z+15
01F4 8088 ldd R8,z+16
01F6 9188 ldd R9,z+17
01F8 6218 sub R6,R2
01FA 7308 sbc R7,R3
01FC 8408 sbc R8,R4
01FE 9508 sbc R9,R5
0200 FE01 movw R30,R28
0202 6082 std z+0,R6
0204 7182 std z+1,R7
0206 8282 std z+2,R8
0208 9382 std z+3,R9
020A 74C0 xjmp L42
020C L41:
020C ; /* 每次擦除扇区大小 once erase is sector size */
020C ; while(tmp>=0)
020C ; {
020C ; ret=SD_EraseStartBlock(startaddr);
020C FE01 movw R30,R28
020E 0285 ldd R16,z+10
0210 1385 ldd R17,z+11
0212 2485 ldd R18,z+12
0214 3585 ldd R19,z+13
0216 0E940000 xcall _SD_EraseStartBlock
021A A02E mov R10,R16
021C ; /* 选择起始块地址 select start address */
021C ; if(ret!=SD_NO_ERR)
021C 0023 tst R16
021E 09F0 breq L44
0220 ; return ret ;
0220 B7C0 xjmp L35
0222 L44:
0222 ;
0222 ; ret=SD_EraseEndBlock(startaddr+sds.erase_unit-1);
0222 40900A00 lds R4,_sds+8+2
0226 50900B00 lds R5,_sds+8+2+1
022A 20900800 lds R2,_sds+8
022E 30900900 lds R3,_sds+8+1
0232 FE01 movw R30,R28
0234 6284 ldd R6,z+10
0236 7384 ldd R7,z+11
0238 8484 ldd R8,z+12
023A 9584 ldd R9,z+13
023C 620C add R6,R2
023E 731C adc R7,R3
0240 841C adc R8,R4
0242 951C adc R9,R5
0244 41E0 ldi R20,1
0246 50E0 ldi R21,0
0248 60E0 ldi R22,0
024A 70E0 ldi R23,0
024C 641A sub R6,R20
024E 750A sbc R7,R21
0250 860A sbc R8,R22
0252 970A sbc R9,R23
0254 8301 movw R16,R6
0256 9401 movw R18,R8
0258 0E940000 xcall _SD_EraseEndBlock
025C A02E mov R10,R16
025E ; /* 选择终止块地址 select end address */
025E ; if(ret!=SD_NO_ERR)
025E 0023 tst R16
0260 09F0 breq L47
0262 ; return ret ;
0262 96C0 xjmp L35
0264 L47:
0264 ;
0264 ; ret=SD_EraseSelectedBlock();
0264 0E940000 xcall _SD_EraseSelectedBlock
0268 A02E mov R10,R16
026A ; /* 擦除所选的块 erase blocks selected */
026A ; if(ret!=SD_NO_ERR)
026A 0023 tst R16
026C 09F0 breq L49
026E ; return ret ;
026E 90C0 xjmp L35
0270 L49:
0270 40900A00 lds R4,_sds+8+2
0274 50900B00 lds R5,_sds+8+2+1
0278 20900800 lds R2,_sds+8
027C 30900900 lds R3,_sds+8+1
0280 FE01 movw R30,R28
0282 6284 ldd R6,z+10
0284 7384 ldd R7,z+11
0286 8484 ldd R8,z+12
0288 9584 ldd R9,z+13
028A 620C add R6,R2
028C 731C adc R7,R3
028E 841C adc R8,R4
0290 951C adc R9,R5
0292 FE01 movw R30,R28
0294 6286 std z+10,R6
0296 7386 std z+11,R7
0298 8486 std z+12,R8
029A 9586 std z+13,R9
029C 40900A00 lds R4,_sds+8+2
02A0 50900B00 lds R5,_sds+8+2+1
02A4 20900800 lds R2,_sds+8
02A8 30900900 lds R3,_sds+8+1
02AC FE01 movw R30,R28
02AE 6684 ldd R6,z+14
02B0 7784 ldd R7,z+15
02B2 8088 ldd R8,z+16
02B4 9188 ldd R9,z+17
02B6 6218 sub R6,R2
02B8 7308 sbc R7,R3
02BA 8408 sbc R8,R4
02BC 9508 sbc R9,R5
02BE FE01 movw R30,R28
02C0 6686 std z+14,R6
02C2 7786 std z+15,R7
02C4 808A std z+16,R8
02C6 918A std z+17,R9
02C8 40900A00 lds R4,_sds+8+2
02CC 50900B00 lds R5,_sds+8+2+1
02D0 20900800 lds R2,_sds+8
02D4 30900900 lds R3,_sds+8+1
02D8 FE01 movw R30,R28
02DA 6684 ldd R6,z+14
02DC 7784 ldd R7,z+15
02DE 8088 ldd R8,z+16
02E0 9188 ldd R9,z+17
02E2 6218 sub R6,R2
02E4 7308 sbc R7,R3
02E6 8408 sbc R8,R4
02E8 9508 sbc R9,R5
02EA FE01 movw R30,R28
02EC 6082 std z+0,R6
02EE 7182 std z+1,R7
02F0 8282 std z+2,R8
02F2 9382 std z+3,R9
02F4 L42:
02F4 40E0 ldi R20,0
02F6 50E0 ldi R21,0
02F8 60E0 ldi R22,0
02FA 70E0 ldi R23,0
02FC FE01 movw R30,R28
02FE 2080 ldd R2,z+0
0300 3180 ldd R3,z+1
0302 4280 ldd R4,z+2
0304 5380 ldd R5,z+3
0306 2416 cp R2,R20
0308 3506 cpc R3,R21
030A 4606 cpc R4,R22
030C 5706 cpc R5,R23
030E 0CF0 brlt X0
0310 7DCF xjmp L41
0312 X0:
0312 ;
0312 ; startaddr+=sds.erase_unit ;
0312 ; /* 起始地址递增 */
0312 ; blocknum-=sds.erase_unit ;
0312 ; tmp=blocknum-sds.erase_unit ;
0312 ; };
0312 ;
0312 ; /* 擦除不够擦除扇区大小的块 */
0312 ; if(blocknum>0)
0312 40E0 ldi R20,0
0314 50E0 ldi R21,0
0316 60E0 ldi R22,0
0318 70E0 ldi R23,0
031A FE01 movw R30,R28
031C 2684 ldd R2,z+14
031E 3784 ldd R3,z+15
0320 4088 ldd R4,z+16
0322 5188 ldd R5,z+17
0324 2416 cp R2,R20
0326 3506 cpc R3,R21
0328 4606 cpc R4,R22
032A 5706 cpc R5,R23
032C 09F4 brne X1
032E 2FC0 xjmp L54
0330 X1:
0330 ; {
0330 ; /* erase blocks that numbers is not enough a sector */
0330 ; ret=SD_EraseStartBlock(startaddr);
0330 FE01 movw R30,R28
0332 0285 ldd R16,z+10
0334 1385 ldd R17,z+11
0336 2485 ldd R18,z+12
0338 3585 ldd R19,z+13
033A 0E940000 xcall _SD_EraseStartBlock
033E A02E mov R10,R16
0340 ; if(ret!=SD_NO_ERR)
0340 0023 tst R16
0342 09F0 breq L56
0344 ; return ret ;
0344 25C0 xjmp L35
0346 L56:
0346 ;
0346 ; ret=SD_EraseEndBlock(startaddr+blocknum-1);
0346 FE01 movw R30,R28
0348 2684 ldd R2,z+14
034A 3784 ldd R3,z+15
034C 4088 ldd R4,z+16
034E 5188 ldd R5,z+17
0350 FE01 movw R30,R28
0352 6284 ldd R6,z+10
0354 7384 ldd R7,z+11
0356 8484 ldd R8,z+12
0358 9584 ldd R9,z+13
035A 620C add R6,R2
035C 731C adc R7,R3
035E 841C adc R8,R4
0360 951C adc R9,R5
0362 41E0 ldi R20,1
0364 50E0 ldi R21,0
0366 60E0 ldi R22,0
0368 70E0 ldi R23,0
036A 641A sub R6,R20
036C 750A sbc R7,R21
036E 860A sbc R8,R22
0370 970A sbc R9,R23
0372 8301 movw R16,R6
0374 9401 movw R18,R8
0376 0E940000 xcall _SD_EraseEndBlock
037A A02E mov R10,R16
037C ; if(ret!=SD_NO_ERR)
037C 0023 tst R16
037E 09F0 breq L58
0380 ; return ret ;
0380 07C0 xjmp L35
0382 L58:
0382 ;
0382 ; ret=SD_EraseSelectedBlock();
0382 0E940000 xcall _SD_EraseSelectedBlock
0386 A02E mov R10,R16
0388 ; if(ret!=SD_NO_ERR)
0388 0023 tst R16
038A 09F0 breq L60
038C ; return ret ;
038C 01C0 xjmp L35
038E L60:
038E ; }
038E L54:
038E ; return SD_NO_ERR ;/* 返回擦除成功 return erase sucessfully */
038E 0027 clr R16
0390 L35:
0390 2496 adiw R28,4
0392 0E940000 xcall pop_gset3
0396 2496 adiw R28,4
0398 .dbline 0 ; func end
0398 0895 ret
039A ; tmp -> y+16
039A ; ret -> R10
039A ; csdbuf -> y+0
.even
039A _SD_GetCardInfo::
039A 0E940000 xcall push_gset3
039E 6497 sbiw R28,20
03A0 ; }
03A0 ; #endif
03A0 ;
03A0 ;
03A0 ; /*******************************************************************************
03A0 ; ** 函数名称: INT8U SD_GetCardInfo()
03A0 ; ** 功能描述: 获得SD卡的信息
03A0 ; ** 输 入: INT8U cardtype: 卡类型
03A0 ; ** 输 出: 0: 正确 >0: 错误码 O
03A0 ; *******************************************************************************/
03A0 ; INT8U SD_GetCardInfo(void)
03A0 ; {
03A0 ; INT32U tmp ;
03A0 ; INT8U csdbuf[16],ret ;
03A0 ;
03A0 ; ret=SD_ReadCSD(16,csdbuf);/* 读CSD寄存器 */
03A0 9E01 movw R18,R28
03A2 00E1 ldi R16,16
03A4 0E940000 xcall _SD_ReadCSD
03A8 A02E mov R10,R16
03AA ; if(ret!=SD_NO_ERR)
03AA 0023 tst R16
03AC 09F0 breq L63
03AE ; return ret ;
03AE E9C0 xjmp L62
03B0 L63:
03B0 ;
03B0 ; SD_CalTimeout(csdbuf);/* 计算超时时间值 */
03B0 8E01 movw R16,R28
03B2 EBD0 xcall _SD_CalTimeout
03B4 ;
03B4 ; /* 计算块的最大长度 */
03B4 ; /* calculate the size of a sector */
03B4 ; sds.block_len=1<<(csdbuf[READ_BL_LEN_POS]&READ_BL_LEN_MSK);
03B4 2D81 ldd R18,y+5
03B6 3327 clr R19
03B8 2F70 andi R18,15
03BA 3070 andi R19,0
03BC 01E0 ldi R16,1
03BE 10E0 ldi R17,0
03C0 0E940000 xcall lsl16
03C4 1801 movw R2,R16
03C6 4424 clr R4
03C8 37FC sbrc R3,7
03CA 4094 com R4
03CC 5524 clr R5
03CE 47FC sbrc R4,7
03D0 5094 com R5
03D2 30920500 sts _sds+4+1,R3
03D6 20920400 sts _sds+4,R2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?