sd_drive.lis

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

LIS
1,540
字号
 0618 FF27              clr R31
 061A E80F              add R30,R24
 061C F91F              adc R31,R25
 061E 2490              lpm R2,Z
 0620 3324              clr R3
 0622 4424              clr R4
 0624 5524              clr R5
 0626 40E0              ldi R20,0
 0628 52E1              ldi R21,18
 062A 6AE7              ldi R22,122
 062C 70E0              ldi R23,0
 062E 5A92              st -y,R5
 0630 4A92              st -y,R4
 0632 3A92              st -y,R3
 0634 2A92              st -y,R2
 0636 8A01              movw R16,R20
 0638 9B01              movw R18,R22
 063A 0E940000          xcall empy32s
 063E 4AE0              ldi R20,10
 0640 50E0              ldi R21,0
 0642 60E0              ldi R22,0
 0644 70E0              ldi R23,0
 0646 7A93              st -y,R23
 0648 6A93              st -y,R22
 064A 5A93              st -y,R21
 064C 4A93              st -y,R20
 064E 0E940000          xcall div32s
 0652 1801              movw R2,R16
 0654 2901              movw R4,R18
 0656 84E0              ldi R24,4
 0658 8E9D              mul R24,R14
 065A 8001              movw R16,R0
 065C 80E0              ldi R24,<_time_unit
 065E 90E0              ldi R25,>_time_unit
 0660 080F              add R16,R24
 0662 191F              adc R17,R25
 0664 0E940000          xcall lpm32
 0668 3A93              st -y,R19
 066A 2A93              st -y,R18
 066C 1A93              st -y,R17
 066E 0A93              st -y,R16
 0670 8101              movw R16,R2
 0672 9201              movw R18,R4
 0674 0E940000          xcall div32u
 0678 FE01              movw R30,R28
 067A 0083              std z+0,R16
 067C 1183              std z+1,R17
 067E 2283              std z+2,R18
 0680 3383              std z+3,R19
 0682           ;     tmp=tmp+(INT32U)csdbuf[NSAC_POS]*100 ;/* TACC * f + NSAC * 100 (单位 unit: clock) */
 0682 EE85              ldd R30,y+14
 0684 FF85              ldd R31,y+15
 0686 2280              ldd R2,z+2
 0688 3324              clr R3
 068A 4424              clr R4
 068C 5524              clr R5
 068E 44E6              ldi R20,100
 0690 50E0              ldi R21,0
 0692 60E0              ldi R22,0
 0694 70E0              ldi R23,0
 0696 5A92              st -y,R5
 0698 4A92              st -y,R4
 069A 3A92              st -y,R3
 069C 2A92              st -y,R2
 069E 8A01              movw R16,R20
 06A0 9B01              movw R18,R22
 06A2 0E940000          xcall empy32u
 06A6 FE01              movw R30,R28
 06A8 2080              ldd R2,z+0
 06AA 3180              ldd R3,z+1
 06AC 4280              ldd R4,z+2
 06AE 5380              ldd R5,z+3
 06B0 200E              add R2,R16
 06B2 311E              adc R3,R17
 06B4 421E              adc R4,R18
 06B6 531E              adc R5,R19
 06B8 FE01              movw R30,R28
 06BA 2082              std z+0,R2
 06BC 3182              std z+1,R3
 06BE 4282              std z+2,R4
 06C0 5382              std z+3,R5
 06C2           ;     
 06C2           ;     /* 计算得到的超时值 the timeout value of being calculated */
 06C2           ;     sds.timeout_read=tmp ;
 06C2 FE01              movw R30,R28
 06C4 2080              ldd R2,z+0
 06C6 3180              ldd R3,z+1
 06C8 4280              ldd R4,z+2
 06CA 5380              ldd R5,z+3
 06CC 30920D00          sts _sds+12+1,R3
 06D0 20920C00          sts _sds+12,R2
 06D4 50920F00          sts _sds+12+2+1,R5
 06D8 40920E00          sts _sds+12+2,R4
 06DC           ;     sds.timeout_write=tmp*r2w_fator[fator];
 06DC 80E0              ldi R24,<_r2w_fator
 06DE 90E0              ldi R25,>_r2w_fator
 06E0 EA2D              mov R30,R10
 06E2 FF27              clr R31
 06E4 E80F              add R30,R24
 06E6 F91F              adc R31,R25
 06E8 2490              lpm R2,Z
 06EA 3324              clr R3
 06EC 4424              clr R4
 06EE 5524              clr R5
 06F0 FE01              movw R30,R28
 06F2 6080              ldd R6,z+0
 06F4 7180              ldd R7,z+1
 06F6 8280              ldd R8,z+2
 06F8 9380              ldd R9,z+3
 06FA 5A92              st -y,R5
 06FC 4A92              st -y,R4
 06FE 3A92              st -y,R3
 0700 2A92              st -y,R2
 0702 8301              movw R16,R6
 0704 9401              movw R18,R8
 0706 0E940000          xcall empy32u
 070A 10931100          sts _sds+16+1,R17
 070E 00931000          sts _sds+16,R16
 0712 30931300          sts _sds+16+2+1,R19
 0716 20931200          sts _sds+16+2,R18
 071A           ;     /* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
 071A           ;     
 071A           ;     sds.timeout_read=sds.timeout_read*100/8 ;/* 实际值为计算值的100倍 */
 071A 40900E00          lds R4,_sds+12+2
 071E 50900F00          lds R5,_sds+12+2+1
 0722 20900C00          lds R2,_sds+12
 0726 30900D00          lds R3,_sds+12+1
 072A 44E6              ldi R20,100
 072C 50E0              ldi R21,0
 072E 60E0              ldi R22,0
 0730 70E0              ldi R23,0
 0732 5A92              st -y,R5
 0734 4A92              st -y,R4
 0736 3A92              st -y,R3
 0738 2A92              st -y,R2
 073A 8A01              movw R16,R20
 073C 9B01              movw R18,R22
 073E 0E940000          xcall empy32u
 0742 83E0              ldi R24,3
 0744 90E0              ldi R25,0
 0746 8A93              st -y,R24
 0748 0E940000          xcall lsr32
 074C 10930D00          sts _sds+12+1,R17
 0750 00930C00          sts _sds+12,R16
 0754 30930F00          sts _sds+12+2+1,R19
 0758 20930E00          sts _sds+12+2,R18
 075C           ;     sds.timeout_write=sds.timeout_write*100/8 ;
 075C 40901200          lds R4,_sds+16+2
 0760 50901300          lds R5,_sds+16+2+1
 0764 20901000          lds R2,_sds+16
 0768 30901100          lds R3,_sds+16+1
 076C 44E6              ldi R20,100
 076E 50E0              ldi R21,0
 0770 60E0              ldi R22,0
 0772 70E0              ldi R23,0
 0774 5A92              st -y,R5
 0776 4A92              st -y,R4
 0778 3A92              st -y,R3
 077A 2A92              st -y,R2
 077C 8A01              movw R16,R20
 077E 9B01              movw R18,R22
 0780 0E940000          xcall empy32u
 0784 83E0              ldi R24,3
 0786 90E0              ldi R25,0
 0788 8A93              st -y,R24
 078A 0E940000          xcall lsr32
 078E 10931100          sts _sds+16+1,R17
 0792 00931000          sts _sds+16,R16
 0796 30931300          sts _sds+16+2+1,R19
 079A 20931200          sts _sds+16+2,R18
 079E           ;     
 079E           ;     /* 取计算值与默认值中的最小值 */
 079E           ;     if(sds.timeout_read>READ_TIMEOUT_100MS)
 079E 40EA              ldi R20,160
 07A0 56E8              ldi R21,134
 07A2 61E0              ldi R22,1
 07A4 70E0              ldi R23,0
 07A6 40900E00          lds R4,_sds+12+2
 07AA 50900F00          lds R5,_sds+12+2+1
 07AE 20900C00          lds R2,_sds+12
 07B2 30900D00          lds R3,_sds+12+1
 07B6 4215              cp R20,R2
 07B8 5305              cpc R21,R3
 07BA 6405              cpc R22,R4
 07BC 7505              cpc R23,R5
 07BE 60F4              brsh L89
 07C0           ;         sds.timeout_read=READ_TIMEOUT_100MS ;
 07C0 40EA              ldi R20,160
 07C2 56E8              ldi R21,134
 07C4 61E0              ldi R22,1
 07C6 70E0              ldi R23,0
 07C8 50930D00          sts _sds+12+1,R21
 07CC 40930C00          sts _sds+12,R20
 07D0 70930F00          sts _sds+12+2+1,R23
 07D4 60930E00          sts _sds+12+2,R22
 07D8           L89:
 07D8           ;     
 07D8           ;     if(sds.timeout_write>WRITE_TIMEOUT_250MS)
 07D8 40E9              ldi R20,144
 07DA 50ED              ldi R21,208
 07DC 63E0              ldi R22,3
 07DE 70E0              ldi R23,0
 07E0 40901200          lds R4,_sds+16+2
 07E4 50901300          lds R5,_sds+16+2+1
 07E8 20901000          lds R2,_sds+16
 07EC 30901100          lds R3,_sds+16+1
 07F0 4215              cp R20,R2
 07F2 5305              cpc R21,R3
 07F4 6405              cpc R22,R4
 07F6 7505              cpc R23,R5
 07F8 60F4              brsh L93
 07FA           ;         sds.timeout_write=WRITE_TIMEOUT_250MS ;
 07FA 40E9              ldi R20,144
 07FC 50ED              ldi R21,208
 07FE 63E0              ldi R22,3
 0800 70E0              ldi R23,0
 0802 50931100          sts _sds+16+1,R21
 0806 40931000          sts _sds+16,R20
 080A 70931300          sts _sds+16+2+1,R23
 080E 60931200          sts _sds+16+2,R22
 0812           L93:
 0812           ;     
 0812           ;     sds.timeout_erase=sds.timeout_write ;
 0812 40901200          lds R4,_sds+16+2
 0816 50901300          lds R5,_sds+16+2+1
 081A 20901000          lds R2,_sds+16
 081E 30901100          lds R3,_sds+16+1
 0822 30921500          sts _sds+20+1,R3
 0826 20921400          sts _sds+20,R2
 082A 50921700          sts _sds+20+2+1,R5
 082E 40921600          sts _sds+20+2,R4
 0832           L75:
 0832 2496              adiw R28,4
 0834 0E940000          xcall pop_gset5
 0838 2296              adiw R28,2
 083A                   .dbline 0 ; func end
 083A 0895              ret
                        .area lit(rom, con, rel)
 0036           L100:
 0036 0000              .byte 0,0
 0038 0000              .byte 0,0
                        .area text(rom, con, rel)
                ;          param -> y+13
                ;           resp -> y+8
                ;              i -> y+4
                ;            ret -> R10
                        .even
 083C           _SD_ActiveInit::
 083C 0E940000          xcall push_gset3
 0840 6197              sbiw R28,17
 0842           ; }
 0842           ; 
 0842           ; /*******************************************************************************
 0842           ; ** 函数名称: INT8U SD_CalTimeout()                            
 0842           ; ** 功能描述: 计算读/写/擦超时时间                             
 0842           ; ** 输   入: INT8U *cardtype: 卡类型接收缓冲  
 0842           ; ** 输   出: 0:   正确    >0:   错误码                        
 0842           ; ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0
 0842           ;              当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1
 0842           ;            是有次数限制的,最大次数为宏定义SD_IDLE_WAIT_MAX.
 0842           ; *******************************************************************************/
 0842           ; INT8U SD_ActiveInit(void)
 0842           ; {
 0842           ;     INT8U param[4]={0,0,0,0},resp[5],ret ;
 0842 80E0              ldi R24,<L100
 0844 90E0              ldi R25,>L100
 0846 FE01              movw R30,R28
 0848 3D96              adiw R30,13
 084A 04E0              ldi R16,4
 084C 10E0              ldi R17,0
 084E FA93              st -y,R31
 0850 EA93              st -y,R30
 0852 9A93              st -y,R25
 0854 8A93              st -y,R24
 0856 0E940000          xcall asgncblk
 085A           ;     INT32U i=0 ;
 085A 40E0              ldi R20,0
 085C 50E0              ldi R21,0
 085E 60E0              ldi R22,0
 0860 70E0              ldi R23,0
 0862 FE01              movw R30,R28
 0864 4483              std z+4,R20
 0866 5583              std z+5,R21
 0868 6683              std z+6,R22
 086A 7783              std z+7,R23
 086C           L101:
 086C           ;     
 086C           ;     do 
 086C           ;     {
 086C           ;         /* 发出CMD1, 查询卡的状态, send CMD1 to poll card status */
 086C           ;         ret=SD_SendCmd(CMD1,param,CMD1_R,resp);
 086C CE01              movw R24,R28
 086E 0896              adiw R24,8
 0870 9B83              std y+3,R25
 0872 8A83              std y+2,R24
 0874 81E0              ldi R24,1
 0876 8883              std y+0,R24
 0878 9E01              movw R18,R28
 087A 235F              subi R18,243  ; offset = 13
 087C 3F4F              sbci R19,255
 087E 01E0              ldi R16,1
 0880 0E940000          xcall _SD_SendCmd
 0884 A02E              mov R10,R16
 0886           ;         if(ret!=SD_NO_ERR)
 0886 0023              tst R16
 0888 09F0              breq L104
 088A           ;             return ret ;
 088A 36C0            

⌨️ 快捷键说明

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