⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.lis

📁 mp3源码,是自己写的,关于vs1001与CD卡的读取歌曲,和播放.
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -