📄 sdcmd.lst
字号:
93 return SD_ERR_CMD_TIMEOUT; /* 返回命令超时 return response timeout of command */
\ 0000008A 1120 MOV R0,#+0x11
\ 0000008C 0CE0 B ??SD_SendCmd_7
94 }
95
96 for (i = rlen - 1; i >= 0; i--)
\ ??SD_SendCmd_10:
\ 0000008E 701E SUB R0,R6,#+0x1
\ 00000090 051C MOV R5,R0
\ ??SD_SendCmd_11:
\ 00000092 002D CMP R5,#+0
\ 00000094 05D4 BMI ??SD_SendCmd_12
97 {
98 resp[i] = tmp;
\ 00000096 6755 STRB R7,[R4, R5]
99 tmp = SPI_RecByte(); /* 循环的最后发送8clock at the last recycle,clock out 8 clock */
\ 00000098 ........ _BLF SPI_RecByte,SPI_RecByte??rT
\ 0000009C 071C MOV R7,R0
100 }
\ 0000009E 6D1E SUB R5,#+0x1
\ 000000A0 F7E7 B ??SD_SendCmd_11
101
102 SPI_CS_Deassert();
\ ??SD_SendCmd_12:
\ 000000A2 ........ _BLF SPI_CS_Deassert,SPI_CS_Deassert??rT
103 return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
\ 000000A6 0020 MOV R0,#+0
\ ??SD_SendCmd_7:
\ 000000A8 03B0 ADD SP,#+0xC
\ 000000AA F0BC POP {R4-R7}
\ 000000AC 02BC POP {R1}
\ 000000AE 0847 BX R1 ;; return
104 }
105
106 /********************************************************************************************************************
107 ** 函数名称: void SD_PackParam() Name: void SD_PackParam()
108 ** 功能描述: 将32位的参数转为字节形式 Function: change 32bit parameter to bytes form
109 ** 输 入: INT8U *parameter: 字节参数缓冲区 Input: INT8U *parameter: the buffer of bytes parameter
110 INT32U value : 32位参数 INT32U value : 32bit parameter
111 ** 输 出: 无 Output: NULL
112 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
113 void SD_PackParam(INT8U *parameter, INT32U value)
114 {
115 parameter[3] = (INT8U)(value >> 24);
\ SD_PackParam:
\ 00000000 0A1C MOV R2,R1
\ 00000002 120E LSR R2,R2,#+0x18
\ 00000004 C270 STRB R2,[R0, #+0x3]
116 parameter[2] = (INT8U)(value >> 16);
\ 00000006 0A1C MOV R2,R1
\ 00000008 120C LSR R2,R2,#+0x10
\ 0000000A 8270 STRB R2,[R0, #+0x2]
117 parameter[1] = (INT8U)(value >> 8);
\ 0000000C 0A1C MOV R2,R1
\ 0000000E 120A LSR R2,R2,#+0x8
\ 00000010 4270 STRB R2,[R0, #+0x1]
118 parameter[0] = (INT8U)(value);
\ 00000012 0A1C MOV R2,R1
\ 00000014 0270 STRB R2,[R0, #+0]
119 }
\ 00000016 7047 BX LR ;; return
120
121 /********************************************************************************************************************
122 ** 函数名称: INT8U SD_BlockCommand() Name: INT8U SD_BlockCommand()
123 ** 功能描述: 块命令 Function: command about block operation
124 ** 输 入: INT8U cmd : 命令字 Input: INT8U cmd : command byte
125 INT8U resptype : 响应类型 INT8U resptype : response type
126 INT32U parameter: 块操作参数 INT32U parameter: parameter of block operation
127 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
128 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
129 INT8U SD_BlockCommand(INT8U cmd, INT8U resptype, INT32U parameter)
130 {
\ SD_BlockCommand:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
\ 00000006 0D1C MOV R5,R1
\ 00000008 171C MOV R7,R2
131 INT8U param[4],resp,ret;
132
133 parameter <<= SD_BLOCKSIZE_NBITS; /* 调整地址:左移9位 adjust address: move 9 bits left */
\ 0000000A 7F02 LSL R7,R7,#+0x9
134
135 SD_PackParam(param, parameter); /* 将参数转化为字节形式 change the parameter to bytes form */
\ 0000000C 391C MOV R1,R7
\ 0000000E 01A8 ADD R0,SP,#+0x4
\ 00000010 ........ BL SD_PackParam
136
137 ret = SD_SendCmd(cmd, param, resptype, &resp);
\ 00000014 6B46 MOV R3,SP
\ 00000016 2A1C MOV R2,R5
\ 00000018 01A9 ADD R1,SP,#+0x4
\ 0000001A 201C MOV R0,R4
\ 0000001C ........ BL SD_SendCmd
\ 00000020 061C MOV R6,R0
138 if (ret != SD_NO_ERR)
\ 00000022 002E CMP R6,#+0
\ 00000024 01D0 BEQ ??SD_BlockCommand_0
139 return ret; /* 结束数据传输失败 stop transmission operation fail */
\ 00000026 301C MOV R0,R6
\ 00000028 06E0 B ??SD_BlockCommand_1
140
141 if (resp != 0)
\ ??SD_BlockCommand_0:
\ 0000002A 6846 MOV R0,SP
\ 0000002C 0078 LDRB R0,[R0, #+0]
\ 0000002E 0028 CMP R0,#+0
\ 00000030 01D0 BEQ ??SD_BlockCommand_2
142 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
\ 00000032 1220 MOV R0,#+0x12
\ 00000034 00E0 B ??SD_BlockCommand_1
143
144 return SD_NO_ERR;
\ ??SD_BlockCommand_2:
\ 00000036 0020 MOV R0,#+0
\ ??SD_BlockCommand_1:
\ 00000038 02B0 ADD SP,#+0x8
\ 0000003A F0BC POP {R4-R7}
\ 0000003C 02BC POP {R1}
\ 0000003E 0847 BX R1 ;; return
145 }
146
147 /*
148 ************************************************
149
150 下面为SD卡SPI命令
151
152 ************************************************
153 */
154
155 /********************************************************************************************************************
156 ** 函数名称: INT8U SD_ResetSD() Name: INT8U SD_ResetSD()
157 ** 功能描述: 复位SD/MMC卡 Function: reset SD/MMC card
158 ** 输 入: 无 Input: NULL
159 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
160 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
161 INT8U SD_ResetSD(void)
162 {
\ SD_ResetSD:
\ 00000000 00B5 PUSH {LR}
\ 00000002 82B0 SUB SP,#+0x8
163 INT8U param[4] = {0,0,0,0},resp;
\ 00000004 6846 MOV R0,SP
\ 00000006 0021 MOV R1,#+0
\ 00000008 0160 STR R1,[R0, #0]
164
165 return (SD_SendCmd(CMD0, param, CMD0_R, &resp)); /* 复位命令 command that reset card */
\ 0000000A 01AB ADD R3,SP,#+0x4
\ 0000000C 0122 MOV R2,#+0x1
\ 0000000E 6946 MOV R1,SP
\ 00000010 0020 MOV R0,#+0
\ 00000012 ........ BL SD_SendCmd
\ 00000016 02B0 ADD SP,#+0x8
\ 00000018 02BC POP {R1}
\ 0000001A 0847 BX R1 ;; return
166 }
167
168 /********************************************************************************************************************
169 ** 函数名称: INT8U SD_ReadCSD() Name: INT8U SD_ReadCSD()
170 ** 功能描述: 读SD/MMC卡的CSD寄存器 Function: read CSD register of SD/MMC card
171 ** 输 入: INT8U csdlen : 寄存器长度(固定为16) INT8U csdlen : len of register (fixed,is 16)
172 INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
173 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
174 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
175 INT8U SD_ReadCSD(INT8U csdlen, INT8U *recbuf)
176 {
\ SD_ReadCSD:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
\ 00000006 0D1C MOV R5,R1
177 INT8U param[4] = {0,0,0,0},resp,ret;
\ 00000008 01A8 ADD R0,SP,#+0x4
\ 0000000A 0021 MOV R1,#+0
\ 0000000C 0160 STR R1,[R0, #0]
178
179 ret = SD_SendCmd(CMD9, param, CMD9_R, &resp); /* 读CSD寄存器命令 command that read CSD register */
\ 0000000E 6B46 MOV R3,SP
\ 00000010 0122 MOV R2,#+0x1
\ 00000012 01A9 ADD R1,SP,#+0x4
\ 00000014 0920 MOV R0,#+0x9
\ 00000016 ........ BL SD_SendCmd
\ 0000001A 061C MOV R6,R0
180 if (ret != SD_NO_ERR)
\ 0000001C 002E CMP R6,#+0
\ 0000001E 01D0 BEQ ??SD_ReadCSD_0
181 return ret;
\ 00000020 301C MOV R0,R6
\ 00000022 0BE0 B ??SD_ReadCSD_1
182
183 if (resp != 0)
\ ??SD_ReadCSD_0:
\ 00000024 6846 MOV R0,SP
\ 00000026 0078 LDRB R0,[R0, #+0]
\ 00000028 0028 CMP R0,#+0
\ 0000002A 01D0 BEQ ??SD_ReadCSD_2
184 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -