📄 sdcmd.lst
字号:
285 /********************************************************************************************************************
286 ** 函数名称: INT8U SD_WriteSingleBlock() Name: INT8U SD_WriteSingleBlock()
287 ** 功能描述: 写单块命令 Function: write single block command
288 ** 输 入: INT32U blockaddr: block address Input: INT32U blockaddr: block address
289 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
290 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
291 INT8U SD_WriteSingleBlock(INT32U blockaddr)
292 {
\ SD_WriteSingleBlock:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
293 return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */
\ 00000004 221C MOV R2,R4
\ 00000006 0121 MOV R1,#+0x1
\ 00000008 1820 MOV R0,#+0x18
\ 0000000A ........ BL SD_BlockCommand
\ 0000000E 10BC POP {R4}
\ 00000010 02BC POP {R1}
\ 00000012 0847 BX R1 ;; return
294 }
295
296 /********************************************************************************************************************
297 ** 函数名称: INT8U SD_WriteMultipleBlock() Name: INT8U SD_WriteMultipleBlock()
298 ** 功能描述: 写多块命令 Function: write multiple block command
299 ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
300 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
301 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
302 INT8U SD_WriteMultipleBlock(INT32U blockaddr)
303 {
\ SD_WriteMultipleBlock:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 041C MOV R4,R0
304 return (SD_BlockCommand(CMD25, CMD25_R, blockaddr)); /* 写多块命令 command that write multiple block */
\ 00000004 221C MOV R2,R4
\ 00000006 0121 MOV R1,#+0x1
\ 00000008 1920 MOV R0,#+0x19
\ 0000000A ........ BL SD_BlockCommand
\ 0000000E 10BC POP {R4}
\ 00000010 02BC POP {R1}
\ 00000012 0847 BX R1 ;; return
305 }
306
307 /********************************************************************************************************************
308 ** 函数名称: INT8U SD_ProgramCSD() Name: INT8U SD_ProgramCSD()
309 ** 功能描述: 写CSD寄存器 Function: write CSD register
310 ** 输 入: INT8U *buff : CSD寄存器内容 Input: INT8U *buff : the content of CSD register
311 INT8U len : CSD寄存器长度 INT8U len : the length of CSD register
312 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
313 ********************************************************************************************************************/
314 #if SD_ProgramCSD_EN
315 INT8U SD_ProgramCSD(INT8U len, INT8U *buff)
316 {
317 INT8U param[4] = {0,0,0,0},resp,ret;
318
319 if (len != 16) return SD_ERR_USER_PARAM;
320
321 ret = SD_SendCmd(CMD27, param, CMD27_R, &resp); /* 发送写CSD寄存器命令 send command that write CSD */
322 if (ret != SD_NO_ERR)
323 return ret;
324
325 if (resp != 0)
326 return SD_ERR_CMD_RESP;
327
328 buff[15] = (SD_GetCRC7(buff, 15) << 1) + 0x01; /* 计算CSD中的crc 位域 calculate crc field in CSD */
329
330 return(SD_WriteBlockData(0, 16, buff));
331 }
332
333 /********************************************************************************************************************
334 ** 函数名称: INT8U SD_GetCRC7() Name: INT8U SD_GetCRC7()
335 ** 功能描述: 计算CRC7 Function: calculate crc7
336 ** 输 入: INT8U *pSource: 数据 Input: INT8U *pSource: data
337 INT16U len : 数据长度 INT16U len : data length
338 ** 输 出: CRC7码 Output: CRC7 code
339 *********************************************************************************************************************/
340 INT8U SD_GetCRC7(INT8U *pSource, INT16U len)
341 {
342 INT8U i = 0, j;
343 INT8U reg = 0;
344
345 do
346 {
347 for (j = 0; j < 8; j++)
348 {
349 reg <<= 1;
350 reg ^= ((((pSource[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
351 }
352
353 i++;
354
355 }while(i < len);
356
357 return reg;
358 }
359 #endif
360
361 #if SD_EraseBlock_EN
362 /********************************************************************************************************************
363 ** 函数名称: INT8U SD_EraseStartBlock() Name: INT8U SD_EraseStartBlock()
364 ** 功能描述: 设置块擦除起始地址 Function: select the start block address of erasing operation
365 ** 输 入: INT32U startblock: 块地址 Input: INT32U startblock : block address
366 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
367 *********************************************************************************************************************/
368 INT8U SD_EraseStartBlock(INT32U startblock)
369 {
370 if (sds.card_type == CARDTYPE_SD)
371 return (SD_BlockCommand(CMD32, CMD32_R, startblock)); /* 发送擦除起始块地址 send the start block address of erasing operation */
372 else
373 return (SD_BlockCommand(CMD35, CMD35_R, startblock)); /* 发送擦除起始块地址 send the start block address of erasing operation */
374 }
375
376 /********************************************************************************************************************
377 ** 函数名称: INT8U SD_EraseEndBlock() Name: INT8U SD_EraseEndBlock()
378 ** 功能描述: 设置块擦除终止地址 Function: select the end block address of erasing operation
379 ** 输 入: INT32U endblock: 块地址 Input: INT32U Length : block address
380 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
381 *********************************************************************************************************************/
382 INT8U SD_EraseEndBlock(INT32U endblock)
383 {
384 if (sds.card_type == CARDTYPE_SD)
385 return (SD_BlockCommand(CMD33, CMD33_R, endblock)); /* 发送擦除终止块地址 send the end block address of erasing operation */
386 else
387 return (SD_BlockCommand(CMD36, CMD36_R, endblock)); /* 发送擦除终止块地址 send the end block address of erasing operation */
388 }
389
390 /********************************************************************************************************************
391 ** 函数名称: INT8U SD_EraseSelectedBlock() Name: INT8U SD_EraseSelectedBlock()
392 ** 功能描述: 擦除已选中的块 Function: erase block selected
393 ** 输 入: 无 Input: NULL
394 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
395 *********************************************************************************************************************/
396 INT8U SD_EraseSelectedBlock(void)
397 {
398 INT8U param[4],resp,tmp;
399
400 SD_PackParam(param, 0);
401
402 tmp = SD_SendCmd(CMD38, param, CMD38_R, &resp); /* 擦除所选择的块 erase blocks selected */
403 if (tmp != SD_NO_ERR)
404 return tmp;
405
406 if (SD_WaitBusy(SD_WAIT_ERASE) != SD_NO_ERR) /* 等待擦除完成 wait for finishing erasing */
407 return SD_ERR_TIMEOUT_ERASE;
408 else
409 return SD_NO_ERR;
410 }
411 #endif
412
413 /*********************************************************************************************************************
414 ** 函数名称: INT8U SD_ReadOCR() Name: INT8U SD_ReadOCR()
415 ** 功能描述: 读操作条件寄存器OCR Function: read OCR register of card
416 ** 输 入: INT8U ocrlen : 寄存器长度(固定为4) Input: INT8U ocrlen : len of register (fixed,is 4)
417 INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
418 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
419 **********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
420 INT8U SD_ReadOCR(INT8U ocrlen, INT8U *recbuf)
421 {
\ SD_ReadOCR:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 83B0 SUB SP,#+0xC
\ 00000004 041C MOV R4,R0
\ 00000006 0D1C MOV R5,R1
422 INT8U param[4] = {0,0,0,0},resp[5],tmp;
\ 00000008 6846 MOV R0,SP
\ 0000000A 0021 MOV R1,#+0
\ 0000000C 0160 STR R1,[R0, #0]
423
424 tmp = SD_SendCmd(CMD58, param, CMD58_R, resp); /* 读 OCR 寄存器命令 */
\ 0000000E 01AB ADD R3,SP,#+0x4
\ 00000010 0422 MOV R2,#+0x4
\ 00000012 6946 MOV R1,SP
\ 00000014 3A20 MOV R0,#+0x3A
\ 00000016 ........ BL SD_SendCmd
\ 0000001A 061C MOV R6,R0
425 if (tmp != SD_NO_ERR) /* read OCR register command */
\ 0000001C 3606 LSL R6,R6,#+0x18 ;; ZeroExt R6,R6,#+0x18,#+0x18
\ 0000001E 360E LSR R6,R6,#+0x18
\ 00000020 002E CMP R6,#+0
\ 00000022 03D0 BEQ ??SD_ReadOCR_0
426 return tmp;
\ 00000024 301C MOV R0,R6
\ 00000026 0006 LSL R0,R0,#+0x18 ;; ZeroExt R0,R0,#+0x18,#+0x18
\ 00000028 000E LSR R0,R0,#+0x18
\ 0000002A 16E0 B ??SD_ReadOCR_1
427
428 if (resp[0] != 0)
\ ??SD_ReadOCR_0:
\ 0000002C 6846 MOV R0,SP
\ 0000002E 0079 LDRB R0,[R0, #+0x4]
\ 00000030 0028 CMP R0,#+0
\ 00000032 01D0 BEQ ??SD_ReadOCR_2
429 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
\ 00000034 1220 MOV R0,#+0x12
\ 00000036 10E0 B ??SD_ReadOCR_1
430
431 for (tmp = 0; tmp < 4; tmp++)
\ ??SD_ReadOCR_2:
\ 00000038 0020 MOV R0,#+0
\ 0000003A 061C MOV R6,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -