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

📄 mmc.lis

📁 你熟悉QT吗?Linux系统上领先的GUI
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module mmc.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\mega8\atmega16\mp3_7210\mmc.c
 0000                   .dbfunc e SPI_masterinit _SPI_masterinit fV
                        .even
 0000           _SPI_masterinit::
 0000                   .dbline -1
 0000                   .dbline 52
 0000           ; #include <iom16v.h>
 0000           ; 
 0000           ; // MMC commands
 0000           ; #define MMC_GO_IDLE_STATE             0
 0000           ; #define MMC_SEND_OP_COND              1
 0000           ; #define MMC_SEND_CSD                  9
 0000           ; #define MMC_SEND_CID                  10
 0000           ; #define MMC_SEND_STATUS                       13
 0000           ; #define MMC_SET_BLOCKLEN              16
 0000           ; #define MMC_READ_SINGLE_BLOCK         17
 0000           ; #define MMC_WRITE_BLOCK                       24
 0000           ; #define MMC_PROGRAM_CSD                       27
 0000           ; #define MMC_SET_WRITE_PROT            28
 0000           ; #define MMC_CLR_WRITE_PROT            29
 0000           ; #define MMC_SEND_WRITE_PROT           30
 0000           ; #define MMC_TAG_SECTOR_START          32
 0000           ; #define MMC_TAG_SECTOR_END            33
 0000           ; #define MMC_UNTAG_SECTOR              34
 0000           ; #define MMC_TAG_ERASE_GROUP_START     35
 0000           ; #define MMC_TAG_ERARE_GROUP_END               36
 0000           ; #define MMC_UNTAG_ERASE_GROUP         37
 0000           ; #define MMC_ERASE                     38
 0000           ; #define MMC_CRC_ON_OFF                        59
 0000           ; 
 0000           ; #define R1_BUSY                               128
 0000           ; #define R1_PARAMETER                   64
 0000           ; #define R1_ADDRESS                     32
 0000           ; #define R1_ERASE_SEQ                   16
 0000           ; #define R1_COM_CRC                      8
 0000           ; #define R1_ILLEGAL_COM                          4
 0000           ; #define R1_ERASE_RESET                          2
 0000           ; #define R1_IDLE_STATE                   1
 0000           ; 
 0000           ; #define led1_off      (PORTA|=(1<<6))
 0000           ; #define led1_on       (PORTA&=~(1<<6))
 0000           ; #define led2_off      (PORTA|=(1<<5))
 0000           ; #define led2_on       (PORTA&=~(1<<5))
 0000           ; 
 0000           ; #define disable_mmc_cs        (PORTB|=(1<<0))
 0000           ; #define enable_mmc_cs (PORTB&=~(1<<0))
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; unsigned char  ram_data[512];
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; extern void LCD_write(unsigned char data,unsigned char dc); 
 0000           ; 
 0000           ; /***********SPI初始化******************/
 0000           ; void SPI_masterinit(void) 
 0000           ;      {
 0000                   .dbline 54
 0000           ;                             //不中断 允许    主模式            fck/4   
 0000           ;       SPCR=0b01010000;              //SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
 0000 80E5              ldi R24,80
 0002 8DB9              out 0xd,R24
 0004                   .dbline -2
 0004                   .dbline 56
 0004           ; 
 0004           ;        }
 0004           L1:
 0004                   .dbline 0 ; func end
 0004 0895              ret
 0006                   .dbend
 0006                   .dbfunc e SPI_tx_rx _SPI_tx_rx fc
 0006           ;       spi_data -> R16
                        .even
 0006           _SPI_tx_rx::
 0006                   .dbline -1
 0006                   .dbline 61
 0006           ;       
 0006           ; /***********SPI读取/写入****基础SPI传送命令******/
 0006           ; unsigned char SPI_tx_rx(unsigned char spi_data);
 0006           ; unsigned char SPI_tx_rx(unsigned char spi_data) 
 0006           ;      {
 0006                   .dbline 62
 0006           ;        SPDR=spi_data;
 0006 0FB9              out 0xf,R16
 0008           L3:
 0008                   .dbline 63
 0008           L4:
 0008                   .dbline 63
 0008           ;        while (!(SPSR&0x80));
 0008 779B              sbis 0xe,7
 000A FECF              rjmp L3
 000C                   .dbline 64
 000C           ;        return SPDR;
 000C 0FB1              in R16,0xf
 000E                   .dbline -2
 000E           L2:
 000E                   .dbline 0 ; func end
 000E 0895              ret
 0010                   .dbsym r spi_data 16 c
 0010                   .dbend
 0010                   .dbfunc e MMC_sendCmd _MMC_sendCmd fc
 0010           ;           temp -> R20
 0010           ;           A7_0 -> y+8
 0010           ;          A15_8 -> y+6
 0010           ;         A23_16 -> y+4
 0010           ;         A31_24 -> R20
 0010           ;            cmd -> R22
                        .even
 0010           _MMC_sendCmd::
 0010 0E940000          xcall push_gset2
 0014 422F              mov R20,R18
 0016 602F              mov R22,R16
 0018                   .dbline -1
 0018                   .dbline 69
 0018           ;        }
 0018           ; /***********MMC_sendCmd();*****基础传送命令*******/
 0018           ; unsigned char MMC_sendCmd(unsigned char cmd,unsigned char A31_24,unsigned char A23_16,unsigned char A15_8,unsigned char A7_0);
 0018           ; unsigned char MMC_sendCmd(unsigned char cmd,unsigned char A31_24,unsigned char A23_16,unsigned char A15_8,unsigned char A7_0)
 0018           ;      {
 0018                   .dbline 71
 0018           ;        signed char temp;
 0018           ;        enable_mmc_cs;
 0018 C098              cbi 0x18,0
 001A                   .dbline 73
 001A           ; 
 001A           ;        SPI_tx_rx(cmd|0x40);       //cmd"01xxxxxx"
 001A 062F              mov R16,R22
 001C 0064              ori R16,64
 001E F3DF              xcall _SPI_tx_rx
 0020                   .dbline 74
 0020           ;        SPI_tx_rx(A31_24);
 0020 042F              mov R16,R20
 0022 F1DF              xcall _SPI_tx_rx
 0024                   .dbline 75
 0024           ;        SPI_tx_rx(A23_16);
 0024 0C81              ldd R16,y+4
 0026 EFDF              xcall _SPI_tx_rx
 0028                   .dbline 76
 0028           ;        SPI_tx_rx(A15_8);
 0028 0E81              ldd R16,y+6
 002A EDDF              xcall _SPI_tx_rx
 002C                   .dbline 77
 002C           ;        SPI_tx_rx(A7_0);
 002C 0885              ldd R16,y+8
 002E EBDF              xcall _SPI_tx_rx
 0030                   .dbline 78
 0030           ;        SPI_tx_rx(0x95);          //crc for cmd0
 0030 05E9              ldi R16,149
 0032 E9DF              xcall _SPI_tx_rx
 0034                   .dbline 80
 0034           ; 
 0034           ;        SPI_tx_rx(0xff);         //one empty cycle
 0034 0FEF              ldi R16,255
 0036 E7DF              xcall _SPI_tx_rx
 0038                   .dbline 82
 0038           ;  
 0038           ;        temp=SPI_tx_rx(0xff);    //0=busy 
 0038 0FEF              ldi R16,255
 003A E5DF              xcall _SPI_tx_rx
 003C 402F              mov R20,R16
 003E                   .dbline 84
 003E           ; //LCD_write(temp,1);  //test point
 003E           ;        if ((temp-0x80)>=0)         //0b1xxxxxxx=err
 003E 842F              mov R24,R20
 0040 8058              subi R24,128
 0042 8030              cpi R24,0
 0044 34F0              brlt L7
 0046                   .dbline 85
 0046           ;                  {
 0046                   .dbline 86
 0046           ;                  temp=0xff;
 0046 4FEF              ldi R20,255
 0048           L9:
 0048                   .dbline 87
 0048           L10:
 0048                   .dbline 87
 0048           ;                  while (SPI_tx_rx(0xff)==0);  
 0048 0FEF              ldi R16,255
 004A DDDF              xcall _SPI_tx_rx
 004C 0023              tst R16
 004E E1F3              breq L9
 0050                   .dbline 89
 0050           ; //               led1_on;  //test point
 0050           ;                  }
 0050 0EC0              xjmp L8
 0052           L7:
 0052                   .dbline 91
 0052           ;        else 
 0052           ;                 if (cmd==MMC_SEND_STATUS)    //如果是读状态命令
 0052 6D30              cpi R22,13
 0054 41F4              brne L18
 0056                   .dbline 92
 0056           ;                         {
 0056                   .dbline 93
 0056           ;                         temp=SPI_tx_rx(0xff);       //read STATUS
 0056 0FEF              ldi R16,255
 0058 D6DF              xcall _SPI_tx_rx
 005A 402F              mov R20,R16
 005C           L14:
 005C                   .dbline 94
 005C           L15:
 005C                   .dbline 94
 005C           ;                         while (SPI_tx_rx(0xff)==0);  
 005C 0FEF              ldi R16,255
 005E D3DF              xcall _SPI_tx_rx
 0060 0023              tst R16
 0062 E1F3              breq L14
 0064                   .dbline 96
 0064           ;                        // led1_on;
 0064           ;                         }
 0064 04C0              xjmp L13
 0066           X0:
 0066                   .dbline 98
 0066           ;                 else                            //是其他命令
 0066           ;                         {
 0066           L17:
 0066                   .dbline 99
 0066           L18:
 0066                   .dbline 99
 0066           ;                         while (SPI_tx_rx(0xff)==0);  
 0066 0FEF              ldi R16,255
 0068 CEDF              xcall _SPI_tx_rx
 006A 0023              tst R16
 006C E1F3              breq L17
 006E                   .dbline 101
 006E           ;                       //  led1_on;
 006E           ;                         }
 006E           L13:
 006E           L8:
 006E                   .dbline 102
 006E           ;        return temp;                             
 006E 042F              mov R16,R20
 0070                   .dbline -2
 0070           L6:
 0070 0E940000          xcall pop_gset2
 0074                   .dbline 0 ; func end
 0074 0895              ret
 0076                   .dbsym r temp 20 C
 0076                   .dbsym l A7_0 8 c
 0076                   .dbsym l A15_8 6 c
 0076                   .dbsym l A23_16 4 c
 0076                   .dbsym r A31_24 20 c
 0076                   .dbsym r cmd 22 c
 0076                   .dbend
 0076                   .dbfunc e MMC_finish _MMC_finish fV
                        .even
 0076           _MMC_finish::
 0076                   .dbline -1
 0076                   .dbline 106
 0076           ;        }      
 0076           ; /***********MMC_finish();***停止卡片******/
 0076           ; void MMC_finish(void)
 0076           ;      {
 0076                   .dbline 107
 0076           ;         disable_mmc_cs;
 0076 C09A              sbi 0x18,0
 0078                   .dbline 108
 0078           ;         SPI_tx_rx(0xff);
 0078 0FEF              ldi R16,255
 007A                   .dbline -2
 007A                   .dbline 109
 007A           ;        }
 007A           L20:
 007A                   .dbline 0 ; func end
 007A C5CF              xjmp _SPI_tx_rx
 007C                   .dbend
 007C                   .dbfunc e MMC_flush _MMC_flush fV
 007C           ;        counter -> R20
 007C           ;      flush_num -> R22
                        .even
 007C           _MMC_flush::
 007C 0E940000          xcall push_gset2
 0080 602F              mov R22,R16
 0082                   .dbline -1
 0082                   .dbline 114
 0082           ; 
 0082           ; /***********MMC_flush();*****丢弃几个字节*******/
 0082           ; void MMC_flush(unsigned char flush_num);
 0082           ; void MMC_flush(unsigned char flush_num)
 0082           ;      {
 0082                   .dbline 116
 0082 4427              clr R20
 0084 03C0              xjmp L25
 0086           L22:
 0086                   .dbline 116
 0086 0FEF              ldi R16,255
 0088 BEDF              xcall _SPI_tx_rx
 008A           L23:
 008A                   .dbline 116
 008A 4395              inc R20
 008C           L25:
 008C                   .dbline 116
 008C           ;        unsigned char counter;
 008C           ;        for (counter=0;counter<flush_num;counter++) SPI_tx_rx(0xff); //丢弃几个字节
 008C 4617              cp R20,R22
 008E D8F3              brlo L22
 0090                   .dbline 117
 0090           ;        MMC_finish();    
 0090 F2DF              xcall _MMC_finish
 0092                   .dbline -2
 0092                   .dbline 118
 0092           ;        }
 0092           L21:
 0092 0E940000          xcall pop_gset2
 0096                   .dbline 0 ; func end
 0096 0895              ret
 0098                   .dbsym r counter 20 c
 0098                   .dbsym r flush_num 22 c
 0098                   .dbend
 0098                   .dbfunc e MMC_reset _MMC_reset fV
 0098           ;        lcd_add -> <dead>
 0098           ;   mmc_response -> R20
 0098           ;        counter -> R22
                        .even
 0098           _MMC_reset::
 0098 0E940000          xcall push_gset2
 009C 2597              sbiw R28,5
 009E                   .dbline -1
 009E                   .dbline 122
 009E           ;                                                       
 009E           ; /***********MMC_reset();***将MMC卡转到SPI模式****/
 009E           ; void MMC_reset(void)
 009E           ;      {
 009E                   .dbline 124
 009E 6627              clr R22
 00A0 03C0              xjmp L30
 00A2           L27:
 00A2                   .dbline 124
 00A2 0FEF              ldi R16,255
 00A4 B0DF              xcall _SPI_tx_rx
 00A6           L28:
 00A6                   .dbline 124
 00A6 6395              inc R22
 00A8           L30:
 00A8                   .dbline 124
 00A8           ;         unsigned char counter,mmc_response,lcd_add;
 00A8           ;         for (counter=0;counter<11;counter++) SPI_tx_rx(0xff);//80个时钟开始总线
 00A8 6B30              cpi R22,11
 00AA D8F3              brlo L27
 00AC                   .dbline 126
 00AC           ; 
 00AC           ;         mmc_response=MMC_sendCmd(MMC_GO_IDLE_STATE,0,0,0,0);   //send cmd0
 00AC 2224              clr R2
 00AE 2C82              std y+4,R2
 00B0 2A82              std y+2,R2
 00B2 2882              std y+0,R2
 00B4 2227              clr R18
 00B6 0027              clr R16
 00B8 ABDF              xcall _MMC_sendCmd
 00BA 402F              mov R20,R16
 00BC                   .dbline 127
 00BC           ;         MMC_finish();
 00BC DCDF              xcall _MMC_finish
 00BE                   .dbline 129
 00BE           ;         

⌨️ 快捷键说明

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