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