📄 sdcmd.s
字号:
; if (ret != SD_NO_ERR) /* command that read the numbers of block written correctly */
; return ret;
;
; if (resp != 0)
; return SD_ERR_CMD_RESP; /* 响应错误 response is error */
;
; ret = SD_ReadBlockData(4, tmp); /* 读块数 read the numbvers of block */
; if (ret != SD_NO_ERR)
; return ret;
;
; *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];
; /* 转换为32位 change to 32 bits */
;
; return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
; }
; #endif
;
; /*********************************************************
;
; 下面为一些数据传输函数
;
; **********************************************************/
;
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadRegister() Name: INT8U SD_ReadRegister()
; ** 功能描述: 从SD卡读取数据 Function: read data from SD card
; ** 输 入: INT32U len : 长度 Input: INT32U len : length
; INT8U *recbuf: 接收缓冲区 INT8U *recbuf: receive buffer
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *********************************************************************************************************************/
; uint8 SD_ReadRegister(uint32 len, uint8 *recbuf)
; {
.dbline 539
; uint32 i = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 542
; uint8 resp;
;
; SPI_CS_Assert();
xcall _SPI_CS_Assert
L69:
.dbline 543
; do{ /* 等待数据起始令牌 wait for data start token */
.dbline 544
; resp = SPI_RecByte();
xcall _SPI_RecByte
mov R12,R16
.dbline 545
; i++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 546
L70:
.dbline 546
; }while((resp == 0xFF) && (i < SD_READREG_TIMEOUT));
mov R24,R12
cpi R24,255
brne L72
ldi R20,8
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L69
L72:
.dbline 548
;
; if (i >= SD_READREG_TIMEOUT)
ldi R20,8
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L73
.dbline 549
; {
.dbline 550
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 551
; return SD_ERR_TIMEOUT_READ; /* 超时, 返回错误 timeout, return error */
ldi R16,49
xjmp L68
L73:
.dbline 554
; }
;
; if (resp != SD_TOK_READ_STARTBLOCK)
mov R24,R12
cpi R24,254
breq L75
.dbline 555
; { /* 不是收到数据起始令牌 not receive data start token */
.dbline 556
; recbuf[0] = resp;
movw R30,R10
std z+0,R12
.dbline 557
; i = 1; /* 还有len - 1个字节要接收 still len - 1 bytes will be received */
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 558
; }
xjmp L80
L75:
.dbline 560
; else
; i = 0; /* 收到数据起始令牌,还有len个字节要接收 received data start token,still len bytes will be received */
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 562
;
; for (; i < len; i++)
xjmp L80
L77:
.dbline 563
xcall _SPI_RecByte
movw R30,R28
push R26
push R27
ldd R26,z+0
ldd R27,z+1
movw R30,R26
pop R27
pop R26
add R30,R10
adc R31,R11
std z+0,R16
L78:
.dbline 562
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
L80:
.dbline 562
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X4
xjmp L77
X4:
.dbline 565
; recbuf[i] = SPI_RecByte(); /* 接收数据 receive data */
;
; i = SPI_RecByte();
xcall _SPI_RecByte
mov R2,R16
clr R3
clr R4
clr R5
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 566
; i = (i << 8) + SPI_RecByte(); /* 读取16位CRC get 16-bit CRC */
xcall _SPI_RecByte
mov R2,R16
ldi R24,8
ldi R25,0
movw R30,R28
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R24
movw R16,R4
movw R18,R6
xcall lsl32
movw R4,R16
movw R6,R18
mov R20,R2
clr R21
clr R22
clr R23
add R4,R20
adc R5,R21
adc R6,R22
adc R7,R23
movw R30,R28
std z+0,R4
std z+1,R5
std z+2,R6
std z+3,R7
.dbline 569
;
; #if SD_CRC_EN
; if (i != SD_GetCRC16(recbuf, len))
movw R30,R28
ldd R18,z+12
ldd R19,z+13
movw R16,R10
xcall _SD_GetCRC16
movw R2,R16
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
breq L81
.dbline 570
; { /* CRC校验错误 CRC check is error */
.dbline 571
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 572
; SPI_SendByte(0xFF);
ldi R16,255
xcall _SPI_SendByte
.dbline 573
; return SD_ERR_DATA_CRC16; /* 返回RCR16错误 return error of CRC16 */
ldi R16,32
xjmp L68
L81:
.dbline 577
; }
; #endif
;
; SPI_SendByte(0xFF); /* 返回之前发送8个clock clock out 8 clk before return */
ldi R16,255
xcall _SPI_SendByte
.dbline 578
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 580
;
; return SD_NO_ERR;
clr R16
.dbline -2
L68:
adiw R28,4
xcall pop_gset4
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r resp 12 c
.dbsym l i 0 l
.dbsym r recbuf 10 pc
.dbsym l len 12 l
.dbend
.dbfunc e SD_ReadBlockData _SD_ReadBlockData fc
; tmp -> R12
; i -> y+0
; recbuf -> R10,R11
; len -> y+12
.even
_SD_ReadBlockData::
xcall push_arg4
xcall push_gset4
sbiw R28,4
ldd R10,y+16
ldd R11,y+17
.dbline -1
.dbline 591
; }
;
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_ReadBlockData() Name: INT8U SD_ReadBlockData()
; ** 功能描述: 从SD卡中读取数据块 Function: read block data from sd card
; ** 输 入: INT32U len : 长度 Input: INT32U len : length
; INT8U *recbuf : 接收缓冲区 INT8U *recbuf : the buffer of receive
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; *******************************************************************************************************************/
; uint8 SD_ReadBlockData(uint32 len, uint8 *recbuf)
; {
.dbline 593
; uint8 tmp;
; uint32 i = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 595
;
; SPI_CS_Assert();
xcall _SPI_CS_Assert
L84:
.dbline 597
; do
; { /* 等待接收数据开始令牌0xFE wait for receiving data start token 0xFE */
.dbline 598
; tmp = SPI_RecByte();
xcall _SPI_RecByte
mov R12,R16
.dbline 599
; i++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 600
L85:
.dbline 600
; }while((tmp == 0xFF) && (i < sds.timeout_read));
mov R24,R12
cpi R24,255
brne L88
lds R2,_sds+3
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L84
L88:
.dbline 602
;
; if (i >= sds.timeout_read)
lds R2,_sds+3
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L89
.dbline 603
; {
.dbline 604
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 605
; return SD_ERR_TIMEOUT_READ; /* 返回读超时错误码 return error timeout error code of reading */
ldi R16,49
xjmp L83
L89:
.dbline 608
; }
;
; if (tmp != SD_TOK_READ_STARTBLOCK) /* 块读开始令牌错误 read start block token is error */
mov R24,R12
cpi R24,254
breq L92
.dbline 609
; {
.dbline 610
; SPI_SendByte(0xFF);
ldi R16,255
xcall _SPI_SendByte
.dbline 611
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 612
; return SD_ERR_DATA_START_TOK;
ldi R16,33
xjmp L83
L92:
.dbline 615
; }
;
; for (i = 0; i < len; i++)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
xjmp L97
L94:
.dbline 616
xcall _SPI_RecByte
movw R30,R28
push R26
push R27
ldd R26,z+0
ldd R27,z+1
movw R30,R26
pop R27
pop R26
add R30,R10
adc R31,R11
std z+0,R16
L95:
.dbline 615
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
L97:
.dbline 615
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -