📄 sdcmd.s
字号:
brsh X5
xjmp L94
X5:
.dbline 618
; 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 619
; 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 622
;
; #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 L98
.dbline 623
; { /* CRC校验错误 CRC check is error */
.dbline 624
; SPI_SendByte(0xFF);
ldi R16,255
xcall _SPI_SendByte
.dbline 625
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 626
; return SD_ERR_DATA_CRC16; /* 返回CRC16错误 return error of CRC16 */
ldi R16,32
xjmp L83
L98:
.dbline 630
; }
; #endif
;
; SPI_SendByte(0xFF);
ldi R16,255
xcall _SPI_SendByte
.dbline 631
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 633
;
; return SD_NO_ERR; /* 返回函数执行成功 return function perform sucessfully */
clr R16
.dbline -2
L83:
adiw R28,4
xcall pop_gset4
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r tmp 12 c
.dbsym l i 0 l
.dbsym r recbuf 10 pc
.dbsym l len 12 l
.dbend
.dbfunc e SD_WriteBlockData _SD_WriteBlockData fc
; tmp -> R14
; i -> R10,R11
; sendbuf -> R12,R13
; len -> y+10
; bmulti -> R10
.even
_SD_WriteBlockData::
st -y,r19
st -y,r18
xcall push_gset5
mov R10,R16
ldd R12,y+14
ldd R13,y+15
.dbline -1
.dbline 645
; }
;
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_WriteBlockData() Name: INT8U SD_WriteBlockData()
; ** 功能描述: 向sd卡写数据块 Function: write block data to sd card
; ** 输 入: INT8U bmulti : 是否为多块操作1:是0:否 Input: INT8U bmulti : multi blocks operate 1:Y 0:N
; INT32U len : 长度 INT32U len : length
; INT8U *sendbuf: 发送缓冲区 INT8U *sendbuf : the buffer of send
; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
; ********************************************************************************************************************/
; uint8 SD_WriteBlockData(uint8 bmulti, uint32 len, uint8 *sendbuf)
; {
.dbline 649
; uint16 i;
; uint8 tmp;
;
; SPI_CS_Assert();
xcall _SPI_CS_Assert
.dbline 651
;
; SPI_SendByte(0xFF); /* 开始发送数据之前发送8个clock clock out 8 clk before start */
ldi R16,255
xcall _SPI_SendByte
.dbline 653
;
; if (bmulti == 1)
mov R24,R10
cpi R24,1
brne L101
.dbline 654
; SPI_SendByte(SD_TOK_WRITE_STARTBLOCK_M); /* 写多块开始令牌 start token of write multi blocks */
ldi R16,252
xcall _SPI_SendByte
xjmp L102
L101:
.dbline 656
; else
; SPI_SendByte(SD_TOK_WRITE_STARTBLOCK); /* 写单块开始令牌 start token of write single block */
ldi R16,254
xcall _SPI_SendByte
L102:
.dbline 658
;
; for (i = 0; i < len; i++)
clr R10
clr R11
xjmp L106
L103:
.dbline 659
movw R30,R10
add R30,R12
adc R31,R13
ldd R16,z+0
xcall _SPI_SendByte
L104:
.dbline 658
movw R24,R10
adiw R24,1
movw R10,R24
L106:
.dbline 658
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
movw R6,R10
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L103
.dbline 662
; SPI_SendByte(sendbuf[i]); /* 发送数据 send data */
;
; #if SD_CRC_EN
; i = SD_GetCRC16(sendbuf,len); /* 计算CRC16 calculate CRC16 */
movw R30,R28
ldd R18,z+10
ldd R19,z+11
movw R16,R12
xcall _SD_GetCRC16
movw R10,R16
.dbline 665
; #endif
;
; SPI_SendByte((i >> 8) & 0xFF);
mov R16,R17
clr R17
andi R17,0
xcall _SPI_SendByte
.dbline 666
; SPI_SendByte(i & 0xFF); /* 发送CRC16校验码 send CRC16 check code */
mov R16,R10
andi R17,0
xcall _SPI_SendByte
.dbline 668
;
; tmp = SPI_RecByte();
xcall _SPI_RecByte
mov R14,R16
.dbline 669
; if ((tmp & SD_RESP_DATA_MSK) != SD_RESP_DATA_ACCETPTED)
mov R24,R14
andi R24,15
cpi R24,5
breq L107
.dbline 670
; {
.dbline 671
; SPI_SendByte(0xFF); /* 返回之前发送8个clock clock out 8 clk before return */
ldi R16,255
xcall _SPI_SendByte
.dbline 672
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 673
; return SD_ERR_DATA_RESP; /* 数据响应错误 data response error */
ldi R16,34
xjmp L100
L107:
.dbline 676
; }
;
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline 678
;
; if (SD_WaitBusy(SD_WAIT_WRITE) != SD_NO_ERR)
ldi R16,1
xcall _SD_WaitBusy
tst R16
breq L109
.dbline 679
; return SD_ERR_TIMEOUT_WRITE; /* 写入超时 write time out */
ldi R16,50
xjmp L100
L109:
.dbline 681
; else
; return SD_NO_ERR; /* 写入正确 write right */
clr R16
.dbline -2
L100:
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r tmp 14 c
.dbsym r i 10 i
.dbsym r sendbuf 12 pc
.dbsym l len 10 l
.dbsym r bmulti 10 c
.dbend
.dbfunc e SD_StopMultiToken _SD_StopMultiToken fV
.even
_SD_StopMultiToken::
.dbline -1
.dbline 691
; }
;
; /*******************************************************************************************************************
; ** 函数名称: void SD_StopMultiToken() Name: void SD_StopMultiToken(void)
; ** 功能描述: 发送多块写停止令牌 Function: send the token that stop multiple block write
; ** 输 入: 无 Input: NULL
; ** 输 出: 无 Output: NULL
; ********************************************************************************************************************/
; void SD_StopMultiToken(void)
; {
.dbline 692
; SPI_CS_Assert();
xcall _SPI_CS_Assert
.dbline 694
;
; SPI_SendByte(0xFF); /* 先发送8个clock send 8 clock first */
ldi R16,255
xcall _SPI_SendByte
.dbline 695
; SPI_SendByte(SD_TOK_STOP_MULTI); /* 发送停止数据传输令牌 send stop transmission token */
ldi R16,253
xcall _SPI_SendByte
.dbline 696
; SPI_RecByte();
xcall _SPI_RecByte
.dbline 698
;
; SPI_CS_Deassert();
xcall _SPI_CS_Deassert
.dbline -2
L111:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SD_WaitBusy _SD_WaitBusy fc
; timeout -> y+4
; tmp -> R10
; i -> y+0
; waittype -> R10
.even
_SD_WaitBusy::
xcall push_gset3
mov R10,R16
sbiw R28,8
.dbline -1
.dbline 709
; }
;
;
; /********************************************************************************************************************
; ** 函数名称: void SD_WaitBusy() Name: void SD_WaitBusy()
; ** 功能描述: 查询SD卡是否处于忙状态 Function: poll SD Card wheather it is busy
; ** 输 入: INT32U waittype: 超时类型 Input: INT32U timeout: time out type
; ** 输 出: 0: 未超时 >0: 错误码 Output: 0: not time out > 0: error code
; *********************************************************************************************************************/
; uint8 SD_WaitBusy(uint8 waittype)
; {
.dbline 710
; uint32 timeout, 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 713
; uint8 tmp;
;
; if (waittype == SD_WAIT_WRITE)
mov R24,R10
cpi R24,1
brne L113
.dbline 714
; timeout = sds.timeout_write;
lds R2,_sds+4
clr R3
clr R4
clr R5
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
xjmp L114
L113:
.dbline 716
; else
; timeout = sds.timeout_erase;
lds R2,_sds+5
clr R3
clr R4
clr R5
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
L114:
.dbline 718
;
; SPI_CS_Assert();
xcall _SPI_CS_Assert
L117:
.dbline 720
; do
; { /* 等待忙结束 wait for being busy end */
.dbline 721
; tmp = SPI_RecByte();
xcall _SPI_RecByte
mov R10,R16
.dbline 722
; 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 723
L118:
.dbline 723
; }while ((tmp != 0xFF) && (i < timeout)); /* 忙时收到的值为0xFF always receive 0xFF when card is busy */
mov R24,R10
cpi R24,255
breq L120
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
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 L117
L120:
.dbline 724
; SPI_CS_Deassert(); /* 有错 */
xcall _SPI_CS_Deassert
.dbline 726
;
; if(i < timeout)
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
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 L121
.dbline 727
; return SD_NO_ERR; /* 返回0,表示没超时 return 0 indicate that operation is not time out */
clr R16
xjmp L112
L121:
.dbline 729
; else
; return SD_ERR_TIMEOUT_WAIT; /* 返回错误码,表示超时 return error code indicate that operation is time out */
ldi R16,48
.dbline -2
L112:
adiw R28,8
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l timeout 4 l
.dbsym r tmp 10 c
.dbsym l i 0 l
.dbsym r waittype 10 c
.dbend
.dbfunc e SD_SPIDelay _SD_SPIDelay fV
; i -> R20
; value -> R22
.even
_SD_SPIDelay::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 739
; }
;
; /********************************************************************************************************************
; ** 函数名称: void SD_SPIDelay() Name: void SD_SPIDelay()
; ** 功能描述: SPI总线延时 Function: SPI Bus delay
; ** 输 入: INT8U value: 延时值,不超过255 Input: INT8U value : delay value,do not beyond 255
; ** 输 出: 无 Output: NULL
; *********************************************************************************************************************/
; void SD_SPIDelay(uint8 value)
; {
.dbline 742
; uint8 i;
;
; for (i = 0; i < value; i++)
clr R20
xjmp L127
L124:
.dbline 743
ldi R16,255
xcall _SPI_SendByte
L125:
.dbline 742
inc R20
L127:
.dbline 742
cp R20,R22
brlo L124
.dbline -2
L123:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r value 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -