sd_drive.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,540 行 · 第 1/5 页
LIS
1,540 行
03DA 50920700 sts _sds+4+2+1,R5
03DE 40920600 sts _sds+4+2,R4
03E2 ; /* (2 ^ READ_BL_LEN) */
03E2 ;
03E2 ; /* 计算卡中块的个数 */
03E2 ; /* calculate the sector numbers of the SD Card */
03E2 ; sds.block_num=((INT32U)(csdbuf[C_SIZE_POS1]&C_SIZE_MSK1)<<10)+((INT32U)csdbuf[C_SIZE_POS2]<<2)+((csdbuf[C_SIZE_POS3]&C_SIZE_MSK3)>>6)+1 ;
03E2 82E0 ldi R24,2
03E4 90E0 ldi R25,0
03E6 2F80 ldd R2,y+7
03E8 3324 clr R3
03EA 4424 clr R4
03EC 5524 clr R5
03EE 8A93 st -y,R24
03F0 8101 movw R16,R2
03F2 9201 movw R18,R4
03F4 0E940000 xcall lsl32
03F8 1801 movw R2,R16
03FA 2901 movw R4,R18
03FC 8AE0 ldi R24,10
03FE 90E0 ldi R25,0
0400 EE81 ldd R30,y+6
0402 FF27 clr R31
0404 E370 andi R30,3
0406 F070 andi R31,0
0408 3F01 movw R6,R30
040A 8824 clr R8
040C 77FC sbrc R7,7
040E 8094 com R8
0410 9924 clr R9
0412 87FC sbrc R8,7
0414 9094 com R9
0416 8A93 st -y,R24
0418 8301 movw R16,R6
041A 9401 movw R18,R8
041C 0E940000 xcall lsl32
0420 3801 movw R6,R16
0422 4901 movw R8,R18
0424 620C add R6,R2
0426 731C adc R7,R3
0428 841C adc R8,R4
042A 951C adc R9,R5
042C 26E0 ldi R18,6
042E 30E0 ldi R19,0
0430 0885 ldd R16,y+8
0432 1127 clr R17
0434 007C andi R16,192
0436 1070 andi R17,0
0438 0E940000 xcall asr16
043C 1801 movw R2,R16
043E 4424 clr R4
0440 37FC sbrc R3,7
0442 4094 com R4
0444 5524 clr R5
0446 47FC sbrc R4,7
0448 5094 com R5
044A 620C add R6,R2
044C 731C adc R7,R3
044E 841C adc R8,R4
0450 951C adc R9,R5
0452 41E0 ldi R20,1
0454 50E0 ldi R21,0
0456 60E0 ldi R22,0
0458 70E0 ldi R23,0
045A 640E add R6,R20
045C 751E adc R7,R21
045E 861E adc R8,R22
0460 971E adc R9,R23
0462 70920100 sts _sds+1,R7
0466 60920000 sts _sds,R6
046A 90920300 sts _sds+2+1,R9
046E 80920200 sts _sds+2,R8
0472 ; /* (C_SIZE + 1)*/
0472 ;
0472 ; tmp=((INT32U)(csdbuf[C_SIZE_MULT_POS1]&C_SIZE_MULT_MSK1)<<1)+((csdbuf[C_SIZE_MULT_POS2]&C_SIZE_MULT_MSK2)>>7)+2 ;
0472 27E0 ldi R18,7
0474 30E0 ldi R19,0
0476 0A85 ldd R16,y+10
0478 1127 clr R17
047A 0078 andi R16,128
047C 1070 andi R17,0
047E 0E940000 xcall asr16
0482 1801 movw R2,R16
0484 4424 clr R4
0486 37FC sbrc R3,7
0488 4094 com R4
048A 5524 clr R5
048C 47FC sbrc R4,7
048E 5094 com R5
0490 8985 ldd R24,y+9
0492 9927 clr R25
0494 8370 andi R24,3
0496 9070 andi R25,0
0498 3C01 movw R6,R24
049A 8824 clr R8
049C 77FC sbrc R7,7
049E 8094 com R8
04A0 9924 clr R9
04A2 87FC sbrc R8,7
04A4 9094 com R9
04A6 660C lsl R6
04A8 771C rol R7
04AA 881C rol R8
04AC 991C rol R9
04AE 620C add R6,R2
04B0 731C adc R7,R3
04B2 841C adc R8,R4
04B4 951C adc R9,R5
04B6 42E0 ldi R20,2
04B8 50E0 ldi R21,0
04BA 60E0 ldi R22,0
04BC 70E0 ldi R23,0
04BE 640E add R6,R20
04C0 751E adc R7,R21
04C2 861E adc R8,R22
04C4 971E adc R9,R23
04C6 FE01 movw R30,R28
04C8 608A std z+16,R6
04CA 718A std z+17,R7
04CC 828A std z+18,R8
04CE 938A std z+19,R9
04D0 ; /* (C_SIZE_MULT + 2) */
04D0 ;
04D0 ; /* 获得卡中块的数量 */
04D0 ; /* get the block numbers in card */
04D0 ; sds.block_num=sds.block_num*(1<<tmp);
04D0 FE01 movw R30,R28
04D2 2089 ldd R18,z+16
04D4 3189 ldd R19,z+17
04D6 01E0 ldi R16,1
04D8 10E0 ldi R17,0
04DA 0E940000 xcall lsl16
04DE 1801 movw R2,R16
04E0 4424 clr R4
04E2 37FC sbrc R3,7
04E4 4094 com R4
04E6 5524 clr R5
04E8 47FC sbrc R4,7
04EA 5094 com R5
04EC 80900200 lds R8,_sds+2
04F0 90900300 lds R9,_sds+2+1
04F4 60900000 lds R6,_sds
04F8 70900100 lds R7,_sds+1
04FC 5A92 st -y,R5
04FE 4A92 st -y,R4
0500 3A92 st -y,R3
0502 2A92 st -y,R2
0504 8301 movw R16,R6
0506 9401 movw R18,R8
0508 0E940000 xcall empy32u
050C 10930100 sts _sds+1,R17
0510 00930000 sts _sds,R16
0514 30930300 sts _sds+2+1,R19
0518 20930200 sts _sds+2,R18
051C ; /* (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */
051C ;
051C ; /* 计算扇区大小 */
051C ; /*calculate the size of sector */
051C ; sds.erase_unit=((INT32U)(csdbuf[SECTOR_SIZE_POS1]&SECTOR_SIZE_MSK1)<<1)+((csdbuf[SECTOR_SIZE_POS2]&SECTOR_SIZE_MSK2)>>7)+1 ;
051C 27E0 ldi R18,7
051E 30E0 ldi R19,0
0520 0B85 ldd R16,y+11
0522 1127 clr R17
0524 0078 andi R16,128
0526 1070 andi R17,0
0528 0E940000 xcall asr16
052C 1801 movw R2,R16
052E 4424 clr R4
0530 37FC sbrc R3,7
0532 4094 com R4
0534 5524 clr R5
0536 47FC sbrc R4,7
0538 5094 com R5
053A 8A85 ldd R24,y+10
053C 9927 clr R25
053E 8F73 andi R24,63
0540 9070 andi R25,0
0542 3C01 movw R6,R24
0544 8824 clr R8
0546 77FC sbrc R7,7
0548 8094 com R8
054A 9924 clr R9
054C 87FC sbrc R8,7
054E 9094 com R9
0550 660C lsl R6
0552 771C rol R7
0554 881C rol R8
0556 991C rol R9
0558 620C add R6,R2
055A 731C adc R7,R3
055C 841C adc R8,R4
055E 951C adc R9,R5
0560 41E0 ldi R20,1
0562 50E0 ldi R21,0
0564 60E0 ldi R22,0
0566 70E0 ldi R23,0
0568 640E add R6,R20
056A 751E adc R7,R21
056C 861E adc R8,R22
056E 971E adc R9,R23
0570 70920900 sts _sds+8+1,R7
0574 60920800 sts _sds+8,R6
0578 90920B00 sts _sds+8+2+1,R9
057C 80920A00 sts _sds+8+2,R8
0580 ; /* SD (SECTOR_SIZE + 1) */
0580 ;
0580 ; return SD_NO_ERR ;/* 返回执行成功 return perform sucessfully */
0580 0027 clr R16
0582 L62:
0582 6496 adiw R28,20
0584 0E940000 xcall pop_gset3
0588 .dbline 0 ; func end
0588 0895 ret
058A ; time_u -> R14
058A ; fator -> R10
058A ; time_v -> R12
058A ; tmp -> y+0
058A ; csdbuf -> y+14
.even
058A _SD_CalTimeout::
058A 1A93 st -y,r17
058C 0A93 st -y,r16
058E 0E940000 xcall push_gset5
0592 2497 sbiw R28,4
0594 ; }
0594 ;
0594 ; /*******************************************************************************
0594 ; ** 函数名称: INT8U SD_CalTimeout()
0594 ; ** 功能描述: 计算读/写/擦超时时间
0594 ; ** 输 入: INT8U cardtype: 卡类型
0594 ; INT8U *csdbuf : CSD寄存器内容
0594 ; ** 输 出: 0: 正确 >0: 错误码
0594 ; *******************************************************************************/
0594 ; void SD_CalTimeout(INT8U *csdbuf)
0594 ; {
0594 ; INT32U tmp ;
0594 ; INT8U time_u,time_v,fator ;
0594 ;
0594 ; sds.timeout_read=READ_TIMEOUT_100MS ;/* 默认读超时为100ms */
0594 40EA ldi R20,160
0596 56E8 ldi R21,134
0598 61E0 ldi R22,1
059A 70E0 ldi R23,0
059C 50930D00 sts _sds+12+1,R21
05A0 40930C00 sts _sds+12,R20
05A4 70930F00 sts _sds+12+2+1,R23
05A8 60930E00 sts _sds+12+2,R22
05AC ; sds.timeout_write=WRITE_TIMEOUT_250MS ;/* 默认写超时为250ms */
05AC 40E9 ldi R20,144
05AE 50ED ldi R21,208
05B0 63E0 ldi R22,3
05B2 70E0 ldi R23,0
05B4 50931100 sts _sds+16+1,R21
05B8 40931000 sts _sds+16,R20
05BC 70931300 sts _sds+16+2+1,R23
05C0 60931200 sts _sds+16+2,R22
05C4 ; sds.timeout_erase=WRITE_TIMEOUT_250MS ;
05C4 40E9 ldi R20,144
05C6 50ED ldi R21,208
05C8 63E0 ldi R22,3
05CA 70E0 ldi R23,0
05CC 50931500 sts _sds+20+1,R21
05D0 40931400 sts _sds+20,R20
05D4 70931700 sts _sds+20+2+1,R23
05D8 60931600 sts _sds+20+2,R22
05DC ;
05DC ; time_u=(csdbuf[TAAC_POS]&TAAC_MSK);/* 读超时时间单位 read timeout unit */
05DC EE85 ldd R30,y+14
05DE FF85 ldd R31,y+15
05E0 8181 ldd R24,z+1
05E2 8770 andi R24,7
05E4 E82E mov R14,R24
05E6 ; time_v=(csdbuf[TAAC_POS]&NSAC_MSK)>>3 ;/* 读超时时间值 read timeout value */
05E6 EE85 ldd R30,y+14
05E8 FF85 ldd R31,y+15
05EA 8181 ldd R24,z+1
05EC 8877 andi R24,120
05EE C82E mov R12,R24
05F0 C694 lsr R12
05F2 C694 lsr R12
05F4 C694 lsr R12
05F6 ; fator=(csdbuf[R2WFACTOR_POS]&R2WFACTOR_MSK)>>2 ;/* 写超时时间因数 write timeout factor */
05F6 EE85 ldd R30,y+14
05F8 FF85 ldd R31,y+15
05FA 8485 ldd R24,z+12
05FC 8C71 andi R24,28
05FE A82E mov R10,R24
0600 A694 lsr R10
0602 A694 lsr R10
0604 ;
0604 ; if(time_v==0)
0604 CC20 tst R12
0606 09F4 brne L79
0608 ; return ;
0608 14C1 xjmp L75
060A L79:
060A ; if(fator>=6)
060A 8A2D mov R24,R10
060C 8630 cpi R24,6
060E 08F0 brlo L81
0610 ; return ;
0610 10C1 xjmp L75
0612 L81:
0612 ;
0612 ; tmp=SPI_CLOCK*time_value[time_v]/10/time_unit[time_u];/* TACC * f (单位 unit: clock) */
0612 80E0 ldi R24,<_time_value
0614 90E0 ldi R25,>_time_value
0616 EC2D mov R30,R12
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?