📄 sddriver.lis
字号:
028E 8280 ldd R8,z+2
0290 9380 ldd R9,z+3
0292 5A92 st -y,R5
0294 4A92 st -y,R4
0296 3A92 st -y,R3
0298 2A92 st -y,R2
029A 8301 movw R16,R6
029C 9401 movw R18,R8
029E 0E940000 xcall empy32u
02A2 00930400 sts _sds+4,R16
02A6 .dbline 144
02A6 ;
02A6 ; sds.timeout_read = sds.timeout_read * 100 / 8; /* 实际值为计算值的100倍 */
02A6 20900300 lds R2,_sds+3
02AA 84E6 ldi R24,100
02AC 829D mul R24,R2
02AE 8001 movw R16,R0
02B0 28E0 ldi R18,8
02B2 30E0 ldi R19,0
02B4 0E940000 xcall div16s
02B8 00930300 sts _sds+3,R16
02BC .dbline 145
02BC ; sds.timeout_write = sds.timeout_write * 100 / 8;
02BC 20900400 lds R2,_sds+4
02C0 84E6 ldi R24,100
02C2 829D mul R24,R2
02C4 8001 movw R16,R0
02C6 28E0 ldi R18,8
02C8 30E0 ldi R19,0
02CA 0E940000 xcall div16s
02CE 00930400 sts _sds+4,R16
02D2 .dbline 147
02D2 ;
02D2 ; if (sds.timeout_read > READ_TIMEOUT_100MS) /* 取计算值与默认值中的最小值 */
02D2 40E0 ldi R20,0
02D4 5EE0 ldi R21,14
02D6 61E0 ldi R22,1
02D8 70E0 ldi R23,0
02DA 20900300 lds R2,_sds+3
02DE 3324 clr R3
02E0 4424 clr R4
02E2 5524 clr R5
02E4 4215 cp R20,R2
02E6 5305 cpc R21,R3
02E8 6405 cpc R22,R4
02EA 7505 cpc R23,R5
02EC 3CF4 brge L42
02EE .dbline 148
02EE ; sds.timeout_read = READ_TIMEOUT_100MS;
02EE 40E0 ldi R20,0
02F0 5EE0 ldi R21,14
02F2 61E0 ldi R22,1
02F4 70E0 ldi R23,0
02F6 1A01 movw R2,R20
02F8 20920300 sts _sds+3,R2
02FC L42:
02FC .dbline 150
02FC ;
02FC ; if (sds.timeout_write > WRITE_TIMEOUT_250MS)
02FC 40E0 ldi R20,0
02FE 53EA ldi R21,163
0300 62E0 ldi R22,2
0302 70E0 ldi R23,0
0304 20900400 lds R2,_sds+4
0308 3324 clr R3
030A 4424 clr R4
030C 5524 clr R5
030E 4215 cp R20,R2
0310 5305 cpc R21,R3
0312 6405 cpc R22,R4
0314 7505 cpc R23,R5
0316 3CF4 brge L46
0318 .dbline 151
0318 ; sds.timeout_write = WRITE_TIMEOUT_250MS;
0318 40E0 ldi R20,0
031A 53EA ldi R21,163
031C 62E0 ldi R22,2
031E 70E0 ldi R23,0
0320 1A01 movw R2,R20
0322 20920400 sts _sds+4,R2
0326 L46:
0326 .dbline 153
0326 ;
0326 ; sds.timeout_erase = sds.timeout_write;
0326 20900400 lds R2,_sds+4
032A 20920500 sts _sds+5,R2
032E .dbline -2
032E L28:
032E 2496 adiw R28,4
0330 0E940000 xcall pop_gset5
0334 2296 adiw R28,2
0336 .dbline 0 ; func end
0336 0895 ret
0338 .dbsym r time_u 14 c
0338 .dbsym r fator 10 c
0338 .dbsym r time_v 12 c
0338 .dbsym l tmp 0 l
0338 .dbsym l csdbuf 14 pc
0338 .dbend
.area lit(rom, con, rel)
0036 L53:
0036 0000 .byte 0,0
0038 0000 .byte 0,0
.area text(rom, con, rel)
0338 .dbfile D:\new_sd\SD\SD\sddriver.c
0338 .dbfunc e SD_ActiveInit _SD_ActiveInit fc
0338 ; param -> y+13
0338 ; resp -> y+8
0338 ; i -> y+4
0338 ; ret -> R10
.even
0338 _SD_ActiveInit::
0338 0E940000 xcall push_gset3
033C 6197 sbiw R28,17
033E .dbline -1
033E .dbline 165
033E ; }
033E ; /*******************************************************************************************************************
033E ; ** 函数名称: INT8U SD_CalTimeout() Name: INT8U SD_CalTimeout()
033E ; ** 功能描述: 计算读/写/擦超时时间 Function: get the information of SD card
033E ; ** 输 入: INT8U *cardtype: 卡类型接收缓冲 Input: INT8U *cardtype: card type receive buff
033E ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
033E ; ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0,表示SD卡内部初始化处理完成。
033E ; 当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1是有次数限制的,
033E ; 最大次数为宏定义SD_IDLE_WAIT_MAX.
033E ; *******************************************************************************************************************/
033E ; uint8 SD_ActiveInit(void)
033E ; {
033E .dbline 166
033E ; uint8 param[4] = {0,0,0,0},resp[5],ret;
033E 80E0 ldi R24,<L53
0340 90E0 ldi R25,>L53
0342 FE01 movw R30,R28
0344 3D96 adiw R30,13
0346 04E0 ldi R16,4
0348 10E0 ldi R17,0
034A FA93 st -y,R31
034C EA93 st -y,R30
034E 9A93 st -y,R25
0350 8A93 st -y,R24
0352 0E940000 xcall asgncblk
0356 .dbline 167
0356 ; uint32 i = 0;
0356 40E0 ldi R20,0
0358 50E0 ldi R21,0
035A 60E0 ldi R22,0
035C 70E0 ldi R23,0
035E FE01 movw R30,R28
0360 4483 std z+4,R20
0362 5583 std z+5,R21
0364 6683 std z+6,R22
0366 7783 std z+7,R23
0368 L54:
0368 .dbline 170
0368 ;
0368 ; do
0368 ; { /* 发出CMD1, 查询卡的状态, send CMD1 to poll card status */
0368 .dbline 171
0368 ; ret = SD_SendCmd(CMD1, param, CMD1_R, resp);
0368 CE01 movw R24,R28
036A 0896 adiw R24,8
036C 9B83 std y+3,R25
036E 8A83 std y+2,R24
0370 81E0 ldi R24,1
0372 8883 std y+0,R24
0374 9E01 movw R18,R28
0376 235F subi R18,243 ; offset = 13
0378 3F4F sbci R19,255
037A 01E0 ldi R16,1
037C 0E940000 xcall _SD_SendCmd
0380 A02E mov R10,R16
0382 .dbline 172
0382 ; if (ret != SD_NO_ERR)
0382 0023 tst R16
0384 09F0 breq L57
0386 .dbline 173
0386 ; return ret;
0386 36C0 xjmp L52
0388 L57:
0388 .dbline 175
0388 ;
0388 ; i++;
0388 41E0 ldi R20,1
038A 50E0 ldi R21,0
038C 60E0 ldi R22,0
038E 70E0 ldi R23,0
0390 FE01 movw R30,R28
0392 2480 ldd R2,z+4
0394 3580 ldd R3,z+5
0396 4680 ldd R4,z+6
0398 5780 ldd R5,z+7
039A 240E add R2,R20
039C 351E adc R3,R21
039E 461E adc R4,R22
03A0 571E adc R5,R23
03A2 FE01 movw R30,R28
03A4 2482 std z+4,R2
03A6 3582 std z+5,R3
03A8 4682 std z+6,R4
03AA 5782 std z+7,R5
03AC .dbline 176
03AC ; }
03AC L55:
03AC .dbline 177
03AC ; while (((resp[0] & MSK_IDLE) == MSK_IDLE) && (i < SD_IDLE_WAIT_MAX));
03AC 8885 ldd R24,y+8
03AE 8170 andi R24,1
03B0 8130 cpi R24,1
03B2 79F4 brne L59
03B4 48EE ldi R20,232
03B6 53E0 ldi R21,3
03B8 60E0 ldi R22,0
03BA 70E0 ldi R23,0
03BC FE01 movw R30,R28
03BE 2480 ldd R2,z+4
03C0 3580 ldd R3,z+5
03C2 4680 ldd R4,z+6
03C4 5780 ldd R5,z+7
03C6 2416 cp R2,R20
03C8 3506 cpc R3,R21
03CA 4606 cpc R4,R22
03CC 5706 cpc R5,R23
03CE 08F4 brsh X0
03D0 CBCF xjmp L54
03D2 X0:
03D2 L59:
03D2 .dbline 180
03D2 ; /* 如果响应R1的最低位Idle位为1,则继续循环 */
03D2 ;
03D2 ; if (i >= SD_IDLE_WAIT_MAX)
03D2 48EE ldi R20,232
03D4 53E0 ldi R21,3
03D6 60E0 ldi R22,0
03D8 70E0 ldi R23,0
03DA FE01 movw R30,R28
03DC 2480 ldd R2,z+4
03DE 3580 ldd R3,z+5
03E0 4680 ldd R4,z+6
03E2 5780 ldd R5,z+7
03E4 2416 cp R2,R20
03E6 3506 cpc R3,R21
03E8 4606 cpc R4,R22
03EA 5706 cpc R5,R23
03EC 10F0 brlo L60
03EE .dbline 181
03EE ; return SD_ERR_TIMEOUT_WAITIDLE; /* 超时,返回错误 time out,return error */
03EE 04E3 ldi R16,52
03F0 01C0 xjmp L52
03F2 L60:
03F2 .dbline 183
03F2 ;
03F2 ; return SD_NO_ERR;
03F2 0027 clr R16
03F4 .dbline -2
03F4 L52:
03F4 6196 adiw R28,17
03F6 0E940000 xcall pop_gset3
03FA .dbline 0 ; func end
03FA 0895 ret
03FC .dbsym l param 13 A[4:4]c
03FC .dbsym l resp 8 A[5:5]c
03FC .dbsym l i 4 l
03FC .dbsym r ret 10 c
03FC .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\new_sd\SD\SD\sddriver.c
0000 _sds::
0000 .blkb 6
0006 .dbstruct 0 6 SD_STRUCT
0006 .dbfield 0 block_num c
0006 .dbfield 1 block_len c
0006 .dbfield 2 erase_unit c
0006 .dbfield 3 timeout_read c
0006 .dbfield 4 timeout_write c
0006 .dbfield 5 timeout_erase c
0006 .dbend
0006 .dbsym e sds _sds S[SD_STRUCT]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -