📄 sd.lis
字号:
.module sd.c
.area text(rom, con, rel)
0000 .dbfile C:\AVR\M\1\sd.c
0000 .dbfunc e SD_Port_Init _SD_Port_Init fV
.even
0000 _SD_Port_Init::
0000 .dbline -1
0000 .dbline 12
0000 ;
0000 ; #include"sd.h"
0000 ; #include"Usart.h"
0000 ;
0000 ;
0000 ; //---------------------------------
0000 ; //
0000 ; // SD卡接口初始化函数
0000 ; //
0000 ; //---------------------------------
0000 ; void SD_Port_Init(void)
0000 ; {
0000 .dbline 13
0000 ; SD_CS_DDR |= 1<<SD_CS_BIT;
0000 D19A sbi 0x1a,1
0002 .dbline 14
0002 ; SD_CS_PORT |= 1<<SD_CS_BIT;
0002 D99A sbi 0x1b,1
0004 .dbline -2
0004 L1:
0004 .dbline 0 ; func end
0004 0895 ret
0006 .dbend
0006 .dbfunc e SD_SendCommand _SD_SendCommand fc
0006 ; retry -> R22
0006 ; r1 -> R20
0006 ; arg -> y+6
0006 ; cmd -> R10
.even
0006 _SD_SendCommand::
0006 3A93 st -y,r19
0008 2A93 st -y,r18
000A 0E940000 xcall push_gset3
000E A02E mov R10,R16
0010 .dbline -1
0010 .dbline 27
0010 ; }
0010 ;
0010 ;
0010 ;
0010 ; //---------------------------------
0010 ; //
0010 ; // SD卡写寄存器函数
0010 ; // arg:命令
0010 ; // cmd:命令号
0010 ; //
0010 ; //---------------------------------
0010 ; uint8 SD_SendCommand(uint8 cmd, uint32 arg)
0010 ; {
0010 .dbline 28
0010 ; uint8 r1=1;
0010 41E0 ldi R20,1
0012 .dbline 29
0012 ; uint8 retry=0;
0012 6627 clr R22
0014 .dbline 32
0014 ;
0014 ;
0014 ; SPI_SrByte(0xff);
0014 0FEF ldi R16,255
0016 0E940000 xcall _SPI_SrByte
001A .dbline 33
001A ; SPI_CS_Assert;
001A D998 cbi 0x1b,1
001C L3:
001C .dbline 34
001C L4:
001C .dbline 34
001C ; while(r1--);
001C 242E mov R2,R20
001E 3324 clr R3
0020 4150 subi R20,1
0022 2220 tst R2
0024 D9F7 brne L3
0026 .dbline 36
0026 ;
0026 ; SPI_SrByte((cmd & 0x3f) | 0x40); /* send command */
0026 0A2D mov R16,R10
0028 0F73 andi R16,63
002A 0064 ori R16,64
002C 0E940000 xcall _SPI_SrByte
0030 .dbline 38
0030 ;
0030 ; SPI_SrByte(arg>>24);
0030 88E1 ldi R24,24
0032 90E0 ldi R25,0
0034 FE01 movw R30,R28
0036 2680 ldd R2,z+6
0038 3780 ldd R3,z+7
003A 4084 ldd R4,z+8
003C 5184 ldd R5,z+9
003E 8A93 st -y,R24
0040 8101 movw R16,R2
0042 9201 movw R18,R4
0044 0E940000 xcall lsr32
0048 0E940000 xcall _SPI_SrByte
004C .dbline 39
004C ; SPI_SrByte(arg>>16);
004C FE01 movw R30,R28
004E 2680 ldd R2,z+6
0050 3780 ldd R3,z+7
0052 4084 ldd R4,z+8
0054 5184 ldd R5,z+9
0056 1201 movw R2,R4
0058 4424 clr R4
005A 5524 clr R5
005C 022D mov R16,R2
005E 0E940000 xcall _SPI_SrByte
0062 .dbline 40
0062 ; SPI_SrByte(arg>>8);
0062 88E0 ldi R24,8
0064 90E0 ldi R25,0
0066 FE01 movw R30,R28
0068 2680 ldd R2,z+6
006A 3780 ldd R3,z+7
006C 4084 ldd R4,z+8
006E 5184 ldd R5,z+9
0070 8A93 st -y,R24
0072 8101 movw R16,R2
0074 9201 movw R18,R4
0076 0E940000 xcall lsr32
007A 0E940000 xcall _SPI_SrByte
007E .dbline 41
007E ; SPI_SrByte(arg);
007E FE01 movw R30,R28
0080 0681 ldd R16,z+6
0082 0E940000 xcall _SPI_SrByte
0086 .dbline 43
0086 ;
0086 ; SPI_SrByte(0x95);
0086 05E9 ldi R16,149
0088 0E940000 xcall _SPI_SrByte
008C .dbline 45
008C ;
008C ; SPI_SrByte(0xff);
008C 0FEF ldi R16,255
008E 0E940000 xcall _SPI_SrByte
0092 07C0 xjmp L7
0094 L6:
0094 .dbline 47
0094 ; while((r1 = SPI_SrByte(0xff)) == 0xff) /* wait response */
0094 ; if(retry++ > 0xfe) break; /* time out error */
0094 262E mov R2,R22
0096 3324 clr R3
0098 6F5F subi R22,255 ; addi 1
009A 8EEF ldi R24,254
009C 8215 cp R24,R2
009E 08F4 brsh L9
00A0 .dbline 47
00A0 06C0 xjmp L8
00A2 L9:
00A2 L7:
00A2 .dbline 46
00A2 0FEF ldi R16,255
00A4 0E940000 xcall _SPI_SrByte
00A8 402F mov R20,R16
00AA 4F3F cpi R20,255
00AC 99F3 breq L6
00AE L8:
00AE .dbline 49
00AE ;
00AE ; SPI_CS_Deassert;
00AE D99A sbi 0x1b,1
00B0 .dbline 50
00B0 ; SPI_SrByte(0xff); // extra 8 CLK
00B0 0FEF ldi R16,255
00B2 0E940000 xcall _SPI_SrByte
00B6 .dbline 52
00B6 ;
00B6 ; return r1; /* return state */
00B6 042F mov R16,R20
00B8 .dbline -2
00B8 L2:
00B8 0E940000 xcall pop_gset3
00BC 2296 adiw R28,2
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbsym r retry 22 c
00C0 .dbsym r r1 20 c
00C0 .dbsym l arg 6 l
00C0 .dbsym r cmd 10 c
00C0 .dbend
00C0 .dbfunc e SD_Init _SD_Init fc
00C0 ; retry -> R10
00C0 ; r1 -> R12
00C0 ; i -> R14
.even
00C0 _SD_Init::
00C0 0E940000 xcall push_gset5
00C4 2297 sbiw R28,2
00C6 .dbline -1
00C6 .dbline 62
00C6 ; }
00C6 ;
00C6 ;
00C6 ; //---------------------------------
00C6 ; //
00C6 ; // SD卡初始化函数
00C6 ; //
00C6 ; //---------------------------------
00C6 ; uint8 SD_Init(void)
00C6 ; {
00C6 .dbline 65
00C6 ;
00C6 ; uint8 i;
00C6 ; uint8 retry = 0;
00C6 AA24 clr R10
00C8 .dbline 66
00C8 ; uint8 r1 = 0;
00C8 CC24 clr R12
00CA .dbline 68
00CA ;
00CA ; SD_Port_Init();
00CA 9ADF xcall _SD_Port_Init
00CC .dbline 70
00CC ;
00CC ; SPI_CS_Assert;
00CC D998 cbi 0x1b,1
00CE .dbline 71
00CE ; delay_ms(1);
00CE 01E0 ldi R16,1
00D0 10E0 ldi R17,0
00D2 20E0 ldi R18,0
00D4 30E0 ldi R19,0
00D6 0E940000 xcall _delay_ms
00DA .dbline 72
00DA ; SPI_CS_Deassert;
00DA D99A sbi 0x1b,1
00DC .dbline 73
00DC ; delay_ms(1);
00DC 01E0 ldi R16,1
00DE 10E0 ldi R17,0
00E0 20E0 ldi R18,0
00E2 30E0 ldi R19,0
00E4 0E940000 xcall _delay_ms
00E8 .dbline 76
00E8 ;
00E8 ;
00E8 ; SPI_Low();
00E8 0E940000 xcall _SPI_Low
00EC L12:
00EC .dbline 79
00EC ;
00EC ; do
00EC ; {
00EC .dbline 80
00EC EE24 clr R14
00EE 04C0 xjmp L18
00F0 L15:
00F0 .dbline 80
00F0 0FEF ldi R16,255
00F2 0E940000 xcall _SPI_SrByte
00F6 L16:
00F6 .dbline 80
00F6 E394 inc R14
00F8 L18:
00F8 .dbline 80
00F8 ; for(i=0;i<10;i++) SPI_SrByte(0xff);
00F8 8E2D mov R24,R14
00FA 8A30 cpi R24,10
00FC C8F3 brlo L15
00FE .dbline 81
00FE ; r1 = SD_SendCommand(0, 0);//发idle命令 //send idle command
00FE 40E0 ldi R20,0
0100 50E0 ldi R21,0
0102 60E0 ldi R22,0
0104 70E0 ldi R23,0
0106 6883 std y+0,R22
0108 7983 std y+1,R23
010A 9A01 movw R18,R20
010C 0027 clr R16
010E 7BDF xcall _SD_SendCommand
0110 C02E mov R12,R16
0112 .dbline 82
0112 ; retry++;
0112 A394 inc R10
0114 .dbline 83
0114 ; if(retry>0xfe) return 1;//超时退出 //time out
0114 8EEF ldi R24,254
0116 8A15 cp R24,R10
0118 10F4 brsh L19
011A .dbline 83
011A 01E0 ldi R16,1
011C 2CC0 xjmp L11
011E L19:
011E .dbline 84
011E L13:
011E .dbline 84
011E ; } while(r1 != 0x01);
011E 8C2D mov R24,R12
0120 8130 cpi R24,1
0122 21F7 brne L12
0124 .dbline 87
0124 ;
0124 ;
0124 ; retry = 0;
0124 AA24 clr R10
0126 L21:
0126 .dbline 89
0126 ; do
0126 ; {
0126 .dbline 90
0126 ; r1 = SD_SendCommand(1, 0);//发active命令 //send active command
0126 40E0 ldi R20,0
0128 50E0 ldi R21,0
012A 60E0 ldi R22,0
012C 70E0 ldi R23,0
012E 6883 std y+0,R22
0130 7983 std y+1,R23
0132 9A01 movw R18,R20
0134 01E0 ldi R16,1
0136 67DF xcall _SD_SendCommand
0138 C02E mov R12,R16
013A .dbline 91
013A ; retry++;
013A A394 inc R10
013C .dbline 92
013C ; if(retry>0xfe) return 1;//超时退出 //time out
013C 8EEF ldi R24,254
013E 8A15 cp R24,R10
0140 10F4 brsh L24
0142 .dbline 92
0142 01E0 ldi R16,1
0144 18C0 xjmp L11
0146 L24:
0146 .dbline 93
0146 L22:
0146 .dbline 93
0146 ; } while(r1);
0146 CC20 tst R12
0148 71F7 brne L21
014A .dbline 95
014A ;
014A ; SPI_High(); /* Use High Speed SPI*/
014A 0E940000 xcall _SPI_High
014E .dbline 97
014E ;
014E ; r1 = SD_SendCommand(59, 0);//关crc //disable CRC
014E 40E0 ldi R20,0
0150 50E0 ldi R21,0
0152 60E0 ldi R22,0
0154 70E0 ldi R23,0
0156 6883 std y+0,R22
0158 7983 std y+1,R23
015A 9A01 movw R18,R20
015C 0BE3 ldi R16,59
015E 53DF xcall _SD_SendCommand
0160 .dbline 99
0160 ;
0160 ; r1 = SD_SendCommand(16, 512);//设扇区大小512 //set sector size to 512
0160 40E0 ldi R20,0
0162 52E0 ldi R21,2
0164 60E0 ldi R22,0
0166 70E0 ldi R23,0
0168 6883 std y+0,R22
016A 7983 std y+1,R23
016C 9A01 movw R18,R20
016E 00E1 ldi R16,16
0170 4ADF xcall _SD_SendCommand
0172 C02E mov R12,R16
0174 .dbline 100
0174 ; return 0;//正常返回 //normal return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -