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

📄 mmc.lis

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module mmc.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\mmc.c
 0000                   .dbfunc e SPI_Low _SPI_Low fV
                        .even
 0000           _SPI_Low::
 0000                   .dbline -1
 0000                   .dbline 7
 0000           ; # include "iom16v.h"
 0000           ; # include "macros.h"
 0000           ; #include "mmc.h"
 0000           ; 
 0000           ; //低速模式  //spi low speed
 0000           ; void SPI_Low(void)
 0000           ; {
 0000                   .dbline 8
 0000           ;       SPCR =   BIT(SPE)|BIT(MSTR)|BIT(SPR1)|BIT(SPR0);  //SCK:XTAL-CLOCK/128
 0000 83E5              ldi R24,83
 0002 8DB9              out 0xd,R24
 0004                   .dbline 9
 0004           ;       SPSR &= ~BIT(SPI2X);                                                      //不用倍速
 0004 7098              cbi 0xe,0
 0006                   .dbline -2
 0006           L1:
 0006                   .dbline 0 ; func end
 0006 0895              ret
 0008                   .dbend
 0008                   .dbfunc e SPI_High _SPI_High fV
                        .even
 0008           _SPI_High::
 0008                   .dbline -1
 0008                   .dbline 14
 0008           ; }
 0008           ; 
 0008           ; //高速模式    //spi full speed
 0008           ; void SPI_High(void)
 0008           ; {
 0008                   .dbline 15
 0008           ;       SPCR =  BIT(SPE)|BIT(MSTR);                     //SCK:          XTAL-CLOCK/2,采用倍速                          
 0008 80E5              ldi R24,80
 000A 8DB9              out 0xd,R24
 000C                   .dbline 16
 000C           ;       SPSR |= BIT(SPI2X);
 000C 709A              sbi 0xe,0
 000E                   .dbline -2
 000E           L2:
 000E                   .dbline 0 ; func end
 000E 0895              ret
 0010                   .dbend
 0010                   .dbfunc e SPI_Init _SPI_Init fV
                        .even
 0010           _SPI_Init::
 0010                   .dbline -1
 0010                   .dbline 21
 0010           ; }
 0010           ; 
 0010           ; //端口初始化,模式初始化  //port initialize
 0010           ; void SPI_Init(void)
 0010           ; {
 0010                   .dbline 22
 0010           ;       DDR_INI();
 0010 87B3              in R24,0x17
 0012 806B              ori R24,176
 0014 87BB              out 0x17,R24
 0016                   .dbline 23
 0016           ;       SPI_High();
 0016 F8DF              xcall _SPI_High
 0018                   .dbline -2
 0018           L3:
 0018                   .dbline 0 ; func end
 0018 0895              ret
 001A                   .dbend
 001A                   .dbfunc e SPI_WriteByte _SPI_WriteByte fc
 001A           ;            val -> R16
                        .even
 001A           _SPI_WriteByte::
 001A                   .dbline -1
 001A                   .dbline 28
 001A           ; }
 001A           ; 
 001A           ; //写[读]一个字节                      //read [and write] one byte
 001A           ; uint8 SPI_WriteByte(register uint8 val)
 001A           ; {
 001A                   .dbline 29
 001A           ;       SPDR = val;
 001A 0FB9              out 0xf,R16
 001C           L5:
 001C                   .dbline 30
 001C           ;       while(!(SPSR & BIT(SPIF)));        //等待SPI发送完数据
 001C           L6:
 001C                   .dbline 30
 001C 779B              sbis 0xe,7
 001E FECF              rjmp L5
 0020           X0:
 0020                   .dbline 31
 0020           ;       return SPDR;
 0020 0FB1              in R16,0xf
 0022                   .dbline -2
 0022           L4:
 0022                   .dbline 0 ; func end
 0022 0895              ret
 0024                   .dbsym r val 16 c
 0024                   .dbend
 0024                   .dbfunc e MMC_SD_Detect _MMC_SD_Detect fc
                        .even
 0024           _MMC_SD_Detect::
 0024                   .dbline -1
 0024                   .dbline 37
 0024           ; }
 0024           ; 
 0024           ; 
 0024           ; //检测SD卡是否插入,已插入,返回1,否则,返回0
 0024           ; uint8 MMC_SD_Detect(void)
 0024           ; {      
 0024                   .dbline 38
 0024           ;     PORTA |=BIT(MMC_SD_INSDETC);      //PORTA0为高电平
 0024 DF9A              sbi 0x1b,7
 0026                   .dbline 39
 0026           ;       DDRA&=(~BIT(MMC_SD_INSDETC));   //PA0设置为输入
 0026 D798              cbi 0x1a,7
 0028                   .dbline 41
 0028           ;       //;;//读取MMC_SD_INSDETC,为低电平,表示已经插入SD卡
 0028           ;       ;
 0028                   .dbline 42
 0028           ;       if((PINA&=BIT(MMC_SD_INSDETC))==0)
 0028 89B3              in R24,0x19
 002A 8078              andi R24,128
 002C 89BB              out 0x19,R24
 002E 8823              tst R24
 0030 11F4              brne L9
 0032           X1:
 0032                   .dbline 43
 0032           ;               return 1;
 0032 01E0              ldi R16,1
 0034 01C0              xjmp L8
 0036           L9:
 0036                   .dbline 45
 0036           ;       else
 0036           ;               return 0;
 0036 0027              clr R16
 0038                   .dbline -2
 0038           L8:
 0038                   .dbline 0 ; func end
 0038 0895              ret
 003A                   .dbend
 003A                   .dbfunc e MMC_SD_Init _MMC_SD_Init fV
                        .even
 003A           _MMC_SD_Init::
 003A                   .dbline -1
 003A                   .dbline 50
 003A           ; }
 003A           ; 
 003A           ; //sd卡初始化          //sd card initialize
 003A           ; void MMC_SD_Init(void)
 003A           ; {
 003A                   .dbline 51
 003A           ;       SPI_Init();
 003A EADF              xcall _SPI_Init
 003C                   .dbline 52
 003C           ;       SPI_CS_Deassert();;
 003C C49A              sbi 0x18,4
 003E                   .dbline 52
 003E                   .dbline -2
 003E           L11:
 003E                   .dbline 0 ; func end
 003E 0895              ret
 0040                   .dbend
 0040                   .dbfunc e MMC_SD_SendCommand _MMC_SD_SendCommand fc
 0040           ;             r1 -> R10
 0040           ;          retry -> R20
 0040           ;            arg -> y+6
 0040           ;            cmd -> R22
                        .even
 0040           _MMC_SD_SendCommand::
 0040 3A93              st -y,r19
 0042 2A93              st -y,r18
 0044 0E940000          xcall push_xgsetF00C
 0048 602F              mov R22,R16
 004A                   .dbline -1
 004A                   .dbline 57
 004A           ; }
 004A           ; 
 004A           ; //sd卡写命令          //sd send command
 004A           ; uint8 MMC_SD_SendCommand(uint8 cmd, uint32 arg)
 004A           ; {
 004A                   .dbline 59
 004A           ;       uint8 r1;
 004A           ;       register uint8 retry=0;
 004A 4427              clr R20
 004C                   .dbline 61
 004C           ;       
 004C           ;       SPI_WriteByte(0xff);
 004C 0FEF              ldi R16,255
 004E E5DF              xcall _SPI_WriteByte
 0050                   .dbline 62
 0050           ;       SPI_CS_Assert();
 0050 C498              cbi 0x18,4
 0052                   .dbline 64
 0052           ;       
 0052           ;       SPI_WriteByte(cmd | 0x40);//分别写入命令        //send command
 0052 062F              mov R16,R22
 0054 0064              ori R16,64
 0056 E1DF              xcall _SPI_WriteByte
 0058                   .dbline 65
 0058           ;       SPI_WriteByte(arg>>24);
 0058 88E1              ldi R24,24
 005A 90E0              ldi R25,0
 005C 0E81              ldd R16,y+6
 005E 1F81              ldd R17,y+7
 0060 2885              ldd R18,y+8
 0062 3985              ldd R19,y+9
 0064 8A93              st -y,R24
 0066 0E940000          xcall lsr32
 006A D7DF              xcall _SPI_WriteByte
 006C                   .dbline 66
 006C           ;       SPI_WriteByte(arg>>16);
 006C 2E80              ldd R2,y+6
 006E 3F80              ldd R3,y+7
 0070 4884              ldd R4,y+8
 0072 5984              ldd R5,y+9
 0074 1201              movw R2,R4
 0076 4424              clr R4
 0078 5524              clr R5
 007A 022D              mov R16,R2
 007C CEDF              xcall _SPI_WriteByte
 007E                   .dbline 67
 007E           ;       SPI_WriteByte(arg>>8);
 007E 88E0              ldi R24,8
 0080 90E0              ldi R25,0
 0082 0E81              ldd R16,y+6
 0084 1F81              ldd R17,y+7
 0086 2885              ldd R18,y+8
 0088 3985              ldd R19,y+9
 008A 8A93              st -y,R24
 008C 0E940000          xcall lsr32
 0090 C4DF              xcall _SPI_WriteByte
 0092                   .dbline 68
 0092           ;       SPI_WriteByte(arg);
 0092 0E81              ldd R16,y+6
 0094 C2DF              xcall _SPI_WriteByte
 0096                   .dbline 69
 0096           ;       SPI_WriteByte(0x95);
 0096 05E9              ldi R16,149
 0098 C0DF              xcall _SPI_WriteByte
 009A 07C0              xjmp L14
 009C           L13:
 009C                   .dbline 72
 009C           ;       
 009C           ;       while((r1 = SPI_WriteByte(0xff)) == 0xff)//等待响应,   //wait response
 009C           ;               if(retry++ > 20) break;//超时退出                                       //time out error
 009C 242E              mov R2,R20
 009E 3324              clr R3
 00A0 4F5F              subi R20,255    ; addi 1
 00A2 84E1              ldi R24,20
 00A4 8215              cp R24,R2
 00A6 08F4              brsh L16
 00A8           X2:
 00A8                   .dbline 72
 00A8 05C0              xjmp L15
 00AA           L16:
 00AA           L14:
 00AA                   .dbline 71
 00AA 0FEF              ldi R16,255
 00AC B6DF              xcall _SPI_WriteByte
 00AE A02E              mov R10,R16
 00B0 0F3F              cpi R16,255
 00B2 A1F3              breq L13
 00B4           X3:
 00B4           L15:
 00B4                   .dbline 74
 00B4           ; 
 00B4           ;       SPI_CS_Deassert();
 00B4 C49A              sbi 0x18,4
 00B6                   .dbline 76
 00B6           ; 
 00B6           ;       return r1;//返回状态值                                  //return state
 00B6 0A2D              mov R16,R10
 00B8                   .dbline -2
 00B8           L12:
 00B8                   .dbline 0 ; func end
 00B8 0E940000          xcall pop_xgsetF00C
 00BC 2296              adiw R28,2
 00BE 0895              ret
 00C0                   .dbsym r r1 10 c
 00C0                   .dbsym r retry 20 c
 00C0                   .dbsym l arg 6 l
 00C0                   .dbsym r cmd 22 c
 00C0                   .dbend
 00C0                   .dbfunc e MMC_SD_Reset _MMC_SD_Reset fc
 00C0           ;             r1 -> R20
 00C0           ;              i -> R22
 00C0           ;          retry -> R10
                        .even
 00C0           _MMC_SD_Reset::
 00C0 0E940000          xcall push_xgsetF00C
 00C4 2297              sbiw R28,2
 00C6                   .dbline -1
 00C6                   .dbline 81
 00C6           ; }
 00C6           ; 
 00C6           ; //sd卡复位,正常时,返回0
 00C6           ; uint8 MMC_SD_Reset(void)
 00C6           ; {
 00C6                   .dbline 83
 00C6           ;       uint8 i;
 00C6           ;       register uint8 retry=0;
 00C6 AA24              clr R10
 00C8                   .dbline 84
 00C8           ;       uint8 r1=0;
 00C8 4427              clr R20
 00CA                   .dbline 85
 00CA           ;       SPI_Low();
 00CA 9ADF              xcall _SPI_Low
 00CC           L19:
 00CC                   .dbline 87
 00CC           ;       do
 00CC           ;       {
 00CC                   .dbline 88
 00CC           ;               for(i=0;i<10;i++) SPI_WriteByte(0xff);
 00CC 6627              clr R22
 00CE 03C0              xjmp L25
 00D0           L22:
 00D0                   .dbline 88
 00D0 0FEF              ldi R16,255
 00D2 A3DF              xcall _SPI_WriteByte
 00D4           L23:
 00D4                   .dbline 88
 00D4 6395              inc R22
 00D6           L25:
 00D6                   .dbline 88
 00D6 6A30              cpi R22,10
 00D8 D8F3              brlo L22
 00DA           X4:
 00DA                   .dbline 89
 00DA           ;               r1 = MMC_SD_SendCommand(0, 0);//发idle命令      //send idle command
 00DA 80E0              ldi R24,0
 00DC 90E0              ldi R25,0
 00DE A0E0              ldi R26,0
 00E0 B0E0              ldi R27,0
 00E2 A883              std y+0,R26
 00E4 B983              std y+1,R27
 00E6 9C01              movw R18,R24
 00E8 0027              clr R16
 00EA AADF              xcall _MMC_SD_SendCommand
 00EC 402F              mov R20,R16
 00EE                   .dbline 90
 00EE           ;               retry++;
 00EE A394              inc R10
 00F0                   .dbline 91
 00F0           ;               if(retry>10) return 1;//超时退出                //time out
 00F0 8AE0              ldi R24,10
 00F2 8A15              cp R24,R10
 00F4 10F4              brsh L26
 00F6           X5:
 00F6                   .dbline 91
 00F6 01E0              ldi R16,1
 00F8 2BC0              xjmp L18
 00FA           L26:
 00FA                   .dbline 92
 00FA           ;       } while(r1 != 0x01);    
 00FA           L20:
 00FA                   .dbline 92
 00FA 4130              cpi R20,1
 00FC 39F7              brne L19
 00FE           X6:
 00FE                   .dbline 95

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -