📄 sdcmd.lis
字号:
02A6 0E940000 xcall push_gset2
02AA 622F mov R22,R18
02AC 402F mov R20,R16
02AE 2997 sbiw R28,9
02B0 .dbline -1
02B0 .dbline 99
02B0 ; }
02B0 ;
02B0 ; /********************************************************************************************************************
02B0 ; ** 函数名称: INT8U SD_BlockCommand() Name: INT8U SD_BlockCommand()
02B0 ; ** 功能描述: 块命令 Function: command about block operation
02B0 ; ** 输 入: INT8U cmd : 命令字 Input: INT8U cmd : command byte
02B0 ; INT8U resptype : 响应类型 INT8U resptype : response type
02B0 ; INT32U parameter: 块操作参数 INT32U parameter: parameter of block operation
02B0 ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
02B0 ; *********************************************************************************************************************/
02B0 ; uint8 SD_BlockCommand(uint8 cmd, uint8 resptype, uint32 parameter)
02B0 ; {
02B0 .dbline 102
02B0 ; uint8 param[4],resp,ret;
02B0 ;
02B0 ; parameter <<= SD_BLOCKSIZE_NBITS; /* 调整地址:左移9位 adjust address: move 9 bits left */
02B0 89E0 ldi R24,9
02B2 90E0 ldi R25,0
02B4 FE01 movw R30,R28
02B6 2584 ldd R2,z+13
02B8 3684 ldd R3,z+14
02BA 4784 ldd R4,z+15
02BC 5088 ldd R5,z+16
02BE 8A93 st -y,R24
02C0 8101 movw R16,R2
02C2 9201 movw R18,R4
02C4 0E940000 xcall lsl32
02C8 FE01 movw R30,R28
02CA 0587 std z+13,R16
02CC 1687 std z+14,R17
02CE 2787 std z+15,R18
02D0 308B std z+16,R19
02D2 .dbline 104
02D2 ;
02D2 ; SD_PackParam(param, parameter); /* 将参数转化为字节形式 change the parameter to bytes form */
02D2 FE01 movw R30,R28
02D4 2584 ldd R2,z+13
02D6 3684 ldd R3,z+14
02D8 4784 ldd R4,z+15
02DA 5088 ldd R5,z+16
02DC 4882 std y+0,R4
02DE 5982 std y+1,R5
02E0 9101 movw R18,R2
02E2 8E01 movw R16,R28
02E4 0C5F subi R16,252 ; offset = 4
02E6 1F4F sbci R17,255
02E8 A8DF xcall _SD_PackParam
02EA .dbline 106
02EA ;
02EA ; ret = SD_SendCmd(cmd, param, resptype, &resp);
02EA CE01 movw R24,R28
02EC 0896 adiw R24,8
02EE 9B83 std y+3,R25
02F0 8A83 std y+2,R24
02F2 6883 std y+0,R22
02F4 9E01 movw R18,R28
02F6 2C5F subi R18,252 ; offset = 4
02F8 3F4F sbci R19,255
02FA 042F mov R16,R20
02FC 81DE xcall _SD_SendCmd
02FE 402F mov R20,R16
0300 .dbline 107
0300 ; if (ret != SD_NO_ERR)
0300 0023 tst R16
0302 09F0 breq L24
0304 .dbline 108
0304 ; return ret; /* 结束数据传输失败 stop transmission operation fail */
0304 06C0 xjmp L23
0306 L24:
0306 .dbline 110
0306 ;
0306 ; if (resp != 0)
0306 2884 ldd R2,y+8
0308 2220 tst R2
030A 11F0 breq L26
030C .dbline 111
030C ; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
030C 02E1 ldi R16,18
030E 01C0 xjmp L23
0310 L26:
0310 .dbline 113
0310 ;
0310 ; return SD_NO_ERR;
0310 0027 clr R16
0312 .dbline -2
0312 L23:
0312 2996 adiw R28,9
0314 0E940000 xcall pop_gset2
0318 .dbline 0 ; func end
0318 0895 ret
031A .dbsym l resp 8 c
031A .dbsym l param 4 A[4:4]c
031A .dbsym r ret 20 c
031A .dbsym l parameter 13 l
031A .dbsym r resptype 22 c
031A .dbsym r cmd 20 c
031A .dbend
.area lit(rom, con, rel)
0000 L29:
0000 0000 .byte 0,0
0002 0000 .byte 0,0
.area text(rom, con, rel)
031A .dbfile D:\new_sd\SD\SD\sdcmd.c
031A .dbfunc e SD_ResetSD _SD_ResetSD fc
031A ; resp -> y+8
031A ; param -> y+4
.even
031A _SD_ResetSD::
031A 2997 sbiw R28,9
031C .dbline -1
031C .dbline 131
031C ; }
031C ;
031C ; /*
031C ; ************************************************
031C ;
031C ; 下面为SD卡SPI命令
031C ;
031C ; ************************************************
031C ; */
031C ;
031C ; /********************************************************************************************************************
031C ; ** 函数名称: INT8U SD_ResetSD() Name: INT8U SD_ResetSD()
031C ; ** 功能描述: 复位SD卡 Function: reset sd card
031C ; ** 输 入: 无 Input: NULL
031C ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
031C ; *********************************************************************************************************************/
031C ; uint8 SD_ResetSD(void) /////
031C ; {
031C .dbline 132
031C ; uint8 param[4] = {0,0,0,0},resp;
031C 80E0 ldi R24,<L29
031E 90E0 ldi R25,>L29
0320 FE01 movw R30,R28
0322 3496 adiw R30,4
0324 04E0 ldi R16,4
0326 10E0 ldi R17,0
0328 FA93 st -y,R31
032A EA93 st -y,R30
032C 9A93 st -y,R25
032E 8A93 st -y,R24
0330 0E940000 xcall asgncblk
0334 .dbline 134
0334 ;
0334 ; return (SD_SendCmd(CMD0, param, CMD0_R, &resp)); /* 复位命令 command that reset sd card */
0334 CE01 movw R24,R28
0336 0896 adiw R24,8
0338 9B83 std y+3,R25
033A 8A83 std y+2,R24
033C 81E0 ldi R24,1
033E 8883 std y+0,R24
0340 9E01 movw R18,R28
0342 2C5F subi R18,252 ; offset = 4
0344 3F4F sbci R19,255
0346 0027 clr R16
0348 5BDE xcall _SD_SendCmd
034A .dbline -2
034A L28:
034A 2996 adiw R28,9
034C .dbline 0 ; func end
034C 0895 ret
034E .dbsym l resp 8 c
034E .dbsym l param 4 A[4:4]c
034E .dbend
.area lit(rom, con, rel)
0004 L31:
0004 0000 .byte 0,0
0006 0000 .byte 0,0
.area text(rom, con, rel)
034E .dbfile D:\new_sd\SD\SD\sdcmd.c
034E .dbfunc e SD_ReadCSD _SD_ReadCSD fc
034E ; resp -> y+8
034E ; param -> y+4
034E ; ret -> R10
034E ; recbuf -> R22,R23
034E ; csdlen -> R20
.even
034E _SD_ReadCSD::
034E 0E940000 xcall push_gset3
0352 B901 movw R22,R18
0354 402F mov R20,R16
0356 2997 sbiw R28,9
0358 .dbline -1
0358 .dbline 145
0358 ; }
0358 ;
0358 ; /********************************************************************************************************************
0358 ; ** 函数名称: INT8U SD_ReadCSD() Name: INT8U SD_ReadCSD()
0358 ; ** 功能描述: 读SD卡的CSD寄存器 Function: read CSD register of sd card
0358 ; ** 输 入: INT8U csdlen : 寄存器长度(固定为16) INT8U csdlen : len of register (fixed,is 16)
0358 ; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
0358 ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
0358 ; *********************************************************************************************************************/
0358 ; uint8 SD_ReadCSD(uint8 csdlen, uint8 *recbuf)
0358 ; {
0358 .dbline 146
0358 ; uint8 param[4] = {0,0,0,0},resp,ret;
0358 80E0 ldi R24,<L31
035A 90E0 ldi R25,>L31
035C FE01 movw R30,R28
035E 3496 adiw R30,4
0360 04E0 ldi R16,4
0362 10E0 ldi R17,0
0364 FA93 st -y,R31
0366 EA93 st -y,R30
0368 9A93 st -y,R25
036A 8A93 st -y,R24
036C 0E940000 xcall asgncblk
0370 .dbline 148
0370 ;
0370 ; ret = SD_SendCmd(CMD9, param, CMD9_R, &resp); /* 读CSD寄存器命令 command that read CSD register */
0370 CE01 movw R24,R28
0372 0896 adiw R24,8
0374 9B83 std y+3,R25
0376 8A83 std y+2,R24
0378 81E0 ldi R24,1
037A 8883 std y+0,R24
037C 9E01 movw R18,R28
037E 2C5F subi R18,252 ; offset = 4
0380 3F4F sbci R19,255
0382 09E0 ldi R16,9
0384 3DDE xcall _SD_SendCmd
0386 A02E mov R10,R16
0388 .dbline 149
0388 ; if (ret != SD_NO_ERR)
0388 0023 tst R16
038A 09F0 breq L32
038C .dbline 150
038C ; return ret;
038C 0EC0 xjmp L30
038E L32:
038E .dbline 152
038E ;
038E ; if (resp != 0)
038E 2884 ldd R2,y+8
0390 2220 tst R2
0392 11F0 breq L34
0394 .dbline 153
0394 ; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
0394 02E1 ldi R16,18
0396 09C0 xjmp L30
0398 L34:
0398 .dbline 155
0398 ;
0398 ; return (SD_ReadRegister(csdlen, recbuf));
0398 7983 std y+1,R23
039A 6883 std y+0,R22
039C 242E mov R2,R20
039E 3324 clr R3
03A0 4424 clr R4
03A2 5524 clr R5
03A4 8101 movw R16,R2
03A6 9201 movw R18,R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -