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