📄 sdcmd.lst
字号:
\ ??SD_ReadOCR_3:
\ 0000003C 3606 LSL R6,R6,#+0x18 ;; ZeroExt R6,R6,#+0x18,#+0x18
\ 0000003E 360E LSR R6,R6,#+0x18
\ 00000040 042E CMP R6,#+0x4
\ 00000042 09D2 BCS ??SD_ReadOCR_4
432 recbuf[tmp] = resp[tmp + 1]; /* 复制OCR寄存器内容到接收缓冲区 */
\ 00000044 3606 LSL R6,R6,#+0x18 ;; ZeroExt R6,R6,#+0x18,#+0x18
\ 00000046 360E LSR R6,R6,#+0x18
\ 00000048 3606 LSL R6,R6,#+0x18 ;; ZeroExt R6,R6,#+0x18,#+0x18
\ 0000004A 360E LSR R6,R6,#+0x18
\ 0000004C 01A8 ADD R0,SP,#+0x4
\ 0000004E 8019 ADD R0,R0,R6
\ 00000050 4078 LDRB R0,[R0, #+0x1]
\ 00000052 A855 STRB R0,[R5, R6]
\ 00000054 761C ADD R6,#+0x1
\ 00000056 F1E7 B ??SD_ReadOCR_3
433
434 return SD_NO_ERR;
\ ??SD_ReadOCR_4:
\ 00000058 0020 MOV R0,#+0
\ ??SD_ReadOCR_1:
\ 0000005A 03B0 ADD SP,#+0xC
\ 0000005C 70BC POP {R4-R6}
\ 0000005E 02BC POP {R1}
\ 00000060 0847 BX R1 ;; return
435 }
436
437 /********************************************************************************************************************
438 ** 函数名称: INT8U SD_EnableCRC() Name: INT8U SD_EnableCRC()
439 ** 功能描述: 使能SD卡的CRC校验功能 Function: enable crc check of SD Card
440 ** 输 入: INT8U bEnable : 1:使能 0:禁止 Input: INT8U bEnable : 1:enable 0: disable
441 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
442 *********************************************************************************************************************/
443 #if SD_CRC_EN
444 INT8U SD_EnableCRC(INT8U bEnable)
445 {
446 INT8U param[4],resp,ret;
447
448 if (bEnable == 1)
449 param[0] = 1; /* 使能crc enable crc */
450 else
451 param[1] = 0; /* 禁止crc disalbe crc */
452
453 ret = SD_SendCmd(CMD59, param, CMD59_R, &resp); /* "使能/禁止CRC"命令 enable/disable crc command */
454 if (ret != SD_NO_ERR)
455 return ret;
456
457 if (resp != 0)
458 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
459
460 return SD_NO_ERR;
461
462 }
463 #endif
464
465 /*********************************************************************************************************************
466 ** 函数名称: INT8U SD_ReadSD_Status() Name: INT8U SD_ReadSD_Status()
467 ** 功能描述: 读SD卡的 SD_Status 寄存器 Function: read SD_Status register of sd card
468 ** 输 入: INT8U sdslen : 寄存器长度(固定为64) Input: INT8U sdslen: len of register (fixed,is 64)
469 INT8U *recbuf : 接收缓冲区 INT8U *recbuf: recbuffer
470 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
471 ** 注 意: 只有SD卡才有SD Status 寄存器 Note: only SD card have SD Status Register
472 **********************************************************************************************************************/
473 #if SD_ReadSD_Status_EN
474 INT8U SD_ReadSD_Status(INT8U sdslen, INT8U *recbuf)
475 {
476 INT8U param[4] = {0,0,0,0},resp[2],ret;
477
478 ret = SD_SendCmd(CMD55, param, CMD55_R, resp); /* 后续命令为一个应用命令 */
479 if (ret != SD_NO_ERR)
480 return ret; /* command that the followed commnad is a specific application */
481
482 if (resp[0] != 0)
483 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
484
485 ret = SD_SendCmd(ACMD13, param, ACMD13_R, resp); /* 读 SD_Status 命令 */
486 if (ret != SD_NO_ERR)
487 return ret; /* command that read SD_Status register */
488
489 if ((resp[0] != 0) || (resp[1] != 0))
490 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
491
492 return (SD_ReadBlockData(sdslen, recbuf)); /* 读出寄存器内容 read the content of the register */
493 }
494 #endif
495
496 /*******************************************************************************************************************
497 ** 函数名称: INT8U SD_ReadSCR() Name: INT8U SD_ReadSCR()
498 ** 功能描述: 读SD卡的 SCR 寄存器 Function: read SCR register of SD card
499 ** 输 入: INT8U scrlen : 寄存器长度(固定为8) Input: INT8U scrlen : len of register (fixed,is 8)
500 INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recieve buffer
501 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
502 ** 备 注: MMC卡没有该寄存器 Note: MMC Card have not this register
503 ********************************************************************************************************************/
504 #if SD_ReadSCR_EN
505 INT8U SD_ReadSCR(INT8U scrlen, INT8U *recbuf)
506 {
507 INT8U param[4] = {0,0,0,0},resp,ret;
508
509 ret = SD_SendCmd(CMD55, param, CMD55_R, &resp); /* 后续命令为一个应用命令 */
510 if (ret != SD_NO_ERR) /* command that the followed commnad is a specific application */
511 return ret;
512
513 if (resp != 0)
514 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
515
516 ret = SD_SendCmd(ACMD51, param, ACMD51_R, &resp); /* 发送读 SD Status 命令*/
517 if (ret != SD_NO_ERR) /* command that read SD Status register */
518 return ret;
519
520 if (resp != 0)
521 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
522
523 return (SD_ReadBlockData(scrlen, recbuf)); /* 读出寄存器内容 read the content of the register */
524 }
525 #endif
526
527 /********************************************************************************************************************
528 ** 函数名称: INT8U SD_GetNumWRBlcoks() Name: INT8U SD_GetNumWRBlcoks()
529 ** 功能描述: 得到正确写入的块数 Function: get the block numbers that written correctly
530 ** 输 入: INT32U *blocknum: 返回的块数 Input: INT32U blocknum : the block numbers returned
531 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
532 ** 注 意: MMC卡没有该命令 Note: MMC Card have no this command
533 *********************************************************************************************************************/
534 #if SD_WriteMultiBlock_EN
535 INT8U SD_GetNumWRBlcoks(INT32U *blocknum)
536 {
537 INT8U tmp[4] = {0,0,0,0},resp,ret;
538
539 ret = SD_SendCmd(CMD55, tmp, CMD55_R, &resp); /* 后续命令为一个应用命令 */
540 if (ret != SD_NO_ERR) /* command that the followed commnad is a specific application */
541 return ret;
542
543 if (resp != 0)
544 return SD_ERR_CMD_RESP;
545
546 ret = SD_SendCmd(ACMD22, tmp, ACMD22_R, &resp); /* 读取正确写入的块数命令 */
547 if (ret != SD_NO_ERR) /* command that read the numbers of block written correctly */
548 return ret;
549
550 if (resp != 0)
551 return SD_ERR_CMD_RESP; /* 响应错误 response is error */
552
553 ret = SD_ReadBlockData(4, tmp); /* 读块数 read the numbvers of block */
554 if (ret != SD_NO_ERR)
555 return ret;
556
557 *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];
558 /* 转换为32位 change to 32 bits */
559
560 return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
561 }
562 #endif
563
564 /*********************************************************
565
566 下面为一些数据传输函数
567
568 **********************************************************/
569
570 /********************************************************************************************************************
571 ** 函数名称: INT8U SD_ReadRegister() Name: INT8U SD_ReadRegister()
572 ** 功能描述: 从SD卡读取数据 Function: read data from SD card
573 ** 输 入: INT32U len : 长度 Input: INT32U len : length
574 INT8U *recbuf: 接收缓冲区 INT8U *recbuf: receive buffer
575 ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
576 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
577 INT8U SD_ReadRegister(INT32U len, INT8U *recbuf)
578 {
\ SD_ReadRegister:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
579 INT32U i = 0;
\ 00000006 0020 MOV R0,#+0
\ 00000008 071C MOV R7,R0
580 INT8U resp;
581
582 SPI_CS_Assert();
\ 0000000A ........ _BLF SPI_CS_Assert,SPI_CS_Assert??rT
583 do{ /* 等待数据起始令牌 wait for data start token */
584 resp = SPI_RecByte();
\ ??SD_ReadRegister_0:
\ 0000000E ........ _BLF SPI_RecByte,SPI_RecByte??rT
\ 00000012 061C MOV R6,R0
585 i++;
\ 00000014 7F1C ADD R7,#+0x1
586 }while((resp == 0xFF) && (i < SD_READREG_TIMEOUT));
\ 00000016 FF2E CMP R6,#+0xFF
\ 00000018 01D1 BNE ??SD_ReadRegister_1
\ 0000001A 082F CMP R7,#+0x8
\ 0000001C F7D3 BCC ??SD_ReadRegister_0
587
588 if (i >= SD_READREG_TIMEOUT)
\ ??SD_ReadRegister_1:
\ 0000001E 082F CMP R7,#+0x8
\ 00000020 03D3 BCC ??SD_ReadRegister_2
589 {
590 SPI_CS_Deassert();
\ 00000022 ........ _BLF SPI_CS_Deassert,SPI_CS_Deassert??rT
591 return SD_ERR_TIMEOUT_READ; /* 超时, 返回错误 timeout, return error */
\ 00000026 3120 MOV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -