📄 sdcmd.lis
字号:
.module sdcmd.c
.area text(rom, con, rel)
0000 .dbfile D:\new_sd\SD\SD\sdcmd.c
0000 .dbfunc e SD_SendCmd _SD_SendCmd fc
0000 ; rlen -> y+4
0000 ; tmp -> R10
0000 ; i -> y+0
0000 ; resp -> R12,R13
0000 ; resptype -> y+22
0000 ; param -> y+20
0000 ; cmd -> y+18
.even
0000 _SD_SendCmd::
0000 0E940000 xcall push_arg4
0004 0E940000 xcall push_gset5
0008 2897 sbiw R28,8
000A C88C ldd R12,y+24
000C D98C ldd R13,y+25
000E .dbline -1
000E .dbline 17
000E ; /*****************************************************************************************************
000E ; ** Descriptions: sd 卡驱动软件包: SD卡物理层 ---- SD卡SPI模式支持的命令
000E ; ********************************************************************************************************/
000E ; #include "D:\new_sd\define.h"
000E ;
000E ;
000E ; /********************************************************************************************************************
000E ; ** 函数名称: INT8U SD_SendCmd() Name: INT8U SD_SendCmd()
000E ; ** 功能描述: 向卡发送命令,并取得响应 Function: send command to the card,and get a response
000E ; ** 输 入: INT8U cmd : 命令字 Input: INT8U cmd : command byte
000E ; INT8U *param : 命令参数,长度为4字节 INT8U *param : command parameter,length is 4 bytes
000E ; INT8U resptype : 响应类型 INT8U resptype: response type
000E ; INT8U *resp : 响应,长度为1-5字节 INT8U *resp : response,length is 1-5 bytes
000E ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
000E ; ********************************************************************************************************************/
000E ; uint8 SD_SendCmd(uint8 cmd, uint8 *param, uint8 resptype, uint8 *resp)
000E ; {
000E .dbline 21
000E ; int32 i,rlen; //所有SD卡命令都是6字节长
000E ; uint8 tmp;
000E ;
000E ; SPI_CS_Assert(); //片选SPI从机
000E 0E940000 xcall _SPI_CS_Assert
0012 .dbline 23
0012 ;
0012 ; SPI_SendByte((cmd & 0x3F) | 0x40); /* 发送命令头和命令字 send command header and word */
0012 0A89 ldd R16,y+18
0014 0F73 andi R16,63
0016 0064 ori R16,64
0018 0E940000 xcall _SPI_SendByte
001C .dbline 25
001C ; //起始位为0(bit47),传输位为1(bit46)
001C ; for (i = 3; i >= 0; i--)
001C 43E0 ldi R20,3
001E 50E0 ldi R21,0
0020 60E0 ldi R22,0
0022 70E0 ldi R23,0
0024 FE01 movw R30,R28
0026 4083 std z+0,R20
0028 5183 std z+1,R21
002A 6283 std z+2,R22
002C 7383 std z+3,R23
002E L2:
002E .dbline 26
002E FE01 movw R30,R28
0030 AF93 push R26
0032 BF93 push R27
0034 A081 ldd R26,z+0
0036 B181 ldd R27,z+1
0038 FD01 movw R30,R26
003A BF91 pop R27
003C AF91 pop R26
003E 0C88 ldd R0,y+20
0040 1D88 ldd R1,y+21
0042 E00D add R30,R0
0044 F11D adc R31,R1
0046 0081 ldd R16,z+0
0048 0E940000 xcall _SPI_SendByte
004C L3:
004C .dbline 25
004C 41E0 ldi R20,1
004E 50E0 ldi R21,0
0050 60E0 ldi R22,0
0052 70E0 ldi R23,0
0054 FE01 movw R30,R28
0056 2080 ldd R2,z+0
0058 3180 ldd R3,z+1
005A 4280 ldd R4,z+2
005C 5380 ldd R5,z+3
005E 241A sub R2,R20
0060 350A sbc R3,R21
0062 460A sbc R4,R22
0064 570A sbc R5,R23
0066 FE01 movw R30,R28
0068 2082 std z+0,R2
006A 3182 std z+1,R3
006C 4282 std z+2,R4
006E 5382 std z+3,R5
0070 .dbline 25
0070 40E0 ldi R20,0
0072 50E0 ldi R21,0
0074 60E0 ldi R22,0
0076 70E0 ldi R23,0
0078 FE01 movw R30,R28
007A 2080 ldd R2,z+0
007C 3180 ldd R3,z+1
007E 4280 ldd R4,z+2
0080 5380 ldd R5,z+3
0082 2416 cp R2,R20
0084 3506 cpc R3,R21
0086 4606 cpc R4,R22
0088 5706 cpc R5,R23
008A 0CF0 brlt X2
008C D0CF xjmp L2
008E X2:
008E .dbline 29
008E ; SPI_SendByte(param[i]); /* 发送参数 send parameters */
008E ;
008E ; #if SD_CRC_EN
008E ; tmp = SD_GetCmdByte6((cmd & 0x3F) | 0x40, param);
008E 2C89 ldd R18,y+20
0090 3D89 ldd R19,y+21
0092 0A89 ldd R16,y+18
0094 0F73 andi R16,63
0096 0064 ori R16,64
0098 0E940000 xcall _SD_GetCmdByte6
009C A02E mov R10,R16
009E .dbline 30
009E ; SPI_SendByte(tmp);
009E 0E940000 xcall _SPI_SendByte
00A2 .dbline 35
00A2 ; #else
00A2 ; SPI_SendByte(0x95); /* CRC校验码,只用于第1个命令 CRC,only used for the first command */
00A2 ; #endif
00A2 ;
00A2 ; rlen = 0;
00A2 40E0 ldi R20,0
00A4 50E0 ldi R21,0
00A6 60E0 ldi R22,0
00A8 70E0 ldi R23,0
00AA FE01 movw R30,R28
00AC 4483 std z+4,R20
00AE 5583 std z+5,R21
00B0 6683 std z+6,R22
00B2 7783 std z+7,R23
00B4 .dbline 36
00B4 ; switch (resptype) /* 根据不同的命令,得到不同的响应长度 */
00B4 EE88 ldd R14,y+22
00B6 FF24 clr R15
00B8 C701 movw R24,R14
00BA 8130 cpi R24,1
00BC E0E0 ldi R30,0
00BE 9E07 cpc R25,R30
00C0 69F0 breq L9
00C2 8230 cpi R24,2
00C4 E0E0 ldi R30,0
00C6 9E07 cpc R25,R30
00C8 49F0 breq L9
00CA 8330 cpi R24,3
00CC E0E0 ldi R30,0
00CE 9E07 cpc R25,R30
00D0 79F0 breq L10
00D2 8430 cpi R24,4
00D4 E0E0 ldi R30,0
00D6 9E07 cpc R25,R30
00D8 A9F0 breq L11
00DA 1EC0 xjmp L6
00DC X0:
00DC .dbline 37
00DC ; { /* according various command,get the various response length */
00DC L9:
00DC .dbline 39
00DC ; case R1:
00DC ; case R1B: rlen = 1; break;
00DC 41E0 ldi R20,1
00DE 50E0 ldi R21,0
00E0 60E0 ldi R22,0
00E2 70E0 ldi R23,0
00E4 FE01 movw R30,R28
00E6 4483 std z+4,R20
00E8 5583 std z+5,R21
00EA 6683 std z+6,R22
00EC 7783 std z+7,R23
00EE .dbline 39
00EE 1BC0 xjmp L7
00F0 L10:
00F0 .dbline 41
00F0 ;
00F0 ; case R2: rlen = 2; break;
00F0 42E0 ldi R20,2
00F2 50E0 ldi R21,0
00F4 60E0 ldi R22,0
00F6 70E0 ldi R23,0
00F8 FE01 movw R30,R28
00FA 4483 std z+4,R20
00FC 5583 std z+5,R21
00FE 6683 std z+6,R22
0100 7783 std z+7,R23
0102 .dbline 41
0102 11C0 xjmp L7
0104 L11:
0104 .dbline 43
0104 ;
0104 ; case R3: rlen = 5; break;
0104 45E0 ldi R20,5
0106 50E0 ldi R21,0
0108 60E0 ldi R22,0
010A 70E0 ldi R23,0
010C FE01 movw R30,R28
010E 4483 std z+4,R20
0110 5583 std z+5,R21
0112 6683 std z+6,R22
0114 7783 std z+7,R23
0116 .dbline 43
0116 07C0 xjmp L7
0118 L6:
0118 .dbline 45
0118 ;
0118 ; default: SPI_SendByte(0xFF);
0118 0FEF ldi R16,255
011A 0E940000 xcall _SPI_SendByte
011E .dbline 46
011E ; SPI_CS_Deassert();
011E 0E940000 xcall _SPI_CS_Deassert
0122 .dbline 47
0122 ; return SD_ERR_CMD_RESPTYPE; /* 返回命令响应类型错误 return error of command response type */
0122 00E1 ldi R16,16
0124 85C0 xjmp L1
0126 X1:
0126 .dbline 48
0126 ; break;
0126 L7:
0126 .dbline 51
0126 ; }
0126 ;
0126 ; i = 0;
0126 40E0 ldi R20,0
0128 50E0 ldi R21,0
012A 60E0 ldi R22,0
012C 70E0 ldi R23,0
012E FE01 movw R30,R28
0130 4083 std z+0,R20
0132 5183 std z+1,R21
0134 6283 std z+2,R22
0136 7383 std z+3,R23
0138 L12:
0138 .dbline 53
0138 ; do /* 等待响应,响应的开始位为0 */
0138 ; { /* Wait for a response,a response is a start bit(zero) */
0138 .dbline 54
0138 ; tmp = SPI_RecByte();
0138 0E940000 xcall _SPI_RecByte
013C A02E mov R10,R16
013E .dbline 55
013E ; i++;
013E 41E0 ldi R20,1
0140 50E0 ldi R21,0
0142 60E0 ldi R22,0
0144 70E0 ldi R23,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -