📄 sd.lis
字号:
.module sd.c
.area text(rom, con, rel)
0000 .dbfile F:\mine\mp3\MP3\sd.c
0000 .dbfunc e sd_wait_nobusy _sd_wait_nobusy fV
.even
0000 _sd_wait_nobusy::
0000 .dbline -1
0000 .dbline 14
0000 ; #include<all.h>
0000 ; #include<vs1001k.h>
0000 ; #include<sd.h>
0000 ; #define SD_INIT_TRY 50
0000 ; #define SD_IDLE_WAIT_MAX 100 //等待进入IDLE次数
0000 ; #define SD_CMD_TIMEOUT 100 //读CMD次数
0000 ; #define TIMEOUT_WRITE 10000 // 8M/8
0000 ; #define TIMEOUT_READ 400000 // 8M/20
0000 ;
0000 ; uchar mp3_data[DATA_LENGTH];
0000 ; uchar response[5];
0000 ;
0000 ; void sd_wait_nobusy(void)
0000 ; {
0000 L2:
0000 .dbline 15
0000 L3:
0000 .dbline 15
0000 ; while(read_single()!=0xff);
0000 0E940000 xcall _read_single
0004 0F3F cpi R16,255
0006 E1F7 brne L2
0008 .dbline 16
0008 ; select_vs;
0008 C39A sbi 0x18,3
000A .dbline -2
000A .dbline 17
000A ; }
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbend
000C .dbfunc e sd_delay _sd_delay fV
000C ; n -> R20,R21
000C ; dat -> R22
.even
000C _sd_delay::
000C 0E940000 xcall push_gset2
0010 602F mov R22,R16
0012 .dbline -1
0012 .dbline 19
0012 ; void sd_delay(uchar dat)
0012 ; { uint n;
0012 .dbline 20
0012 ; for(n=0;n<dat;n++)
0012 4427 clr R20
0014 5527 clr R21
0016 05C0 xjmp L9
0018 L6:
0018 .dbline 21
0018 0FEF ldi R16,255
001A 0E940000 xcall _write_single
001E L7:
001E .dbline 20
001E 4F5F subi R20,255 ; offset = 1
0020 5F4F sbci R21,255
0022 L9:
0022 .dbline 20
0022 262E mov R2,R22
0024 3324 clr R3
0026 4215 cp R20,R2
0028 5305 cpc R21,R3
002A B0F3 brlo L6
002C .dbline -2
002C .dbline 22
002C ; write_single(0xff);
002C ; }
002C L5:
002C 0E940000 xcall pop_gset2
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r n 20 i
0032 .dbsym r dat 22 c
0032 .dbend
0032 .dbfunc e sd_write_command _sd_write_command fc
0032 ; response_length -> R14
0032 ; dat -> R22
0032 ; n -> R20,R21
0032 ; response -> R10,R11
0032 ; arg -> y+10
0032 ; response_type -> R12
0032 ; cmd -> R20
.even
0032 _sd_write_command::
0032 0E940000 xcall push_gset5
0036 C22E mov R12,R18
0038 402F mov R20,R16
003A AE84 ldd R10,y+14
003C BF84 ldd R11,y+15
003E .dbline -1
003E .dbline 25
003E ; /****************sd 发命令**********************/
003E ; uchar sd_write_command(uchar cmd,uchar response_type,ulong arg,uchar *response)
003E ; { uchar response_length,dat;
003E .dbline 27
003E ; int n;
003E ; select_sd;//选择SD
003E C398 cbi 0x18,3
0040 .dbline 28
0040 ; write_single(cmd|0x40);
0040 042F mov R16,R20
0042 0064 ori R16,64
0044 0E940000 xcall _write_single
0048 .dbline 29
0048 ; write_single(arg>>24);
0048 88E1 ldi R24,24
004A 90E0 ldi R25,0
004C FE01 movw R30,R28
004E 2284 ldd R2,z+10
0050 3384 ldd R3,z+11
0052 4484 ldd R4,z+12
0054 5584 ldd R5,z+13
0056 8A93 st -y,R24
0058 8101 movw R16,R2
005A 9201 movw R18,R4
005C 0E940000 xcall lsr32
0060 0E940000 xcall _write_single
0064 .dbline 30
0064 ; write_single(arg>>16);
0064 FE01 movw R30,R28
0066 2284 ldd R2,z+10
0068 3384 ldd R3,z+11
006A 4484 ldd R4,z+12
006C 5584 ldd R5,z+13
006E 1201 movw R2,R4
0070 4424 clr R4
0072 5524 clr R5
0074 022D mov R16,R2
0076 0E940000 xcall _write_single
007A .dbline 31
007A ; write_single(arg>>8);
007A 88E0 ldi R24,8
007C 90E0 ldi R25,0
007E FE01 movw R30,R28
0080 2284 ldd R2,z+10
0082 3384 ldd R3,z+11
0084 4484 ldd R4,z+12
0086 5584 ldd R5,z+13
0088 8A93 st -y,R24
008A 8101 movw R16,R2
008C 9201 movw R18,R4
008E 0E940000 xcall lsr32
0092 0E940000 xcall _write_single
0096 .dbline 32
0096 ; write_single(arg);
0096 FE01 movw R30,R28
0098 0285 ldd R16,z+10
009A 0E940000 xcall _write_single
009E .dbline 33
009E ; write_single(0x95);//CRC 对于CMD0有效,SPI忽略
009E 05E9 ldi R16,149
00A0 0E940000 xcall _write_single
00A4 .dbline 34
00A4 ; response_length=0;
00A4 EE24 clr R14
00A6 .dbline 35
00A6 ; switch(response_type)
00A6 4C2D mov R20,R12
00A8 5527 clr R21
00AA 4130 cpi R20,1
00AC E0E0 ldi R30,0
00AE 5E07 cpc R21,R30
00B0 69F0 breq L14
00B2 4230 cpi R20,2
00B4 E0E0 ldi R30,0
00B6 5E07 cpc R21,R30
00B8 49F0 breq L14
00BA 4330 cpi R20,3
00BC E0E0 ldi R30,0
00BE 5E07 cpc R21,R30
00C0 41F0 breq L15
00C2 4430 cpi R20,4
00C4 E0E0 ldi R30,0
00C6 5E07 cpc R21,R30
00C8 39F0 breq L16
00CA 08C0 xjmp L12
00CC X0:
00CC .dbline 36
00CC ; { case R1:
00CC L14:
00CC .dbline 37
00CC ; case R1B:response_length=1;break;
00CC EE24 clr R14
00CE E394 inc R14
00D0 .dbline 37
00D0 05C0 xjmp L12
00D2 L15:
00D2 .dbline 38
00D2 ; case R2: response_length=2;break;
00D2 82E0 ldi R24,2
00D4 E82E mov R14,R24
00D6 .dbline 38
00D6 02C0 xjmp L12
00D8 L16:
00D8 .dbline 39
00D8 ; case R3: response_length=5;break;
00D8 85E0 ldi R24,5
00DA E82E mov R14,R24
00DC .dbline 39
00DC .dbline 40
00DC ; default: break;
00DC L12:
00DC .dbline 42
00DC ; }
00DC ; n=0;
00DC 4427 clr R20
00DE 5527 clr R21
00E0 L17:
00E0 .dbline 44
00E0 ; do //等待响应
00E0 ; { dat=read_single();
00E0 .dbline 44
00E0 0E940000 xcall _read_single
00E4 602F mov R22,R16
00E6 .dbline 45
00E6 ; n++;
00E6 4F5F subi R20,255 ; offset = 1
00E8 5F4F sbci R21,255
00EA .dbline 46
00EA ; }
00EA L18:
00EA .dbline 47
00EA ; while(((dat&0x80)!=0)&&(n<SD_CMD_TIMEOUT));
00EA 67FF sbrs R22,7
00EC 04C0 rjmp L20
00EE 4436 cpi R20,100
00F0 E0E0 ldi R30,0
00F2 5E07 cpc R21,R30
00F4 ACF3 brlt L17
00F6 L20:
00F6 .dbline 48
00F6 ; if(n>=SD_CMD_TIMEOUT) //超时
00F6 4436 cpi R20,100
00F8 E0E0 ldi R30,0
00FA 5E07 cpc R21,R30
00FC 1CF0 brlt L21
00FE .dbline 49
00FE ; { select_vs;
00FE .dbline 49
00FE C39A sbi 0x18,3
0100 .dbline 50
0100 ; return 0;
0100 0027 clr R16
0102 1FC0 xjmp L10
0104 L21:
0104 .dbline 52
0104 ; }
0104 ; for(n=response_length-1;n>=0;n--)//取数据
0104 4E2D mov R20,R14
0106 5527 clr R21
0108 4150 subi R20,1
010A 5040 sbci R21,0
010C 09C0 xjmp L26
010E L23:
010E .dbline 53
010E .dbline 53
010E FA01 movw R30,R20
0110 EA0D add R30,R10
0112 FB1D adc R31,R11
0114 6083 std z+0,R22
0116 .dbline 54
0116 0E940000 xcall _read_single
011A 602F mov R22,R16
011C .dbline 55
011C L24:
011C .dbline 52
011C 4150 subi R20,1
011E 5040 sbci R21,0
0120 L26:
0120 .dbline 52
0120 4030 cpi R20,0
0122 E0E0 ldi R30,0
0124 5E07 cpc R21,R30
0126 9CF7 brge L23
0128 .dbline 56
0128 ; { response[n]=dat;
0128 ; dat=read_single();
0128 ; }
0128 ; if(response_type==R1B)//忙等待结束
0128 8C2D mov R24,R12
012A 8230 cpi R24,2
012C 41F4 brne L27
012E .dbline 57
012E ; { do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -