📄 sdcmd.lis
字号:
047E ; /********************************************************************************************************************
047E ; ** 函数名称: INT8U SD_ReadSingleBlock() Name: INT8U SD_ReadSingleBlock()
047E ; ** 功能描述: 读单块命令 Function: read single block command
047E ; ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
047E ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
047E ; *********************************************************************************************************************/
047E ; uint8 SD_ReadSingleBlock(uint32 blockaddr)
047E ; {
047E .dbline 240
047E ; return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */
047E FE01 movw R30,R28
0480 2480 ldd R2,z+4
0482 3580 ldd R3,z+5
0484 4680 ldd R4,z+6
0486 5780 ldd R5,z+7
0488 2882 std y+0,R2
048A 3982 std y+1,R3
048C 4A82 std y+2,R4
048E 5B82 std y+3,R5
0490 21E0 ldi R18,1
0492 01E1 ldi R16,17
0494 08DF xcall _SD_BlockCommand
0496 .dbline -2
0496 L45:
0496 2896 adiw R28,8
0498 .dbline 0 ; func end
0498 0895 ret
049A .dbsym l blockaddr 4 l
049A .dbend
049A .dbfunc e SD_ReadMultipleBlock _SD_ReadMultipleBlock fc
049A ; blockaddr -> y+4
.even
049A _SD_ReadMultipleBlock::
049A 0E940000 xcall push_arg4
049E 2497 sbiw R28,4
04A0 .dbline -1
04A0 .dbline 250
04A0 ; }
04A0 ;
04A0 ; /********************************************************************************************************************
04A0 ; ** 函数名称: INT8U SD_ReadMultipleBlock() Name: INT8U SD_ReadMultipleBlock()
04A0 ; ** 功能描述: 读多块命令 Function: read multiple block command
04A0 ; ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
04A0 ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
04A0 ; *********************************************************************************************************************/
04A0 ; uint8 SD_ReadMultipleBlock(uint32 blockaddr)
04A0 ; {
04A0 .dbline 251
04A0 ; return (SD_BlockCommand(CMD18, CMD18_R, blockaddr)); /* 读多块命令 command that read multiple block */
04A0 FE01 movw R30,R28
04A2 2480 ldd R2,z+4
04A4 3580 ldd R3,z+5
04A6 4680 ldd R4,z+6
04A8 5780 ldd R5,z+7
04AA 2882 std y+0,R2
04AC 3982 std y+1,R3
04AE 4A82 std y+2,R4
04B0 5B82 std y+3,R5
04B2 21E0 ldi R18,1
04B4 02E1 ldi R16,18
04B6 F7DE xcall _SD_BlockCommand
04B8 .dbline -2
04B8 L46:
04B8 2896 adiw R28,8
04BA .dbline 0 ; func end
04BA 0895 ret
04BC .dbsym l blockaddr 4 l
04BC .dbend
04BC .dbfunc e SD_WriteSingleBlock _SD_WriteSingleBlock fc
04BC ; blockaddr -> y+4
.even
04BC _SD_WriteSingleBlock::
04BC 0E940000 xcall push_arg4
04C0 2497 sbiw R28,4
04C2 .dbline -1
04C2 .dbline 261
04C2 ; }
04C2 ;
04C2 ; /********************************************************************************************************************
04C2 ; ** 函数名称: INT8U SD_WriteSingleBlock() Name: INT8U SD_WriteSingleBlock()
04C2 ; ** 功能描述: 写单块命令 Function: write single block command
04C2 ; ** 输 入: INT32U blockaddr: block address Input: INT32U blockaddr: block address
04C2 ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
04C2 ; *********************************************************************************************************************/
04C2 ; uint8 SD_WriteSingleBlock(uint32 blockaddr)
04C2 ; {
04C2 .dbline 262
04C2 ; return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */
04C2 FE01 movw R30,R28
04C4 2480 ldd R2,z+4
04C6 3580 ldd R3,z+5
04C8 4680 ldd R4,z+6
04CA 5780 ldd R5,z+7
04CC 2882 std y+0,R2
04CE 3982 std y+1,R3
04D0 4A82 std y+2,R4
04D2 5B82 std y+3,R5
04D4 21E0 ldi R18,1
04D6 08E1 ldi R16,24
04D8 E6DE xcall _SD_BlockCommand
04DA .dbline -2
04DA L47:
04DA 2896 adiw R28,8
04DC .dbline 0 ; func end
04DC 0895 ret
04DE .dbsym l blockaddr 4 l
04DE .dbend
04DE .dbfunc e SD_WriteMultipleBlock _SD_WriteMultipleBlock fc
04DE ; blockaddr -> y+4
.even
04DE _SD_WriteMultipleBlock::
04DE 0E940000 xcall push_arg4
04E2 2497 sbiw R28,4
04E4 .dbline -1
04E4 .dbline 272
04E4 ; }
04E4 ;
04E4 ; /********************************************************************************************************************
04E4 ; ** 函数名称: INT8U SD_WriteMultipleBlock() Name: INT8U SD_WriteMultipleBlock()
04E4 ; ** 功能描述: 写多块命令 Function: write multiple block command
04E4 ; ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
04E4 ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
04E4 ; *********************************************************************************************************************/
04E4 ; uint8 SD_WriteMultipleBlock(uint32 blockaddr)
04E4 ; {
04E4 .dbline 273
04E4 ; return (SD_BlockCommand(CMD25, CMD25_R, blockaddr)); /* 写多块命令 command that write multiple block */
04E4 FE01 movw R30,R28
04E6 2480 ldd R2,z+4
04E8 3580 ldd R3,z+5
04EA 4680 ldd R4,z+6
04EC 5780 ldd R5,z+7
04EE 2882 std y+0,R2
04F0 3982 std y+1,R3
04F2 4A82 std y+2,R4
04F4 5B82 std y+3,R5
04F6 21E0 ldi R18,1
04F8 09E1 ldi R16,25
04FA D5DE xcall _SD_BlockCommand
04FC .dbline -2
04FC L48:
04FC 2896 adiw R28,8
04FE .dbline 0 ; func end
04FE 0895 ret
0500 .dbsym l blockaddr 4 l
0500 .dbend
.area lit(rom, con, rel)
0010 L50:
0010 0000 .byte 0,0
0012 0000 .byte 0,0
.area text(rom, con, rel)
0500 .dbfile D:\new_sd\SD\SD\sdcmd.c
0500 .dbfunc e SD_ReadOCR _SD_ReadOCR fc
0500 ; param -> y+9
0500 ; resp -> y+4
0500 ; tmp -> R20
0500 ; recbuf -> R22,R23
0500 ; ocrlen -> R20
.even
0500 _SD_ReadOCR::
0500 0E940000 xcall push_gset2
0504 B901 movw R22,R18
0506 402F mov R20,R16
0508 2D97 sbiw R28,13
050A .dbline -1
050A .dbline 384
050A ; }
050A ;
050A ; /********************************************************************************************************************
050A ; ** 函数名称: INT8U SD_ProgramCSD() Name: INT8U SD_ProgramCSD()
050A ; ** 功能描述: 写CSD寄存器 Function: write CSD register
050A ; ** 输 入: INT8U *buff : CSD寄存器内容 Input: INT8U *buff : the content of CSD register
050A ; INT8U len : CSD寄存器长度 INT8U len : the length of CSD register
050A ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
050A ; ********************************************************************************************************************/
050A ; #if SD_ProgramCSD_EN
050A ; uint8 SD_ProgramCSD(uint8 len, uint8 *buff)
050A ; {
050A ; uint8 param[4] = {0,0,0,0},resp,ret;
050A ;
050A ; if (len != 16) return SD_ERR_USER_PARAM;
050A ;
050A ; ret = SD_SendCmd(CMD27, param, CMD27_R, &resp); /* 发送写CSD寄存器命令 send command that write CSD */
050A ; if (ret != SD_NO_ERR)
050A ; return ret;
050A ;
050A ; if (resp != 0)
050A ; return SD_ERR_CMD_RESP;
050A ;
050A ; buff[15] = (SD_GetCRC7(buff, 15) << 1) + 0x01; /* 计算CSD中的crc 位域 calculate crc field in CSD */
050A ;
050A ; return(SD_WriteBlockData(0, 16, buff));
050A ; }
050A ;
050A ; /********************************************************************************************************************
050A ; ** 函数名称: INT8U SD_GetCRC7() Name: INT8U SD_GetCRC7()
050A ; ** 功能描述: 计算CRC7 Function: calculate crc7
050A ; ** 输 入: INT8U *pSource: 数据 Input: INT8U *pSource: data
050A ; INT16U len : 数据长度 INT16U len : data length
050A ; ** 输 出: CRC7码 Output: CRC7 code
050A ; *********************************************************************************************************************/
050A ; uint8 SD_GetCRC7(INT8U *pSource, INT16U len)
050A ; {
050A ; uint8 i = 0, j;
050A ; uint8 reg = 0;
050A ;
050A ; do
050A ; {
050A ; for (j = 0; j < 8; j++)
050A ; {
050A ; reg <<= 1;
050A ; reg ^= ((((pSource[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
050A ; }
050A ;
050A ; i++;
050A ;
050A ; }while(i < len);
050A ;
050A ; return reg;
050A ; }
050A ; #endif
050A ;
050A ; #if SD_EraseBlock_EN
050A ; /********************************************************************************************************************
050A ; ** 函数名称: INT8U SD_EraseStartBlock() Name: INT8U SD_EraseStartBlock()
050A ; ** 功能描述: 设置块擦除起始地址 Function: select the start block address of erasing operation
050A ; ** 输 入: INT32U startblock: 块地址 Input: INT32U startblock : block address
050A ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
050A ; *********************************************************************************************************************/
050A ; uint8 SD_EraseStartBlock(INT32U startblock)
050A ; {
050A ; return (SD_BlockCommand(CMD32, CMD32_R, startblock)); /* 发送擦除起始块地址 send the start block address of erasing operation */
050A ; }
050A ;
050A ; /********************************************************************************************************************
050A ; ** 函数名称: INT8U SD_EraseEndBlock() Name: INT8U SD_EraseEndBlock()
050A ; ** 功能描述: 设置块擦除终止地址 Function: select the end block address of erasing operation
050A ; ** 输 入: INT32U endblock: 块地址 Input: INT32U Length : block address
050A ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
050A ; *********************************************************************************************************************/
050A ; uint8 SD_EraseEndBlock(INT32U endblock)
050A ; {
050A ; return (SD_BlockCommand(CMD33, CMD33_R, endblock)); /* 发送擦除终止块地址 send the end block address of erasing operation */
050A ; }
050A ;
050A ; /********************************************************************************************************************
050A ; ** 函数名称: INT8U SD_EraseSelectedBlock() Name: INT8U SD_EraseSelectedBlock()
050A ; ** 功能描述: 擦除已选中的块 Function: erase block selected
050A ; ** 输 入: 无 Input: NULL
050A ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
050A ; *********************************************************************************************************************/
050A ; uint8 SD_EraseSelectedBlock(void)
050A ; {
050A ; uint8 param[4],resp,tmp;
050A ;
050A ; SD_PackParam(param, 0);
050A ;
050A ; tmp = SD_SendCmd(CMD38, param, CMD38_R, &resp); /* 擦除所选择的块 erase blocks selected */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -