📄 sddriver.s
字号:
ldd R30,y+14
ldd R31,y+15
ldd R24,z+1
andi R24,120
mov R12,R24
lsr R12
lsr R12
lsr R12
.dbline 132
; fator = (csdbuf[R2WFACTOR_POS] & R2WFACTOR_MSK) >> 2; /* 写超时时间因数 write timeout factor */
ldd R30,y+14
ldd R31,y+15
ldd R24,z+12
andi R24,28
mov R10,R24
lsr R10
lsr R10
.dbline 134
;
; if(time_v == 0) return;
tst R12
brne L32
.dbline 134
xjmp L28
L32:
.dbline 135
; if(fator >= 6) return;
mov R24,R10
cpi R24,6
brlo L34
.dbline 135
xjmp L28
L34:
.dbline 137
;
; tmp = SPI_CLOCK * time_value[time_v] / 10 / time_unit[time_u]; /* TACC * f (单位 unit: clock) */
ldi R24,<_time_value
ldi R25,>_time_value
mov R30,R12
clr R31
add R30,R24
adc R31,R25
lpm R2,Z
clr R3
clr R4
clr R5
ldi R20,0
ldi R21,96
ldi R22,84
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R23
st -y,R22
st -y,R21
st -y,R20
xcall div32s
movw R2,R16
movw R4,R18
ldi R24,4
mul R24,R14
movw R16,R0
ldi R24,<_time_unit
ldi R25,>_time_unit
add R16,R24
adc R17,R25
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall div32u
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 138
; tmp = tmp + csdbuf[NSAC_POS] * 100; /* TACC * f + NSAC * 100 (单位 unit: clock) */
ldd R30,y+14
ldd R31,y+15
ldd R2,z+2
ldi R24,100
mul R24,R2
movw R2,R0
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 141
;
; /* 计算得到的超时值 the timeout value of being calculated */
; sds.timeout_read = tmp;
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
sts _sds+3,R2
.dbline 142
; sds.timeout_write = tmp * r2w_fator[fator]; /* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
ldi R24,<_r2w_fator
ldi R25,>_r2w_fator
mov R30,R10
clr R31
add R30,R24
adc R31,R25
lpm R2,Z
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32u
sts _sds+4,R16
.dbline 144
;
; sds.timeout_read = sds.timeout_read * 100 / 8; /* 实际值为计算值的100倍 */
lds R2,_sds+3
ldi R24,100
mul R24,R2
movw R16,R0
ldi R18,8
ldi R19,0
xcall div16s
sts _sds+3,R16
.dbline 145
; sds.timeout_write = sds.timeout_write * 100 / 8;
lds R2,_sds+4
ldi R24,100
mul R24,R2
movw R16,R0
ldi R18,8
ldi R19,0
xcall div16s
sts _sds+4,R16
.dbline 147
;
; if (sds.timeout_read > READ_TIMEOUT_100MS) /* 取计算值与默认值中的最小值 */
ldi R20,0
ldi R21,14
ldi R22,1
ldi R23,0
lds R2,_sds+3
clr R3
clr R4
clr R5
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brge L42
.dbline 148
; sds.timeout_read = READ_TIMEOUT_100MS;
ldi R20,0
ldi R21,14
ldi R22,1
ldi R23,0
movw R2,R20
sts _sds+3,R2
L42:
.dbline 150
;
; if (sds.timeout_write > WRITE_TIMEOUT_250MS)
ldi R20,0
ldi R21,163
ldi R22,2
ldi R23,0
lds R2,_sds+4
clr R3
clr R4
clr R5
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brge L46
.dbline 151
; sds.timeout_write = WRITE_TIMEOUT_250MS;
ldi R20,0
ldi R21,163
ldi R22,2
ldi R23,0
movw R2,R20
sts _sds+4,R2
L46:
.dbline 153
;
; sds.timeout_erase = sds.timeout_write;
lds R2,_sds+4
sts _sds+5,R2
.dbline -2
L28:
adiw R28,4
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r time_u 14 c
.dbsym r fator 10 c
.dbsym r time_v 12 c
.dbsym l tmp 0 l
.dbsym l csdbuf 14 pc
.dbend
.area lit(rom, con, rel)
L53:
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile D:\new_sd\SD\SD\sddriver.c
.dbfunc e SD_ActiveInit _SD_ActiveInit fc
; param -> y+13
; resp -> y+8
; i -> y+4
; ret -> R10
.even
_SD_ActiveInit::
xcall push_gset3
sbiw R28,17
.dbline -1
.dbline 165
; }
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_CalTimeout() Name: INT8U SD_CalTimeout()
; ** 功能描述: 计算读/写/擦超时时间 Function: get the information of SD card
; ** 输 入: INT8U *cardtype: 卡类型接收缓冲 Input: INT8U *cardtype: card type receive buff
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0,表示SD卡内部初始化处理完成。
; 当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1是有次数限制的,
; 最大次数为宏定义SD_IDLE_WAIT_MAX.
; *******************************************************************************************************************/
; uint8 SD_ActiveInit(void)
; {
.dbline 166
; uint8 param[4] = {0,0,0,0},resp[5],ret;
ldi R24,<L53
ldi R25,>L53
movw R30,R28
adiw R30,13
ldi R16,4
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 167
; uint32 i = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+4,R20
std z+5,R21
std z+6,R22
std z+7,R23
L54:
.dbline 170
;
; do
; { /* 发出CMD1, 查询卡的状态, send CMD1 to poll card status */
.dbline 171
; ret = SD_SendCmd(CMD1, param, CMD1_R, resp);
movw R24,R28
adiw R24,8
std y+3,R25
std y+2,R24
ldi R24,1
std y+0,R24
movw R18,R28
subi R18,243 ; offset = 13
sbci R19,255
ldi R16,1
xcall _SD_SendCmd
mov R10,R16
.dbline 172
; if (ret != SD_NO_ERR)
tst R16
breq L57
.dbline 173
; return ret;
xjmp L52
L57:
.dbline 175
;
; i++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
.dbline 176
; }
L55:
.dbline 177
; while (((resp[0] & MSK_IDLE) == MSK_IDLE) && (i < SD_IDLE_WAIT_MAX));
ldd R24,y+8
andi R24,1
cpi R24,1
brne L59
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brsh X0
xjmp L54
X0:
L59:
.dbline 180
; /* 如果响应R1的最低位Idle位为1,则继续循环 */
;
; if (i >= SD_IDLE_WAIT_MAX)
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L60
.dbline 181
; return SD_ERR_TIMEOUT_WAITIDLE; /* 超时,返回错误 time out,return error */
ldi R16,52
xjmp L52
L60:
.dbline 183
;
; return SD_NO_ERR;
clr R16
.dbline -2
L52:
adiw R28,17
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l param 13 A[4:4]c
.dbsym l resp 8 A[5:5]c
.dbsym l i 4 l
.dbsym r ret 10 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\new_sd\SD\SD\sddriver.c
_sds::
.blkb 6
.dbstruct 0 6 SD_STRUCT
.dbfield 0 block_num c
.dbfield 1 block_len c
.dbfield 2 erase_unit c
.dbfield 3 timeout_read c
.dbfield 4 timeout_write c
.dbfield 5 timeout_erase c
.dbend
.dbsym e sds _sds S[SD_STRUCT]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -