📄 sdcmd.lst
字号:
\ 0000002C 1220 MOV R0,#+0x12
\ 0000002E 05E0 B ??SD_ReadCSD_1
185
186 return (SD_ReadRegister(csdlen, recbuf));
\ ??SD_ReadCSD_2:
\ 00000030 291C MOV R1,R5
\ 00000032 2406 LSL R4,R4,#+0x18 ;; ZeroExt R4,R4,#+0x18,#+0x18
\ 00000034 240E LSR R4,R4,#+0x18
\ 00000036 201C MOV R0,R4
\ 00000038 ........ BL SD_ReadRegister
\ ??SD_ReadCSD_1:
\ 0000003C 02B0 ADD SP,#+0x8
\ 0000003E 70BC POP {R4-R6}
\ 00000040 02BC POP {R1}
\ 00000042 0847 BX R1 ;; return
187 }
188
189 /*******************************************************************************************************************
190 ** 函数名称: INT8U SD_ReadCID() Name: INT8U SD_ReadCID()
191 ** 功能描述: 读SD卡的CID寄存器 Function: read CID register of sd card
192 ** 输 入: INT8U cidlen : 寄存器长度(固定为16) INT8U cidlen : len of register (fixed,is 16)
193 INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
194 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
195 ********************************************************************************************************************/
196 #if SD_ReadCID_EN
197 INT8U SD_ReadCID(INT8U cidlen, INT8U *recbuf)
198 {
199 INT8U param[4] = {0,0,0,0},resp,ret;
200
201 ret = SD_SendCmd(CMD10, param, CMD10_R, &resp); /* 读CID寄存器命令 command that read CID register */
202 if ( ret != SD_NO_ERR)
203 return ret;
204
205 if (resp != 0)
206 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
207
208 return (SD_ReadRegister(cidlen, recbuf));
209 }
210 #endif
211
212 /********************************************************************************************************************
213 ** 函数名称: INT8U SD_StopTransmission() Name: INT8U SD_StopTransmission()
214 ** 功能描述: 停止数据传输 Function: stop data transmission
215 ** 输 入: 无 Input: NULL
216 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
217 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
218 INT8U SD_StopTransmission(void)
219 {
\ SD_StopTransmission:
\ 00000000 00B5 PUSH {LR}
\ 00000002 82B0 SUB SP,#+0x8
220 INT8U param[4] = {0,0,0,0},resp;
\ 00000004 6846 MOV R0,SP
\ 00000006 0021 MOV R1,#+0
\ 00000008 0160 STR R1,[R0, #0]
221
222 return (SD_SendCmd(CMD12, param, CMD12_R, &resp)); /* 结束数据传输命令失败 stop transmission command fail */
\ 0000000A 01AB ADD R3,SP,#+0x4
\ 0000000C 0222 MOV R2,#+0x2
\ 0000000E 6946 MOV R1,SP
\ 00000010 0C20 MOV R0,#+0xC
\ 00000012 ........ BL SD_SendCmd
\ 00000016 02B0 ADD SP,#+0x8
\ 00000018 02BC POP {R1}
\ 0000001A 0847 BX R1 ;; return
223 }
224
225 /*********************************************************************************************************************
226 ** 函数名称: INT8U SD_ReadCard_Status() Name: INT8U SD_ReadCard_Status()
227 ** 功能描述: 读SD/MMC卡的 Card Status 寄存器 Function: read Card Status register of SD/MMC card
228 ** 输 入: INT8U len: 寄存器长度(固定为2) INT8U len: len of register (fixed,is 2)
229 INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
230 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
231 **********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
232 INT8U SD_ReadCard_Status(INT8U len, INT8U *buffer)
233 {
\ SD_ReadCard_Status:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 81B0 SUB SP,#+0x4
\ 00000004 041C MOV R4,R0
\ 00000006 0D1C MOV R5,R1
234 INT8U param[4] = {0,0,0,0};
\ 00000008 6846 MOV R0,SP
\ 0000000A 0021 MOV R1,#+0
\ 0000000C 0160 STR R1,[R0, #0]
235
236 return (SD_SendCmd(CMD13, param, CMD13_R, buffer)); /* 读 Card Status 寄存器 */
\ 0000000E 2B1C MOV R3,R5
\ 00000010 0322 MOV R2,#+0x3
\ 00000012 6946 MOV R1,SP
\ 00000014 0D20 MOV R0,#+0xD
\ 00000016 ........ BL SD_SendCmd
\ 0000001A 01B0 ADD SP,#+0x4
\ 0000001C 30BC POP {R4,R5}
\ 0000001E 02BC POP {R1}
\ 00000020 0847 BX R1 ;; return
237 /* read register of Card Status */
238 }
239
240
241 /********************************************************************************************************************
242 ** 函数名称: INT8U SD_SetBlockLen() Name: INT8U SD_SetBlockLen()
243 ** 功能描述: 设置一个块的长度 Function: set a block len of card
244 ** 输 入: INT32U length : 块的长度值 Input: INT32U length : the length of a block
245 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
246 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
247 INT8U SD_SetBlockLen(INT32U length)
248 {
\ SD_SetBlockLen:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
249 INT8U param[4],resp,ret;
250
251 SD_PackParam(param, length); /* 将参数转化为字节形式 change the parameter to bytes form */
\ 00000006 211C MOV R1,R4
\ 00000008 01A8 ADD R0,SP,#+0x4
\ 0000000A ........ BL SD_PackParam
252
253 ret = SD_SendCmd(CMD16, param, CMD16_R, &resp);
\ 0000000E 6B46 MOV R3,SP
\ 00000010 0122 MOV R2,#+0x1
\ 00000012 01A9 ADD R1,SP,#+0x4
\ 00000014 1020 MOV R0,#+0x10
\ 00000016 ........ BL SD_SendCmd
\ 0000001A 051C MOV R5,R0
254 if (ret != SD_NO_ERR)
\ 0000001C 002D CMP R5,#+0
\ 0000001E 01D0 BEQ ??SD_SetBlockLen_0
255 return ret; /* 设置块的长度为length失败 set the length of block to length fail */
\ 00000020 281C MOV R0,R5
\ 00000022 06E0 B ??SD_SetBlockLen_1
256
257 if (resp != 0)
\ ??SD_SetBlockLen_0:
\ 00000024 6846 MOV R0,SP
\ 00000026 0078 LDRB R0,[R0, #+0]
\ 00000028 0028 CMP R0,#+0
\ 0000002A 01D0 BEQ ??SD_SetBlockLen_2
258 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
\ 0000002C 1220 MOV R0,#+0x12
\ 0000002E 00E0 B ??SD_SetBlockLen_1
259
260 return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
\ ??SD_SetBlockLen_2:
\ 00000030 0020 MOV R0,#+0
\ ??SD_SetBlockLen_1:
\ 00000032 02B0 ADD SP,#+0x8
\ 00000034 30BC POP {R4,R5}
\ 00000036 02BC POP {R1}
\ 00000038 0847 BX R1 ;; return
261 }
262
263 /********************************************************************************************************************
264 ** 函数名称: INT8U SD_ReadSingleBlock() Name: INT8U SD_ReadSingleBlock()
265 ** 功能描述: 读单块命令 Function: read single block command
266 ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
267 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
268 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
269 INT8U SD_ReadSingleBlock(INT32U blockaddr)
270 {
\ SD_ReadSingleBlock:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
271 return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */
\ 00000004 221C MOV R2,R4
\ 00000006 0121 MOV R1,#+0x1
\ 00000008 1120 MOV R0,#+0x11
\ 0000000A ........ BL SD_BlockCommand
\ 0000000E 10BC POP {R4}
\ 00000010 02BC POP {R1}
\ 00000012 0847 BX R1 ;; return
272 }
273
274 /********************************************************************************************************************
275 ** 函数名称: INT8U SD_ReadMultipleBlock() Name: INT8U SD_ReadMultipleBlock()
276 ** 功能描述: 读多块命令 Function: read multiple block command
277 ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
278 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
279 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
280 INT8U SD_ReadMultipleBlock(INT32U blockaddr)
281 {
\ SD_ReadMultipleBlock:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
282 return (SD_BlockCommand(CMD18, CMD18_R, blockaddr)); /* 读多块命令 command that read multiple block */
\ 00000004 221C MOV R2,R4
\ 00000006 0121 MOV R1,#+0x1
\ 00000008 1220 MOV R0,#+0x12
\ 0000000A ........ BL SD_BlockCommand
\ 0000000E 10BC POP {R4}
\ 00000010 02BC POP {R1}
\ 00000012 0847 BX R1 ;; return
283 }
284
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -