📄 sdcmd.s
字号:
; INT8U resptype : 响应类型 INT8U resptype : response type
; INT32U parameter: 块操作参数 INT32U parameter: parameter of block operation
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_BlockCommand(uint8 cmd, uint8 resptype, uint32 parameter)
; {
.dbline 102
; uint8 param[4],resp,ret;
;
; parameter <<= SD_BLOCKSIZE_NBITS; /* 调整地址:左移9位 adjust address: move 9 bits left */
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
std z+13,R16
std z+14,R17
std z+15,R18
std z+16,R19
.dbline 104
;
; SD_PackParam(param, parameter); /* 将参数转化为字节形式 change the parameter to bytes form */
movw R30,R28
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R4
std y+1,R5
movw R18,R2
movw R16,R28
subi R16,252 ; offset = 4
sbci R17,255
xcall _SD_PackParam
.dbline 106
;
; ret = SD_SendCmd(cmd, param, resptype, &resp);
movw R24,R28
adiw R24,8
std y+3,R25
std y+2,R24
std y+0,R22
movw R18,R28
subi R18,252 ; offset = 4
sbci R19,255
mov R16,R20
xcall _SD_SendCmd
mov R20,R16
.dbline 107
; if (ret != SD_NO_ERR)
tst R16
breq L24
.dbline 108
; return ret; /* 结束数据传输失败 stop transmission operation fail */
xjmp L23
L24:
.dbline 110
;
; if (resp != 0)
ldd R2,y+8
tst R2
breq L26
.dbline 111
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
ldi R16,18
xjmp L23
L26:
.dbline 113
;
; return SD_NO_ERR;
clr R16
.dbline -2
L23:
adiw R28,9
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l resp 8 c
.dbsym l param 4 A[4:4]c
.dbsym r ret 20 c
.dbsym l parameter 13 l
.dbsym r resptype 22 c
.dbsym r cmd 20 c
.dbend
.area lit(rom, con, rel)
L29:
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile D:\new_sd\SD\SD\sdcmd.c
.dbfunc e SD_ResetSD _SD_ResetSD fc
; resp -> y+8
; param -> y+4
.even
_SD_ResetSD::
sbiw R28,9
.dbline -1
.dbline 131
; }
;
; /*
; ************************************************
;
; 下面为SD卡SPI命令
;
; ************************************************
; */
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ResetSD() Name: INT8U SD_ResetSD()
; ** 功能描述: 复位SD卡 Function: reset sd card
; ** 输 入: 无 Input: NULL
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_ResetSD(void) /////
; {
.dbline 132
; uint8 param[4] = {0,0,0,0},resp;
ldi R24,<L29
ldi R25,>L29
movw R30,R28
adiw R30,4
ldi R16,4
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 134
;
; return (SD_SendCmd(CMD0, param, CMD0_R, &resp)); /* 复位命令 command that reset sd card */
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,252 ; offset = 4
sbci R19,255
clr R16
xcall _SD_SendCmd
.dbline -2
L28:
adiw R28,9
.dbline 0 ; func end
ret
.dbsym l resp 8 c
.dbsym l param 4 A[4:4]c
.dbend
.area lit(rom, con, rel)
L31:
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile D:\new_sd\SD\SD\sdcmd.c
.dbfunc e SD_ReadCSD _SD_ReadCSD fc
; resp -> y+8
; param -> y+4
; ret -> R10
; recbuf -> R22,R23
; csdlen -> R20
.even
_SD_ReadCSD::
xcall push_gset3
movw R22,R18
mov R20,R16
sbiw R28,9
.dbline -1
.dbline 145
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadCSD() Name: INT8U SD_ReadCSD()
; ** 功能描述: 读SD卡的CSD寄存器 Function: read CSD register of sd card
; ** 输 入: INT8U csdlen : 寄存器长度(固定为16) INT8U csdlen : len of register (fixed,is 16)
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_ReadCSD(uint8 csdlen, uint8 *recbuf)
; {
.dbline 146
; uint8 param[4] = {0,0,0,0},resp,ret;
ldi R24,<L31
ldi R25,>L31
movw R30,R28
adiw R30,4
ldi R16,4
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 148
;
; ret = SD_SendCmd(CMD9, param, CMD9_R, &resp); /* 读CSD寄存器命令 command that read CSD register */
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,252 ; offset = 4
sbci R19,255
ldi R16,9
xcall _SD_SendCmd
mov R10,R16
.dbline 149
; if (ret != SD_NO_ERR)
tst R16
breq L32
.dbline 150
; return ret;
xjmp L30
L32:
.dbline 152
;
; if (resp != 0)
ldd R2,y+8
tst R2
breq L34
.dbline 153
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
ldi R16,18
xjmp L30
L34:
.dbline 155
;
; return (SD_ReadRegister(csdlen, recbuf));
std y+1,R23
std y+0,R22
mov R2,R20
clr R3
clr R4
clr R5
movw R16,R2
movw R18,R4
xcall _SD_ReadRegister
.dbline -2
L30:
adiw R28,9
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l resp 8 c
.dbsym l param 4 A[4:4]c
.dbsym r ret 10 c
.dbsym r recbuf 22 pc
.dbsym r csdlen 20 c
.dbend
.area lit(rom, con, rel)
L37:
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile D:\new_sd\SD\SD\sdcmd.c
.dbfunc e SD_StopTransmission _SD_StopTransmission fc
; resp -> y+8
; param -> y+4
.even
_SD_StopTransmission::
sbiw R28,9
.dbline -1
.dbline 188
; }
;
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_ReadCID() Name: INT8U SD_ReadCID()
; ** 功能描述: 读SD卡的CID寄存器 Function: read CID register of sd card
; ** 输 入: INT8U cidlen : 寄存器长度(固定为16) INT8U cidlen : len of register (fixed,is 16)
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; ********************************************************************************************************************/
; #if SD_ReadCID_EN
; uint8 SD_ReadCID(uint8 cidlen, uint8 *recbuf)
; {
; uint8 param[4] = {0,0,0,0},resp,ret;
;
; ret = SD_SendCmd(CMD10, param, CMD10_R, &resp); /* 读CID寄存器命令 command that read CID register */
; if ( ret != SD_NO_ERR)
; return ret;
;
; if (resp != 0)
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
;
; return (SD_ReadRegister(cidlen, recbuf));
; }
; #endif
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_StopTransmission() Name: INT8U SD_StopTransmission()
; ** 功能描述: 停止数据传输 Function: stop data transmission
; ** 输 入: 无 Input: NULL
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_StopTransmission(void)
; {
.dbline 189
; uint8 param[4] = {0,0,0,0},resp;
ldi R24,<L37
ldi R25,>L37
movw R30,R28
adiw R30,4
ldi R16,4
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 191
;
; return (SD_SendCmd(CMD12, param, CMD12_R, &resp)); /* 结束数据传输命令失败 stop transmission command fail */
movw R24,R28
adiw R24,8
std y+3,R25
std y+2,R24
ldi R24,2
std y+0,R24
movw R18,R28
subi R18,252 ; offset = 4
sbci R19,255
ldi R16,12
xcall _SD_SendCmd
.dbline -2
L36:
adiw R28,9
.dbline 0 ; func end
ret
.dbsym l resp 8 c
.dbsym l param 4 A[4:4]c
.dbend
.area lit(rom, con, rel)
L39:
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile D:\new_sd\SD\SD\sdcmd.c
.dbfunc e SD_ReadCard_Status _SD_ReadCard_Status fc
; param -> y+4
; buffer -> R20,R21
; len -> R22
.even
_SD_ReadCard_Status::
xcall push_gset2
movw R20,R18
mov R22,R16
sbiw R28,8
.dbline -1
.dbline 202
; }
;
; /*********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadCard_Status() Name: INT8U SD_ReadCard_Status()
; ** 功能描述: 读SD卡的 Card Status 寄存器 Function: read Card Status register of sd card
; ** 输 入: INT8U len: 寄存器长度(固定为2) INT8U len: len of register (fixed,is 2)
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; **********************************************************************************************************************/
; uint8 SD_ReadCard_Status(uint8 len, uint8 *buffer)
; {
.dbline 203
; uint8 param[4] = {0,0,0,0};
ldi R24,<L39
ldi R25,>L39
movw R30,R28
adiw R30,4
ldi R16,4
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 205
;
; return (SD_SendCmd(CMD13, param, CMD13_R, buffer)); /* 读 Card Status 寄存器 */
std y+3,R21
std y+2,R20
ldi R24,3
std y+0,R24
movw R18,R28
subi R18,252 ; offset = 4
sbci R19,255
ldi R16,13
xcall _SD_SendCmd
.dbline -2
L38:
adiw R28,8
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l param 4 A[4:4]c
.dbsym r buffer 20 pc
.dbsym r len 22 c
.dbend
.dbfunc e SD_SetBlockLen _SD_SetBlockLen fc
; resp -> y+8
; param -> y+4
; ret -> R20
; length -> y+11
.even
_SD_SetBlockLen::
xcall push_arg4
xcall push_gset1
sbiw R28,9
.dbline -1
.dbline 217
; /* read register of Card Status */
; }
;
;
; /********************************************************************************************************************
; ** 函数名称: INT8U Sd_SetBlockLen() Name: INT8U Sd_SetBlockLen()
; ** 功能描述: 设置一个块的长度 Function: set a block len of sd card
; ** 输 入: INT32U length : 块的长度值 Input: INT32U length : the length of a block
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_SetBlockLen(uint32 length)
; {
.dbline 220
; uint8 param[4],resp,ret;
;
; SD_PackParam(param, length); /* 将参数转化为字节形式 change the parameter to bytes form */
movw R30,R28
ldd R2,z+11
ldd R3,z+12
ldd R4,z+13
ldd R5,z+14
std y+0,R4
std y+1,R5
movw R18,R2
movw R16,R28
subi R16,252 ; offset = 4
sbci R17,255
xcall _SD_PackParam
.dbline 222
;
; ret = SD_SendCmd(CMD16, param, CMD16_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,252 ; offset = 4
sbci R19,255
ldi R16,16
xcall _SD_SendCmd
mov R20,R16
.dbline 223
; if (ret != SD_NO_ERR)
tst R16
breq L41
.dbline 224
; return ret; /* 设置块的长度为length失败 set the length of block to length fail */
xjmp L40
L41:
.dbline 226
;
; if (resp != 0)
ldd R2,y+8
tst R2
breq L43
.dbline 227
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
ldi R16,18
xjmp L40
L43:
.dbline 229
;
; return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
clr R16
.dbline -2
L40:
adiw R28,9
xcall pop_gset1
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l resp 8 c
.dbsym l param 4 A[4:4]c
.dbsym r ret 20 c
.dbsym l length 11 l
.dbend
.dbfunc e SD_ReadSingleBlock _SD_ReadSingleBlock fc
; blockaddr -> y+4
.even
_SD_ReadSingleBlock::
xcall push_arg4
sbiw R28,4
.dbline -1
.dbline 239
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadSingleBlock() Name: INT8U SD_ReadSingleBlock()
; ** 功能描述: 读单块命令 Function: read single block command
; ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_ReadSingleBlock(uint32 blockaddr)
; {
.dbline 240
; return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
ldi R18,1
ldi R16,17
xcall _SD_BlockCommand
.dbline -2
L45:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -