📄 sdcmd.s
字号:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym l blockaddr 4 l
.dbend
.dbfunc e SD_ReadMultipleBlock _SD_ReadMultipleBlock fc
; blockaddr -> y+4
.even
_SD_ReadMultipleBlock::
xcall push_arg4
sbiw R28,4
.dbline -1
.dbline 250
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadMultipleBlock() Name: INT8U SD_ReadMultipleBlock()
; ** 功能描述: 读多块命令 Function: read multiple block command
; ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_ReadMultipleBlock(uint32 blockaddr)
; {
.dbline 251
; return (SD_BlockCommand(CMD18, CMD18_R, blockaddr)); /* 读多块命令 command that read multiple block */
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
ldi R18,1
ldi R16,18
xcall _SD_BlockCommand
.dbline -2
L46:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym l blockaddr 4 l
.dbend
.dbfunc e SD_WriteSingleBlock _SD_WriteSingleBlock fc
; blockaddr -> y+4
.even
_SD_WriteSingleBlock::
xcall push_arg4
sbiw R28,4
.dbline -1
.dbline 261
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_WriteSingleBlock() Name: INT8U SD_WriteSingleBlock()
; ** 功能描述: 写单块命令 Function: write single block command
; ** 输 入: INT32U blockaddr: block address Input: INT32U blockaddr: block address
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_WriteSingleBlock(uint32 blockaddr)
; {
.dbline 262
; return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
ldi R18,1
ldi R16,24
xcall _SD_BlockCommand
.dbline -2
L47:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym l blockaddr 4 l
.dbend
.dbfunc e SD_WriteMultipleBlock _SD_WriteMultipleBlock fc
; blockaddr -> y+4
.even
_SD_WriteMultipleBlock::
xcall push_arg4
sbiw R28,4
.dbline -1
.dbline 272
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_WriteMultipleBlock() Name: INT8U SD_WriteMultipleBlock()
; ** 功能描述: 写多块命令 Function: write multiple block command
; ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: block address
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_WriteMultipleBlock(uint32 blockaddr)
; {
.dbline 273
; return (SD_BlockCommand(CMD25, CMD25_R, blockaddr)); /* 写多块命令 command that write multiple block */
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
ldi R18,1
ldi R16,25
xcall _SD_BlockCommand
.dbline -2
L48:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym l blockaddr 4 l
.dbend
.area lit(rom, con, rel)
L50:
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile D:\new_sd\SD\SD\sdcmd.c
.dbfunc e SD_ReadOCR _SD_ReadOCR fc
; param -> y+9
; resp -> y+4
; tmp -> R20
; recbuf -> R22,R23
; ocrlen -> R20
.even
_SD_ReadOCR::
xcall push_gset2
movw R22,R18
mov R20,R16
sbiw R28,13
.dbline -1
.dbline 384
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ProgramCSD() Name: INT8U SD_ProgramCSD()
; ** 功能描述: 写CSD寄存器 Function: write CSD register
; ** 输 入: INT8U *buff : CSD寄存器内容 Input: INT8U *buff : the content of CSD register
; INT8U len : CSD寄存器长度 INT8U len : the length of CSD register
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; ********************************************************************************************************************/
; #if SD_ProgramCSD_EN
; uint8 SD_ProgramCSD(uint8 len, uint8 *buff)
; {
; uint8 param[4] = {0,0,0,0},resp,ret;
;
; if (len != 16) return SD_ERR_USER_PARAM;
;
; ret = SD_SendCmd(CMD27, param, CMD27_R, &resp); /* 发送写CSD寄存器命令 send command that write CSD */
; if (ret != SD_NO_ERR)
; return ret;
;
; if (resp != 0)
; return SD_ERR_CMD_RESP;
;
; buff[15] = (SD_GetCRC7(buff, 15) << 1) + 0x01; /* 计算CSD中的crc 位域 calculate crc field in CSD */
;
; return(SD_WriteBlockData(0, 16, buff));
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_GetCRC7() Name: INT8U SD_GetCRC7()
; ** 功能描述: 计算CRC7 Function: calculate crc7
; ** 输 入: INT8U *pSource: 数据 Input: INT8U *pSource: data
; INT16U len : 数据长度 INT16U len : data length
; ** 输 出: CRC7码 Output: CRC7 code
; *********************************************************************************************************************/
; uint8 SD_GetCRC7(INT8U *pSource, INT16U len)
; {
; uint8 i = 0, j;
; uint8 reg = 0;
;
; do
; {
; for (j = 0; j < 8; j++)
; {
; reg <<= 1;
; reg ^= ((((pSource[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
; }
;
; i++;
;
; }while(i < len);
;
; return reg;
; }
; #endif
;
; #if SD_EraseBlock_EN
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_EraseStartBlock() Name: INT8U SD_EraseStartBlock()
; ** 功能描述: 设置块擦除起始地址 Function: select the start block address of erasing operation
; ** 输 入: INT32U startblock: 块地址 Input: INT32U startblock : block address
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_EraseStartBlock(INT32U startblock)
; {
; return (SD_BlockCommand(CMD32, CMD32_R, startblock)); /* 发送擦除起始块地址 send the start block address of erasing operation */
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_EraseEndBlock() Name: INT8U SD_EraseEndBlock()
; ** 功能描述: 设置块擦除终止地址 Function: select the end block address of erasing operation
; ** 输 入: INT32U endblock: 块地址 Input: INT32U Length : block address
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_EraseEndBlock(INT32U endblock)
; {
; return (SD_BlockCommand(CMD33, CMD33_R, endblock)); /* 发送擦除终止块地址 send the end block address of erasing operation */
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_EraseSelectedBlock() Name: INT8U SD_EraseSelectedBlock()
; ** 功能描述: 擦除已选中的块 Function: erase block selected
; ** 输 入: 无 Input: NULL
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_EraseSelectedBlock(void)
; {
; uint8 param[4],resp,tmp;
;
; SD_PackParam(param, 0);
;
; tmp = SD_SendCmd(CMD38, param, CMD38_R, &resp); /* 擦除所选择的块 erase blocks selected */
; if (tmp != SD_NO_ERR)
; return tmp;
;
; if (SD_WaitBusy(SD_WAIT_ERASE) != SD_NO_ERR) /* 等待擦除完成 wait for finishing erasing */
; return SD_ERR_TIMEOUT_ERASE;
; else
; return SD_NO_ERR;
; }
; #endif
;
; /*********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadOCR() Name: INT8U SD_ReadOCR()
; ** 功能描述: 读操作条件寄存器OCR Function: read OCR register of sd card
; ** 输 入: INT8U ocrlen : 寄存器长度(固定为4) Input: INT8U ocrlen : len of register (fixed,is 4)
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; **********************************************************************************************************************/
; uint8 SD_ReadOCR(uint8 ocrlen, uint8 *recbuf) /////
; {
.dbline 385
; uint8 param[4] = {0,0,0,0},resp[5],tmp;
ldi R24,<L50
ldi R25,>L50
movw R30,R28
adiw R30,9
ldi R16,4
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 387
;
; tmp = SD_SendCmd(CMD58, param, CMD58_R, resp); /* 读 OCR 寄存器命令 */
movw R24,R28
adiw R24,4
std y+3,R25
std y+2,R24
ldi R24,4
std y+0,R24
movw R18,R28
subi R18,247 ; offset = 9
sbci R19,255
ldi R16,58
xcall _SD_SendCmd
mov R20,R16
.dbline 388
; if (tmp != SD_NO_ERR) /* read OCR register command */
tst R16
breq L51
.dbline 389
; return tmp;
xjmp L49
L51:
.dbline 391
;
; if (resp[0] != 0)
ldd R2,y+4
tst R2
breq L53
.dbline 392
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
ldi R16,18
xjmp L49
L53:
.dbline 394
;
; for (tmp = 0; tmp < 4; tmp++)
clr R20
xjmp L58
L55:
.dbline 395
movw R24,R28
adiw R24,5
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
mov R30,R20
clr R31
add R30,R22
adc R31,R23
std z+0,R2
L56:
.dbline 394
inc R20
L58:
.dbline 394
cpi R20,4
brlo L55
.dbline 397
; recbuf[tmp] = resp[tmp + 1]; /* 复制OCR寄存器内容到接收缓冲区 */
;
; return SD_NO_ERR;
clr R16
.dbline -2
L49:
adiw R28,13
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l param 9 A[4:4]c
.dbsym l resp 4 A[5:5]c
.dbsym r tmp 20 c
.dbsym r recbuf 22 pc
.dbsym r ocrlen 20 c
.dbend
.dbfunc e SD_EnableCRC _SD_EnableCRC fc
; resp -> y+8
; param -> y+4
; ret -> R20
; bEnable -> R20
.even
_SD_EnableCRC::
xcall push_gset1
mov R20,R16
sbiw R28,9
.dbline -1
.dbline 408
; }
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_EnableCRC() Name: INT8U SD_EnableCRC()
; ** 功能描述: 使能SD卡的CRC校验功能 Function: enable crc check of SD Card
; ** 输 入: INT8U bEnable : 1:使能 0:禁止 Input: INT8U bEnable : 1:enable 0: disable
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; #if SD_CRC_EN
; uint8 SD_EnableCRC(uint8 bEnable)
; {
.dbline 411
; uint8 param[4],resp,ret;
;
; if (bEnable == 1)
cpi R20,1
brne L61
.dbline 412
; param[0] = 1; /* 使能crc enable crc */
ldi R24,1
std y+4,R24
xjmp L62
L61:
.dbline 414
; else
; param[1] = 0; /* 禁止crc disalbe crc */
clr R2
std y+5,R2
L62:
.dbline 416
;
; ret = SD_SendCmd(CMD59, param, CMD59_R, &resp); /* "使能/禁止CRC"命令 enable/disable crc command */
movw R24,R28
adiw R24,8
std y+3,R25
std y+2,R24
ldi R24,1
std y+0,R24
movw R18,R28
subi R18,252 ; offset = 4
sbci R19,255
ldi R16,59
xcall _SD_SendCmd
mov R20,R16
.dbline 417
; if (ret != SD_NO_ERR)
tst R16
breq L64
.dbline 418
; return ret;
xjmp L60
L64:
.dbline 420
;
; if (resp != 0)
ldd R2,y+8
tst R2
breq L66
.dbline 421
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
ldi R16,18
xjmp L60
L66:
.dbline 423
;
; return SD_NO_ERR;
clr R16
.dbline -2
L60:
adiw R28,9
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l resp 8 c
.dbsym l param 4 A[4:4]c
.dbsym r ret 20 c
.dbsym r bEnable 20 c
.dbend
.dbfunc e SD_ReadRegister _SD_ReadRegister fc
; resp -> R12
; i -> y+0
; recbuf -> R10,R11
; len -> y+12
.even
_SD_ReadRegister::
xcall push_arg4
xcall push_gset4
sbiw R28,4
ldd R10,y+16
ldd R11,y+17
.dbline -1
.dbline 538
;
; }
; #endif
;
; /*********************************************************************************************************************
; ** 函数名称: INT8U SD_Read_SD_Status() Name: INT8U SD_Read_SD_Status()
; ** 功能描述: 读SD卡的 SD_Status 寄存器 Function: read SD_Status register of sd card
; ** 输 入: INT8U sdslen : 寄存器长度(固定为64) Input: INT8U sdslen: len of register (fixed,is 64)
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf: recbuffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; **********************************************************************************************************************/
; #if SD_ReadSD_Status_EN
; uint8 SD_ReadSD_Status(uint8 sdslen, uint8 *recbuf)
; {
; uint8 param[4] = {0,0,0,0},resp[2],ret;
;
; ret = SD_SendCmd(CMD55, param, CMD55_R, resp); /* 后续命令为一个应用命令 */
; if (ret != SD_NO_ERR)
; return ret; /* command that the followed commnad is a specific application */
;
; if (resp[0] != 0)
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
;
; ret = SD_SendCmd(ACMD13, param, ACMD13_R, resp); /* 读 SD_Status 命令 */
; if (ret != SD_NO_ERR)
; return ret; /* command that read SD_Status register */
;
; if ((resp[0] != 0) || (resp[1] != 0))
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
;
; return (SD_ReadBlockData(sdslen, recbuf)); /* 读出寄存器内容 read the content of the register */
; }
; #endif
;
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_ReadSCR() Name: INT8U SD_ReadSCR()
; ** 功能描述: 读SD卡的 SCR 寄存器 Function: read SCR register of sd card
; ** 输 入: INT8U scrlen : 寄存器长度(固定为8) Input: INT8U scrlen : len of register (fixed,is 8)
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; ********************************************************************************************************************/
; #if SD_ReadSCR_EN
; uint8 SD_ReadSCR(uint8 scrlen, uint8 *recbuf)
; {
; uint8 param[4] = {0,0,0,0},resp,ret;
;
; ret = SD_SendCmd(CMD55, param, CMD55_R, &resp); /* 后续命令为一个应用命令 */
; if (ret != SD_NO_ERR) /* command that the followed commnad is a specific application */
; return ret;
;
; if (resp != 0)
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
;
; ret = SD_SendCmd(ACMD51, param, ACMD51_R, &resp); /* 发送读 SD_Status 命令*/
; if (ret != SD_NO_ERR) /* command that read SD_Status register */
; return ret;
;
; if (resp != 0)
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
;
; return (SD_ReadBlockData(scrlen, recbuf)); /* 读出寄存器内容 read the content of the register */
; }
; #endif
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_GetNumWRBlcoks() Name: INT8U SD_GetNumWRBlcoks()
; ** 功能描述: 得到正确写入的块数 Function: get the block numbers that written correctly
; ** 输 入: INT32U *blocknum: 返回的块数 Input: INT32U blocknum : the block numbers returned
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; #if SD_WriteMultiBlock_EN
; uint8 SD_GetNumWRBlcoks(uint32 *blocknum)
; {
; uint8 tmp[4] = {0,0,0,0},resp,ret;
;
; ret = SD_SendCmd(CMD55, tmp, CMD55_R, &resp); /* 后续命令为一个应用命令 */
; if (ret != SD_NO_ERR) /* command that the followed commnad is a specific application */
; return ret;
;
; if (resp != 0)
; return SD_ERR_CMD_RESP;
;
; ret = SD_SendCmd(ACMD22, tmp, ACMD22_R, &resp); /* 读取正确写入的块数命令 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -