sd_cmd.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,454 行 · 第 1/5 页
LIS
1,454 行
0556 CE01 movw R24,R28
0558 0896 adiw R24,8
055A 9B83 std y+3,R25
055C 8A83 std y+2,R24
055E 82E0 ldi R24,2
0560 8883 std y+0,R24
0562 9E01 movw R18,R28
0564 2C5F subi R18,252 ; offset = 4
0566 3F4F sbci R19,255
0568 06E2 ldi R16,38
056A 4ADD xcall _SD_SendCmd
056C A02E mov R10,R16
056E ; /* 擦除所选择的块 erase blocks selected */
056E ; if(tmp!=SD_NO_ERR)
056E 0023 tst R16
0570 09F0 breq L52
0572 ; return tmp ;
0572 07C0 xjmp L51
0574 L52:
0574 ;
0574 ; /* 等待擦除完成 wait for finishing erasing */
0574 ; if(SD_WaitBusy(SD_WAIT_ERASE)!=SD_NO_ERR)
0574 02E0 ldi R16,2
0576 34D2 xcall _SD_WaitBusy
0578 0023 tst R16
057A 11F0 breq L54
057C ; return SD_ERR_TIMEOUT_ERASE ;
057C 03E3 ldi R16,51
057E 01C0 xjmp L51
0580 L54:
0580 ; else
0580 ; return SD_NO_ERR ;
0580 0027 clr R16
0582 L51:
0582 2996 adiw R28,9
0584 0E940000 xcall pop_gset3
0588 .dbline 0 ; func end
0588 0895 ret
.area lit(rom, con, rel)
0010 L57:
0010 0000 .byte 0,0
0012 0000 .byte 0,0
.area text(rom, con, rel)
; param -> y+9
; resp -> y+4
; tmp -> R20
; recbuf -> R22,R23
; ocrlen -> R20
.even
058A _SD_ReadOCR::
058A 0E940000 xcall push_gset2
058E B901 movw R22,R18
0590 402F mov R20,R16
0592 2D97 sbiw R28,13
0594 ; }
0594 ; #endif
0594 ;
0594 ; /******************************************************************************
0594 ; ** 函数名称: INT8U SD_ReadOCR()
0594 ; ** 功能描述: 读操作条件寄存器OCR
0594 ; ** 输 入: INT8U ocrlen : 寄存器长度(固定为4)
0594 ; INT8U *recbuf : 接收缓冲区
0594 ; ** 输 出: 0: 正确 >0: 错误码
0594 ; *******************************************************************************/
0594 ; INT8U SD_ReadOCR(INT8U ocrlen,INT8U *recbuf)
0594 ; {
0594 ; INT8U param[4]={0,0,0,0},resp[5],tmp ;
0594 80E0 ldi R24,<L57
0596 90E0 ldi R25,>L57
0598 FE01 movw R30,R28
059A 3996 adiw R30,9
059C 04E0 ldi R16,4
059E 10E0 ldi R17,0
05A0 FA93 st -y,R31
05A2 EA93 st -y,R30
05A4 9A93 st -y,R25
05A6 8A93 st -y,R24
05A8 0E940000 xcall asgncblk
05AC ;
05AC ; ocrlen=ocrlen;
05AC ; tmp=SD_SendCmd(CMD58,param,CMD58_R,resp);
05AC CE01 movw R24,R28
05AE 0496 adiw R24,4
05B0 9B83 std y+3,R25
05B2 8A83 std y+2,R24
05B4 84E0 ldi R24,4
05B6 8883 std y+0,R24
05B8 9E01 movw R18,R28
05BA 275F subi R18,247 ; offset = 9
05BC 3F4F sbci R19,255
05BE 0AE3 ldi R16,58
05C0 1FDD xcall _SD_SendCmd
05C2 402F mov R20,R16
05C4 ; /* 读 OCR 寄存器命令 */
05C4 ; /* read OCR register command */
05C4 ; if(tmp!=SD_NO_ERR)
05C4 0023 tst R16
05C6 09F0 breq L58
05C8 ; return tmp ;
05C8 17C0 xjmp L56
05CA L58:
05CA ;
05CA ; if(resp[0]!=0)
05CA 2C80 ldd R2,y+4
05CC 2220 tst R2
05CE 11F0 breq L60
05D0 ; return SD_ERR_CMD_RESP ;
05D0 02E1 ldi R16,18
05D2 12C0 xjmp L56
05D4 L60:
05D4 ; /* 响应错误 response is error */
05D4 ;
05D4 ; for(tmp=0;tmp<4;tmp++)
05D4 4427 clr R20
05D6 0DC0 xjmp L65
05D8 L62:
05D8 CE01 movw R24,R28
05DA 0596 adiw R24,5
05DC E42F mov R30,R20
05DE FF27 clr R31
05E0 E80F add R30,R24
05E2 F91F adc R31,R25
05E4 2080 ldd R2,z+0
05E6 E42F mov R30,R20
05E8 FF27 clr R31
05EA E60F add R30,R22
05EC F71F adc R31,R23
05EE 2082 std z+0,R2
05F0 L63:
05F0 4395 inc R20
05F2 L65:
05F2 4430 cpi R20,4
05F4 88F3 brlo L62
05F6 ; recbuf[tmp]=resp[tmp+1];/* 复制OCR寄存器内容到接收缓冲区 */
05F6 ;
05F6 ; return SD_NO_ERR ;
05F6 0027 clr R16
05F8 L56:
05F8 2D96 adiw R28,13
05FA 0E940000 xcall pop_gset2
05FE .dbline 0 ; func end
05FE 0895 ret
0600 ; resp -> R12
0600 ; i -> y+0
0600 ; recbuf -> R10,R11
0600 ; len -> y+12
.even
0600 _SD_ReadRegister::
0600 0E940000 xcall push_arg4
0604 0E940000 xcall push_gset4
0608 2497 sbiw R28,4
060A A888 ldd R10,y+16
060C B988 ldd R11,y+17
060E ; }
060E ;
060E ; /*******************************************************************************
060E ; ** 函数名称: INT8U SD_EnableCRC()
060E ; ** 功能描述: 使能SD卡的CRC校验功能
060E ; ** 输 入: INT8U bEnable : 1:使能 0:禁止
060E ; ** 输 出: 0: 正确 >0: 错误码
060E ; *******************************************************************************/
060E ; #if SD_CRC_EN
060E ; INT8U SD_EnableCRC(INT8U bEnable)
060E ; {
060E ; INT8U param[4],resp,ret ;
060E ;
060E ; if(bEnable==1)
060E ; param[0]=1 ;/* 使能crc enable crc */
060E ; else
060E ; param[1]=0 ;/* 禁止crc disalbe crc */
060E ;
060E ; ret=SD_SendCmd(CMD59,param,CMD59_R,&resp);
060E ; /* "使能/禁止CRC"命令 enable/disable crc command */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ;
060E ; if(resp!=0)
060E ; return SD_ERR_CMD_RESP ;/* 响应错误 response is error */
060E ;
060E ; return SD_NO_ERR ;
060E ; }
060E ; #endif
060E ;
060E ; /*******************************************************************************
060E ; ** 函数名称: INT8U SD_Read_SD_Status()
060E ; ** 功能描述: 读SD卡的 SD_Status 寄存器
060E ; ** 输 入: INT8U sdslen: 寄存器长度(固定为64)
060E ; INT8U *recbuf : 接收缓冲区
060E ; ** 输 出: 0: 正确 >0: 错误码
060E ; *******************************************************************************/
060E ; #if SD_ReadSD_Status_EN
060E ; INT8U SD_ReadSD_Status(INT8U sdslen,INT8U *recbuf)
060E ; {
060E ; INT8U param[4]={0,0,0,0},resp[2],ret ;
060E ;
060E ; ret=SD_SendCmd(CMD55,param,CMD55_R,resp);
060E ; /* 后续命令为一个应用命令 */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ; /* command that the followed commnad is a specific application */
060E ;
060E ; if(resp[0]!=0)
060E ; return SD_ERR_CMD_RESP ;
060E ; /* 响应错误 response is error */
060E ;
060E ; ret=SD_SendCmd(ACMD13,param,ACMD13_R,resp);
060E ; /* 读 SD_Status 命令 */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ; /* command that read SD_Status register */
060E ;
060E ; if((resp[0]!=0)||(resp[1]!=0))
060E ; return SD_ERR_CMD_RESP ;/* 响应错误 response is error */
060E ;
060E ; return(SD_ReadBlockData(sdslen,recbuf));
060E ; /* 读出寄存器内容 read the content of the register */
060E ; }
060E ; #endif
060E ;
060E ; /*******************************************************************************
060E ; ** 函数名称: INT8U SD_ReadSCR()
060E ; ** 功能描述: 读SD卡的 SCR 寄存器
060E ; ** 输 入: INT8U scrlen : 寄存器长度(固定为8)
060E ; INT8U *recbuf : 接收缓冲区
060E ; ** 输 出: 0: 正确 >0: 错误码
060E ; *******************************************************************************/
060E ; #if SD_ReadSCR_EN
060E ; INT8U SD_ReadSCR(INT8U scrlen,INT8U *recbuf)
060E ; {
060E ; INT8U param[4]={0,0,0,0},resp,ret ;
060E ;
060E ; ret=SD_SendCmd(CMD55,param,CMD55_R,&resp);
060E ; /* 后续命令为一个应用命令 */
060E ; /* command that the followed commnad is a specific application */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ;
060E ; if(resp!=0)
060E ; return SD_ERR_CMD_RESP ;
060E ; /* 响应错误 response is error */
060E ;
060E ; ret=SD_SendCmd(ACMD51,param,ACMD51_R,&resp);
060E ; /* 发送读 SD_Status 命令*/
060E ; /* command that read SD_Status register */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ;
060E ; if(resp!=0)
060E ; return SD_ERR_CMD_RESP ;
060E ; /* 响应错误 response is error */
060E ;
060E ; return(SD_ReadBlockData(scrlen,recbuf));
060E ; /* 读出寄存器内容 read the content of the register */
060E ; }
060E ; #endif
060E ;
060E ; /*******************************************************************************
060E ; ** 函数名称: INT8U SD_GetNumWRBlcoks()
060E ; ** 功能描述: 得到正确写入的块数
060E ; ** 输 入: INT32U *blocknum: 返回的块数
060E ; ** 输 出: 0: 正确 >0: 错误码
060E ; *******************************************************************************/
060E ; #if SD_WriteMultiBlock_EN
060E ; INT8U SD_GetNumWRBlcoks(INT32U *blocknum)
060E ; {
060E ; INT8U tmp[4]={0,0,0,0},resp,ret ;
060E ;
060E ; ret=SD_SendCmd(CMD55,tmp,CMD55_R,&resp);
060E ; /* 后续命令为一个应用命令 */
060E ; /* command that the followed commnad is a specific application */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ;
060E ; if(resp!=0)
060E ; return SD_ERR_CMD_RESP ;
060E ;
060E ; ret=SD_SendCmd(ACMD22,tmp,ACMD22_R,&resp);
060E ; /* 读取正确写入的块数命令 */
060E ; /* command that read the numbers of block written correctly */
060E ; if(ret!=SD_NO_ERR)
060E ; return ret ;
060E ;
060E ; if(resp!=0)
060E ; return SD_ERR_CMD_RESP ;
060E ; /* 响应错误 response is error */
060E ;
060E ; ret=SD_ReadBlockData(4,tmp);
060E ; /* 读块数 read the numbvers of block */
060E ; if(ret!=SD_NO_ERR)
060E ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?