sd_cmd.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,454 行 · 第 1/5 页
LIS
1,454 行
.module SD_Cmd.c
.area text(rom, con, rel)
; rlen -> y+4
; tmp -> R12
; i -> y+0
; resp -> R10,R11
; resptype -> R12
; param -> y+18
; cmd -> R14
.even
0000 _SD_SendCmd::
0000 3A93 st -y,r19
0002 2A93 st -y,r18
0004 0E940000 xcall push_gset5
0008 E02E mov R14,R16
000A 2897 sbiw R28,8
000C CC88 ldd R12,y+20
000E AE88 ldd R10,y+22
0010 BF88 ldd R11,y+23
0012 ; /*--------------File Info-------------------------------------------------------
0012 ; ** 文 件 名: SD_Cmd.c
0012 ; ** 最后修改日期: 2008.3.28
0012 ; ** 版 本: V1.0
0012 ; ** 描 述: sd 卡驱动软件包: SD卡物理层
0012 ; **------------------------------------------------------------------------------
0012 ; ** Created by:
0012 ; ** Created date:
0012 ; *******************************************************************************/
0012 ;
0012 ; #include "SYS_Config.h"
0012 ; #include "SD_Config.h"
0012 ; #include "SD_Hal.h"
0012 ; #include "SD_CRC.h"
0012 ; #include "SD_Cmd.h"
0012 ; #include "SD_Drive.h"
0012 ;
0012 ; /*******************************************************************************
0012 ; ** 函数名称: INT8U SD_SendCmd()
0012 ; ** 功能描述: 向卡发送命令,并取得响应
0012 ; ** 输 入: INT8U cmd : 命令字
0012 ; INT8U *param : 命令参数,长度为4字节
0012 ; INT8U resptype : 响应类型
0012 ; INT8U *resp : 响应,长度为1-5字节
0012 ; ** 输 出: 0: 正确 >0: 错误码
0012 ; *******************************************************************************/
0012 ; INT8U SD_SendCmd(INT8U cmd,INT8U *param,INT8U resptype,INT8U *resp)
0012 ; {
0012 ; INT32S i,rlen ;
0012 ; INT8U tmp ;
0012 ;
0012 ; SPI_CS_Assert();
0012 0E940000 xcall _SPI_CS_Assert
0016 ;
0016 ; SPI_SendByte((cmd&0x3F)|0x40);
0016 0E2D mov R16,R14
0018 0F73 andi R16,63
001A 0064 ori R16,64
001C 0E940000 xcall _SPI_SendByte
0020 ; /* 发送命令头和命令字 send command header and word */
0020 ;
0020 ; for(i=3;i>=0;i--)
0020 43E0 ldi R20,3
0022 50E0 ldi R21,0
0024 60E0 ldi R22,0
0026 70E0 ldi R23,0
0028 FE01 movw R30,R28
002A 4083 std z+0,R20
002C 5183 std z+1,R21
002E 6283 std z+2,R22
0030 7383 std z+3,R23
0032 L2:
0032 FE01 movw R30,R28
0034 AF93 push R26
0036 BF93 push R27
0038 A081 ldd R26,z+0
003A B181 ldd R27,z+1
003C FD01 movw R30,R26
003E BF91 pop R27
0040 AF91 pop R26
0042 0A88 ldd R0,y+18
0044 1B88 ldd R1,y+19
0046 E00D add R30,R0
0048 F11D adc R31,R1
004A 0081 ldd R16,z+0
004C 0E940000 xcall _SPI_SendByte
0050 L3:
0050 41E0 ldi R20,1
0052 50E0 ldi R21,0
0054 60E0 ldi R22,0
0056 70E0 ldi R23,0
0058 FE01 movw R30,R28
005A 2080 ldd R2,z+0
005C 3180 ldd R3,z+1
005E 4280 ldd R4,z+2
0060 5380 ldd R5,z+3
0062 241A sub R2,R20
0064 350A sbc R3,R21
0066 460A sbc R4,R22
0068 570A sbc R5,R23
006A FE01 movw R30,R28
006C 2082 std z+0,R2
006E 3182 std z+1,R3
0070 4282 std z+2,R4
0072 5382 std z+3,R5
0074 40E0 ldi R20,0
0076 50E0 ldi R21,0
0078 60E0 ldi R22,0
007A 70E0 ldi R23,0
007C FE01 movw R30,R28
007E 2080 ldd R2,z+0
0080 3180 ldd R3,z+1
0082 4280 ldd R4,z+2
0084 5380 ldd R5,z+3
0086 2416 cp R2,R20
0088 3506 cpc R3,R21
008A 4606 cpc R4,R22
008C 5706 cpc R5,R23
008E 0CF0 brlt X2
0090 D0CF xjmp L2
0092 X2:
0092 ; SPI_SendByte(param[i]);
0092 ; /* 发送参数 send parameters */
0092 ;
0092 ; #if SD_CRC_EN
0092 ; tmp=SD_GetCmdByte6((cmd&0x3F)|0x40,param);
0092 ; SPI_SendByte(tmp);
0092 ; #else
0092 ; SPI_SendByte(0x95);
0092 05E9 ldi R16,149
0094 0E940000 xcall _SPI_SendByte
0098 ; /* CRC校验码,只用于第1个命令 CRC,only used for the first command */
0098 ; #endif
0098 ;
0098 ; rlen=0 ;
0098 40E0 ldi R20,0
009A 50E0 ldi R21,0
009C 60E0 ldi R22,0
009E 70E0 ldi R23,0
00A0 FE01 movw R30,R28
00A2 4483 std z+4,R20
00A4 5583 std z+5,R21
00A6 6683 std z+6,R22
00A8 7783 std z+7,R23
00AA ; /* 根据不同的命令,得到不同的响应长度 */
00AA ; switch(resptype)
00AA EC2C mov R14,R12
00AC FF24 clr R15
00AE C701 movw R24,R14
00B0 8130 cpi R24,1
00B2 E0E0 ldi R30,0
00B4 9E07 cpc R25,R30
00B6 69F0 breq L9
00B8 8230 cpi R24,2
00BA E0E0 ldi R30,0
00BC 9E07 cpc R25,R30
00BE 49F0 breq L9
00C0 8330 cpi R24,3
00C2 E0E0 ldi R30,0
00C4 9E07 cpc R25,R30
00C6 79F0 breq L10
00C8 8430 cpi R24,4
00CA E0E0 ldi R30,0
00CC 9E07 cpc R25,R30
00CE A9F0 breq L11
00D0 1EC0 xjmp L6
00D2 X0:
00D2 ; {
00D2 L9:
00D2 ; case R1 :
00D2 ; case R1B:rlen=1 ;break ;
00D2 41E0 ldi R20,1
00D4 50E0 ldi R21,0
00D6 60E0 ldi R22,0
00D8 70E0 ldi R23,0
00DA FE01 movw R30,R28
00DC 4483 std z+4,R20
00DE 5583 std z+5,R21
00E0 6683 std z+6,R22
00E2 7783 std z+7,R23
00E4 1BC0 xjmp L7
00E6 L10:
00E6 ; case R2 :rlen=2 ;break ;
00E6 42E0 ldi R20,2
00E8 50E0 ldi R21,0
00EA 60E0 ldi R22,0
00EC 70E0 ldi R23,0
00EE FE01 movw R30,R28
00F0 4483 std z+4,R20
00F2 5583 std z+5,R21
00F4 6683 std z+6,R22
00F6 7783 std z+7,R23
00F8 11C0 xjmp L7
00FA L11:
00FA ; case R3 :rlen=5 ;break ;
00FA 45E0 ldi R20,5
00FC 50E0 ldi R21,0
00FE 60E0 ldi R22,0
0100 70E0 ldi R23,0
0102 FE01 movw R30,R28
0104 4483 std z+4,R20
0106 5583 std z+5,R21
0108 6683 std z+6,R22
010A 7783 std z+7,R23
010C 07C0 xjmp L7
010E L6:
010E ; default :
010E ; SPI_SendByte(0xFF);
010E 0FEF ldi R16,255
0110 0E940000 xcall _SPI_SendByte
0114 ; SPI_CS_Deassert();
0114 0E940000 xcall _SPI_CS_Deassert
0118 ; return SD_ERR_CMD_RESPTYPE ; // 返回命令响应类型错误
0118 00E1 ldi R16,16
011A 85C0 xjmp L1
011C X1:
011C ; break ;
011C L7:
011C ; }
011C ;
011C ; i=0 ;
011C 40E0 ldi R20,0
011E 50E0 ldi R21,0
0120 60E0 ldi R22,0
0122 70E0 ldi R23,0
0124 FE01 movw R30,R28
0126 4083 std z+0,R20
0128 5183 std z+1,R21
012A 6283 std z+2,R22
012C 7383 std z+3,R23
012E L12:
012E ; /* 等待响应,响应的开始位为0 */
012E ; do
012E ; {
012E ; /* Wait for a response,a response is a start bit(zero) */
012E ; tmp=SPI_RecByte();
012E 0E940000 xcall _SPI_RecByte
0132 C02E mov R12,R16
0134 ; i++;
0134 41E0 ldi R20,1
0136 50E0 ldi R21,0
0138 60E0 ldi R22,0
013A 70E0 ldi R23,0
013C FE01 movw R30,R28
013E 2080 ldd R2,z+0
0140 3180 ldd R3,z+1
0142 4280 ldd R4,z+2
0144 5380 ldd R5,z+3
0146 240E add R2,R20
0148 351E adc R3,R21
014A 461E adc R4,R22
014C 571E adc R5,R23
014E FE01 movw R30,R28
0150 2082 std z+0,R2
0152 3182 std z+1,R3
0154 4282 std z+2,R4
0156 5382 std z+3,R5
0158 ; }
0158 L13:
0158 ; while(((tmp&0x80)!=0)&&(i<SD_CMD_TIMEOUT));
0158 C7FE sbrs R12,7
015A 0EC0 rjmp L15
015C 4FEF ldi R20,255
015E 50E0 ldi R21,0
0160 60E0 ldi R22,0
0162 70E0 ldi R23,0
0164 FE01 movw R30,R28
0166 2080 ldd R2,z+0
0168 3180 ldd R3,z+1
016A 4280 ldd R4,z+2
016C 5380 ldd R5,z+3
016E 2416 cp R2,R20
0170 3506 cpc R3,R21
0172 4606 cpc R4,R22
0174 5706 cpc R5,R23
0176 DCF2 brlt L12
0178 L15:
0178 ;
0178 ; if(i>=SD_CMD_TIMEOUT)
0178 4FEF ldi R20,255
017A 50E0 ldi R21,0
017C 60E0 ldi R22,0
017E 70E0 ldi R23,0
0180 FE01 movw R30,R28
0182 2080 ldd R2,z+0
0184 3180 ldd R3,z+1
0186 4280 ldd R4,z+2
0188 5380 ldd R5,z+3
018A 2416 cp R2,R20
018C 3506 cpc R3,R21
018E 4606 cpc R4,R22
0190 5706 cpc R5,R23
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?