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

📄 mmc.lis

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 00FE           ; 
 00FE           ; 
 00FE           ;       retry = 0;
 00FE AA24              clr R10
 0100           L28:
 0100                   .dbline 97
 0100           ;       do
 0100           ;       {
 0100                   .dbline 98
 0100           ;               r1 = MMC_SD_SendCommand(1, 0);//发active命令    //send active command
 0100 80E0              ldi R24,0
 0102 90E0              ldi R25,0
 0104 A0E0              ldi R26,0
 0106 B0E0              ldi R27,0
 0108 A883              std y+0,R26
 010A B983              std y+1,R27
 010C 9C01              movw R18,R24
 010E 01E0              ldi R16,1
 0110 97DF              xcall _MMC_SD_SendCommand
 0112 402F              mov R20,R16
 0114                   .dbline 99
 0114           ;               retry++;
 0114 A394              inc R10
 0116                   .dbline 100
 0116           ;               if(retry>100) return 1;//超时退出               //time out
 0116 84E6              ldi R24,100
 0118 8A15              cp R24,R10
 011A 10F4              brsh L31
 011C           X7:
 011C                   .dbline 100
 011C 01E0              ldi R16,1
 011E 18C0              xjmp L18
 0120           L31:
 0120                   .dbline 101
 0120           ;       } while(r1);
 0120           L29:
 0120                   .dbline 101
 0120 4423              tst R20
 0122 71F7              brne L28
 0124           X8:
 0124                   .dbline 102
 0124           ;       SPI_High();
 0124 71DF              xcall _SPI_High
 0126                   .dbline 103
 0126           ;       r1 = MMC_SD_SendCommand(59, 0);//关crc          //disable CRC
 0126 80E0              ldi R24,0
 0128 90E0              ldi R25,0
 012A A0E0              ldi R26,0
 012C B0E0              ldi R27,0
 012E A883              std y+0,R26
 0130 B983              std y+1,R27
 0132 9C01              movw R18,R24
 0134 0BE3              ldi R16,59
 0136 84DF              xcall _MMC_SD_SendCommand
 0138                   .dbline 105
 0138           ; 
 0138           ;       r1 = MMC_SD_SendCommand(16, 512);//设扇区大小512        //set sector size to 512
 0138 80E0              ldi R24,0
 013A 92E0              ldi R25,2
 013C A0E0              ldi R26,0
 013E B0E0              ldi R27,0
 0140 A883              std y+0,R26
 0142 B983              std y+1,R27
 0144 9C01              movw R18,R24
 0146 00E1              ldi R16,16
 0148 7BDF              xcall _MMC_SD_SendCommand
 014A A02E              mov R10,R16
 014C 4A2D              mov R20,R10
 014E                   .dbline 106
 014E           ;       return 0;//正常返回             //normal return
 014E 0027              clr R16
 0150                   .dbline -2
 0150           L18:
 0150                   .dbline 0 ; func end
 0150 2296              adiw R28,2
 0152 0C940000          xjmp pop_xgsetF00C
 0156                   .dbsym r r1 20 c
 0156                   .dbsym r i 22 c
 0156                   .dbsym r retry 10 c
 0156                   .dbend
 0156                   .dbfunc e MMC_SD_ReadSingleBlock _MMC_SD_ReadSingleBlock fc
 0156           ;             r1 -> R12
 0156           ;          retry -> R20,R21
 0156           ;              i -> R20,R21
 0156           ;         buffer -> R10,R11
 0156           ;         sector -> y+10
                        .even
 0156           _MMC_SD_ReadSingleBlock::
 0156 0E940000          xcall push_arg4
 015A 0E940000          xcall push_xgsetF03C
 015E 2297              sbiw R28,2
 0160 AE84              ldd R10,y+14
 0162 BF84              ldd R11,y+15
 0164                   .dbline -1
 0164                   .dbline 111
 0164           ; }
 0164           ; 
 0164           ; //读一个扇区,成功,返回0
 0164           ; uint8 MMC_SD_ReadSingleBlock(uint32 sector, uint8* buffer)
 0164           ; {
 0164                   .dbline 114
 0164           ;       uint8 r1;
 0164           ;       register uint16 i;
 0164           ;       register uint16 retry=0;
 0164 4427              clr R20
 0166 5527              clr R21
 0168                   .dbline 116
 0168           ; 
 0168           ;       r1 = MMC_SD_SendCommand(17, sector<<9);//读命令 //read command
 0168 89E0              ldi R24,9
 016A 90E0              ldi R25,0
 016C 0A85              ldd R16,y+10
 016E 1B85              ldd R17,y+11
 0170 2C85              ldd R18,y+12
 0172 3D85              ldd R19,y+13
 0174 8A93              st -y,R24
 0176 0E940000          xcall lsl32
 017A 2883              std y+0,R18
 017C 3983              std y+1,R19
 017E 9801              movw R18,R16
 0180 01E1              ldi R16,17
 0182 5EDF              xcall _MMC_SD_SendCommand
 0184 C02E              mov R12,R16
 0186                   .dbline 118
 0186           ;       
 0186           ;       if(r1 != 0x00)
 0186 0023              tst R16
 0188 09F0              breq L34
 018A           X9:
 018A                   .dbline 119
 018A           ;               return r1;
 018A 27C0              xjmp L33
 018C           L34:
 018C                   .dbline 121
 018C           ; 
 018C           ;       SPI_CS_Assert();
 018C C498              cbi 0x18,4
 018E 0BC0              xjmp L37
 0190           L36:
 0190                   .dbline 123
 0190           ;       //等数据的开始  
 0190           ;       while(SPI_WriteByte(0xff) != 0xfe) if(retry++ > 1000){SPI_CS_Deassert(); return 1;}
 0190 1A01              movw R2,R20
 0192 4F5F              subi R20,255  ; offset = 1
 0194 5F4F              sbci R21,255
 0196 88EE              ldi R24,1000
 0198 93E0              ldi R25,3
 019A 8215              cp R24,R2
 019C 9305              cpc R25,R3
 019E 18F4              brsh L39
 01A0           X10:
 01A0                   .dbline 123
 01A0                   .dbline 123
 01A0 C49A              sbi 0x18,4
 01A2                   .dbline 123
 01A2 01E0              ldi R16,1
 01A4 1AC0              xjmp L33
 01A6           L39:
 01A6           L37:
 01A6                   .dbline 123
 01A6 0FEF              ldi R16,255
 01A8 38DF              xcall _SPI_WriteByte
 01AA 602F              mov R22,R16
 01AC 0E3F              cpi R16,254
 01AE 81F7              brne L36
 01B0           X11:
 01B0                   .dbline 125
 01B0           ; 
 01B0           ;       for(i=0; i<512; i++)//读512个数据       //read 512 bytes
 01B0 4427              clr R20
 01B2 5527              clr R21
 01B4 08C0              xjmp L44
 01B6           L41:
 01B6                   .dbline 126
 01B6           ;       {
 01B6                   .dbline 127
 01B6           ;               *buffer++ = SPI_WriteByte(0xff);
 01B6 0FEF              ldi R16,255
 01B8 30DF              xcall _SPI_WriteByte
 01BA C02E              mov R12,R16
 01BC F501              movw R30,R10
 01BE C192              st Z+,R12
 01C0 5F01              movw R10,R30
 01C2                   .dbline 128
 01C2           ;       }
 01C2           L42:
 01C2                   .dbline 125
 01C2 4F5F              subi R20,255  ; offset = 1
 01C4 5F4F              sbci R21,255
 01C6           L44:
 01C6                   .dbline 125
 01C6 4030              cpi R20,0
 01C8 E2E0              ldi R30,2
 01CA 5E07              cpc R21,R30
 01CC A0F3              brlo L41
 01CE           X12:
 01CE                   .dbline 130
 01CE           ; 
 01CE           ;       SPI_WriteByte(0xff);//伪crc
 01CE 0FEF              ldi R16,255
 01D0 24DF              xcall _SPI_WriteByte
 01D2                   .dbline 131
 01D2           ;       SPI_WriteByte(0xff);
 01D2 0FEF              ldi R16,255
 01D4 22DF              xcall _SPI_WriteByte
 01D6                   .dbline 133
 01D6           ;       
 01D6           ;       SPI_CS_Deassert();
 01D6 C49A              sbi 0x18,4
 01D8                   .dbline 135
 01D8           ; 
 01D8           ;       return 0;
 01D8 0027              clr R16
 01DA                   .dbline -2
 01DA           L33:
 01DA                   .dbline 0 ; func end
 01DA 2296              adiw R28,2
 01DC 0E940000          xcall pop_xgsetF03C
 01E0 2496              adiw R28,4
 01E2 0895              ret
 01E4                   .dbsym r r1 12 c
 01E4                   .dbsym r retry 20 i
 01E4                   .dbsym r i 20 i
 01E4                   .dbsym r buffer 10 pc
 01E4                   .dbsym l sector 10 l
 01E4                   .dbend
 01E4           ; }
 01E4           ; 
 01E4           ; /*
 01E4           ; //写一个扇区          //wirite one sector //not used in this application
 01E4           ; uint8 MMC_SD_WriteSingleBlock(uint32 sector, uint8* buffer)
 01E4           ; {
 01E4           ;       uint8 r1;
 01E4           ;       uint16 i;
 01E4           ;       uint16 retry=0;
 01E4           ; 
 01E4           ;       r1 = MMC_SD_SendCommand(24, sector<<9);//写命令 //send command
 01E4           ;       if(r1 != 0x00)
 01E4           ;               return r1;
 01E4           ; 
 01E4           ;       SPI_CS_Assert();
 01E4           ;       
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ; 
 01E4           ;       SPI_WriteByte(0xfe);//发开始符                  //send start byte
 01E4           ;       
 01E4           ;       for(i=0; i<512; i++)//送512字节数据             //send 512 bytes data
 01E4           ;       {
 01E4           ;               SPI_WriteByte(*buffer++);
 01E4           ;       }
 01E4           ;       
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       
 01E4           ;       r1 = SPI_WriteByte(0xff);
 01E4           ;       
 01E4           ;       if( (r1&0x1f) != 0x05)//等待是否成功    //judge if it successful
 01E4           ;       {
 01E4           ;               SPI_CS_Deassert();
 01E4           ;               return r1;
 01E4           ;       }
 01E4           ;       //等待操作完            //wait no busy
 01E4           ;       while(!SPI_WriteByte(0xff))if(retry++ > 2000){SPI_CS_Deassert();return 1;}
 01E4           ; 
 01E4           ;       SPI_CS_Deassert();
 01E4           ; 
 01E4           ;       return 0;
 01E4           ; }
 01E4           ; 
 01E4           ; uint32 MMC_SD_ReadCapacity(void)
 01E4           ; {
 01E4           ;       uint8 r1;
 01E4           ;       uint16 i;
 01E4           ;       uint16 temp;
 01E4           ;       uint8 buffer[16];
 01E4           ;       uint32 Capacity;
 01E4           ;       //uint8 retry=0;
 01E4           ; 
 01E4           ;       r1 = MMC_SD_SendCommand(9, 0);//写命令  //send command  //READ CSD
 01E4           ;       if(r1 != 0x00)
 01E4           ;               return r1;
 01E4           ; 
 01E4           ;       SPI_CS_Assert();
 01E4           ;       while(SPI_WriteByte(0xff) != 0xfe);
 01E4           ;       
 01E4           ;       for(i=0;i<16;i++)
 01E4           ;       {
 01E4           ;               buffer[i]=SPI_WriteByte(0xff);
 01E4           ;       }       
 01E4           ; 
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       
 01E4           ;       SPI_WriteByte(0xff);
 01E4           ;       
 01E4           ;       SPI_CS_Deassert();
 01E4           ; 
 01E4           ; //////////////////////////////////////
 01E4           ; //    C_SIZE
 01E4           ;       i = buffer[6]&0x03;
 01E4           ;       i<<=8;
 01E4           ;       i += buffer[7];
 01E4           ;       i<<=2;
 01E4           ;       i += ((buffer[8]&0xc0)>>6);
 01E4           ; 
 01E4           ; ///////////////////////////////////////
 01E4           ; //  C_SIZE_MULT
 01E4           ; 
 01E4           ;       r1 = buffer[9]&0x03;
 01E4           ;       r1<<=1;
 01E4           ;       r1 += ((buffer[10]&0x80)>>7);
 01E4           ; 
 01E4           ; 
 01E4           ; ///////////////////////////////////////
 01E4           ; // BLOCKNR
 01E4           ; 
 01E4           ;       r1+=2;
 01E4           ; 
 01E4           ;       temp = 1;
 01E4           ;       while(r1)
 01E4           ;       {
 01E4           ;               temp*=2;
 01E4           ;               r1--;
 01E4           ;       }
 01E4           ;       
 01E4           ;       Capacity = ((uint32)(i+1))*((uint32)temp);
 01E4           ; 
 01E4           ; /////////////////////////
 01E4           ; // READ_BL_LEN
 01E4           ; 
 01E4           ;       i = buffer[5]&0x0f;
 01E4           ; 
 01E4           ; /////////////////////////
 01E4           ; //BLOCK_LEN
 01E4           ; 
 01E4           ;       temp = 1;
 01E4           ;       while(i)
 01E4           ;       {
 01E4           ;               temp*=2;
 01E4           ;               i--;
 01E4           ;       }
 01E4           ; /////////////////////////
 01E4           ; 
 01E4           ; 
 01E4           ; ////////////////////////////////////////////////////////////
 01E4           ; //
 01E4           ; //  memory capacity = BLOCKNR * BLOCK_LEN
 01E4           ; //    
 01E4           ; //    BLOCKNR = (C_SIZE + 1)* MULT
 01E4           ; //
 01E4           ; //           C_SIZE_MULT+2
 01E4           ; //    MULT = 2
 01E4           ; //
 01E4           ; //               READ_BL_LEN
 01E4           ; //    BLOCK_LEN = 2
 01E4           ; ////////////////////////////////////////////////////////////
 01E4           ; //The final result
 01E4           ; 
 01E4           ;       Capacity *= (uint32)temp;        
 01E4           ;       return Capacity;                
 01E4           ; }
 01E4           ; 
 01E4           ; */

⌨️ 快捷键说明

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