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

📄 sd.lis

📁 AVR单片机做的MP3
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module sd.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
 0000                   .dbfunc e SPI_ReadByte _SPI_ReadByte fc
                        .even
 0000           _SPI_ReadByte::
 0000                   .dbline -1
 0000                   .dbline 9
 0000           ; #include<iom16v.h>
 0000           ; #include<main.h>
 0000           ; #include<sd.h>
 0000           ; 
 0000           ; 
 0000           ; extern uint8 BUFFER[512];
 0000           ; 
 0000           ; uint8 SPI_ReadByte(void)
 0000           ; {
 0000                   .dbline 10
 0000           ;    SPDR = 0xFF;
 0000 8FEF              ldi R24,255
 0002 8FB9              out 0xf,R24
 0004           L2:
 0004                   .dbline 11
 0004           L3:
 0004                   .dbline 11
 0004           ;    while (!(SPSR & 0x80)); 
 0004 779B              sbis 0xe,7
 0006 FECF              rjmp L2
 0008                   .dbline 12
 0008           ;    return SPDR;
 0008 0FB1              in R16,0xf
 000A                   .dbline -2
 000A           L1:
 000A                   .dbline 0 ; func end
 000A 0895              ret
 000C                   .dbend
 000C                   .dbfunc e SPI_TransferByte _SPI_TransferByte fV
 000C           ;           cmp1 -> R16
                        .even
 000C           _SPI_TransferByte::
 000C                   .dbline -1
 000C                   .dbline 15
 000C           ; }
 000C           ; void SPI_TransferByte(uint8 cmp1)  
 000C           ; {   
 000C                   .dbline 16
 000C           ;  SPDR=cmp1;
 000C 0FB9              out 0xf,R16
 000E           L6:
 000E                   .dbline 17
 000E           L7:
 000E                   .dbline 17
 000E           ;  while(!(SPSR&(1<<SPIF)));    
 000E 779B              sbis 0xe,7
 0010 FECF              rjmp L6
 0012                   .dbline -2
 0012           L5:
 0012                   .dbline 0 ; func end
 0012 0895              ret
 0014                   .dbsym r cmp1 16 c
 0014                   .dbend
 0014                   .dbfunc e SD_Port_Init _SD_Port_Init fV
                        .even
 0014           _SD_Port_Init::
 0014                   .dbline -1
 0014                   .dbline 22
 0014           ; } 
 0014           ; 
 0014           ; void SD_Port_Init(void)
 0014           ; //****************************************************************************
 0014           ; {
 0014                   .dbline 23
 0014           ;         SD_PORT        |=  (1<<SD_SS);//(1<<SD_SCK)
 0014 C49A              sbi 0x18,4
 0016                   .dbline 24
 0016           ;         SD_DDR         |=  (1<<SD_SCK)|(1<<SD_MOSI)|(1<<SD_SS);
 0016 87B3              in R24,0x17
 0018 806B              ori R24,176
 001A 87BB              out 0x17,R24
 001C                   .dbline 25
 001C           ;         SD_DDR         &= ~(1<<SD_MISO);
 001C BE98              cbi 0x17,6
 001E                   .dbline 26
 001E           ;               SD_Disable();
 001E C49A              sbi 0x18,4
 0020                   .dbline -2
 0020           L9:
 0020                   .dbline 0 ; func end
 0020 0895              ret
 0022                   .dbend
                        .area lit(rom, con, rel)
 0000           L11:
 0000 4000              .byte 64,0
 0002 0000              .byte 0,0
 0004 0095              .byte 0,149
                        .area text(rom, con, rel)
 0022                   .dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
 0022                   .dbfunc e SD_Init _SD_Init fc
 0022           ;          retry -> R20
 0022           ;            CMD -> y+0
 0022           ;           temp -> R22
 0022           ;              i -> R10
                        .even
 0022           _SD_Init::
 0022 00D0              rcall push_gset3
 0024 2697              sbiw R28,6
 0026                   .dbline -1
 0026                   .dbline 33
 0026           ; }
 0026           ; 
 0026           ; //****************************************************************************
 0026           ; //Routine for Init MMC/SD card(SPI-MODE)
 0026           ; uint8 SD_Init(void)
 0026           ; //****************************************************************************
 0026           ; {
 0026                   .dbline 37
 0026           ;         uint8 retry,temp;
 0026           ;         uint8 i;
 0026           ; 
 0026           ;        uint8 CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
 0026 80E0              ldi R24,<L11
 0028 90E0              ldi R25,>L11
 002A FE01              movw R30,R28
 002C 06E0              ldi R16,6
 002E 10E0              ldi R17,0
 0030 FA93              st -y,R31
 0032 EA93              st -y,R30
 0034 9A93              st -y,R25
 0036 8A93              st -y,R24
 0038 00D0              rcall asgncblk
 003A                   .dbline 38
 003A           ;    SD_Port_Init(); //Init SPI port  
 003A ECDF              rcall _SD_Port_Init
 003C                   .dbline 40
 003C AA24              clr R10
 003E 02C0              rjmp L15
 0040           L12:
 0040                   .dbline 40
 0040 0000              nop
 0042           L13:
 0042                   .dbline 40
 0042 A394              inc R10
 0044           L15:
 0044                   .dbline 40
 0044           ; 
 0044           ;    for (i = 0; i < 200; i++) asm("nop"); //Wait MMC/SD ready...
 0044 8A2D              mov R24,R10
 0046 883C              cpi R24,200
 0048 D8F3              brlo L12
 004A                   .dbline 43
 004A           ;    
 004A           ;    //Active SPI bus at low speed 
 004A           ;    SPCR=0x53; //SPI Master,MSB First 
 004A 83E5              ldi R24,83
 004C 8DB9              out 0xd,R24
 004E                   .dbline 44
 004E           ;    SPSR=0x00; //double speed disable,Fsck=Fosc/128 
 004E 2224              clr R2
 0050 2EB8              out 0xe,R2
 0052                   .dbline 46
 0052           ; 
 0052           ;    for (i = 0; i < 16; i++)
 0052 AA24              clr R10
 0054 03C0              rjmp L19
 0056           L16:
 0056                   .dbline 47
 0056 0FEF              ldi R16,255
 0058 D9DF              rcall _SPI_TransferByte
 005A           L17:
 005A                   .dbline 46
 005A A394              inc R10
 005C           L19:
 005C                   .dbline 46
 005C 8A2D              mov R24,R10
 005E 8031              cpi R24,16
 0060 D0F3              brlo L16
 0062                   .dbline 50
 0062           ;       SPI_TransferByte(0xff); //send 74 clock at least!!! 
 0062           ;       
 0062           ;    //Send Command CMD0 to MMC/SD Card
 0062           ;    SD_Enable();
 0062 C498              cbi 0x18,4
 0064                   .dbline 51
 0064           ;    retry = 0;
 0064 4427              clr R20
 0066           L20:
 0066                   .dbline 53
 0066           ;    do
 0066           ;    { //retry 200 times to send CMD0 command 
 0066                   .dbline 54
 0066           ;      temp = Write_Command_SD(CMD);
 0066 8E01              movw R16,R28
 0068 26D0              rcall _Write_Command_SD
 006A 602F              mov R22,R16
 006C                   .dbline 55
 006C           ;      if (retry++ == 200) 
 006C 242E              mov R2,R20
 006E 3324              clr R3
 0070 4F5F              subi R20,255    ; addi 1
 0072 822D              mov R24,R2
 0074 883C              cpi R24,200
 0076 11F4              brne L23
 0078                   .dbline 56
 0078           ;        return INIT_CMD0_ERROR;//CMD0 Error!
 0078 01E0              ldi R16,1
 007A 1AC0              rjmp L10
 007C           L23:
 007C                   .dbline 57
 007C           ;    }
 007C           L21:
 007C                   .dbline 58
 007C           ;    while (temp != 1);
 007C 6130              cpi R22,1
 007E 99F7              brne L20
 0080                   .dbline 61
 0080           ;    
 0080           ;    //Send Command CMD1 to MMC/SD-Card
 0080           ;    CMD[0] = 0x41; //Command 1
 0080 81E4              ldi R24,65
 0082 8883              std y+0,R24
 0084                   .dbline 62
 0084           ;    CMD[5] = 0xFF;
 0084 8FEF              ldi R24,255
 0086 8D83              std y+5,R24
 0088                   .dbline 63
 0088           ;    retry = 0;
 0088 4427              clr R20
 008A           L26:
 008A                   .dbline 65
 008A           ;    do
 008A           ;    { //retry 100 times to send CMD1 command 
 008A                   .dbline 66
 008A           ;      temp = Write_Command_SD(CMD);
 008A 8E01              movw R16,R28
 008C 14D0              rcall _Write_Command_SD
 008E 602F              mov R22,R16
 0090                   .dbline 67
 0090           ;      if (retry++ == 100) 
 0090 242E              mov R2,R20
 0092 3324              clr R3
 0094 4F5F              subi R20,255    ; addi 1
 0096 822D              mov R24,R2
 0098 8436              cpi R24,100
 009A 11F4              brne L29
 009C                   .dbline 68
 009C           ;        return INIT_CMD1_ERROR;//CMD1 Error!
 009C 02E0              ldi R16,2
 009E 08C0              rjmp L10
 00A0           L29:
 00A0                   .dbline 69
 00A0           ;    } 
 00A0           L27:
 00A0                   .dbline 70
 00A0           ;    while (temp != 0);
 00A0 6623              tst R22
 00A2 99F7              brne L26
 00A4                   .dbline 73
 00A4           ;    
 00A4           ;    //Active High-speed SPI mode(Fsck=Fosc/2) 
 00A4           ;    SPCR = 0x50; 
 00A4 80E5              ldi R24,80
 00A6 8DB9              out 0xd,R24
 00A8                   .dbline 74
 00A8           ;    SPSR = 0x00; 
 00A8 2224              clr R2
 00AA 2EB8              out 0xe,R2
 00AC                   .dbline 76
 00AC           ; 
 00AC           ;    SD_Disable();  //set MMC_Chip_Select to high 
 00AC C49A              sbi 0x18,4
 00AE                   .dbline 77
 00AE           ;    return INIT_OK; //All commands have been taken.
 00AE 0027              clr R16
 00B0                   .dbline -2
 00B0           L10:
 00B0 2696              adiw R28,6
 00B2 00D0              rcall pop_gset3
 00B4                   .dbline 0 ; func end
 00B4 0895              ret
 00B6                   .dbsym r retry 20 c
 00B6                   .dbsym l CMD 0 A[6:6]c
 00B6                   .dbsym r temp 22 c
 00B6                   .dbsym r i 10 c
 00B6                   .dbend
 00B6                   .dbfunc e Write_Command_SD _Write_Command_SD fc
 00B6           ;          retry -> R20
 00B6           ;              i -> R22
 00B6           ;            tmp -> R10
 00B6           ;            cmd -> R12,R13
                        .even
 00B6           _Write_Command_SD::
 00B6 00D0              rcall push_gset4
 00B8 6801              movw R12,R16
 00BA                   .dbline -1
 00BA                   .dbline 85
 00BA           ; }
 00BA           ; 
 00BA           ; //****************************************************************************
 00BA           ; //Send a Command to MMC/SD-Card
 00BA           ; //Return: the second byte of response register of MMC/SD-Card
 00BA           ; uint8 Write_Command_SD(uint8 *cmd)
 00BA           ; //****************************************************************************
 00BA           ; {
 00BA                   .dbline 87
 00BA           ;         uint8 tmp,i;
 00BA           ;         uint8 retry=0;
 00BA 4427              clr R20
 00BC                   .dbline 88
 00BC           ;         SD_Disable();
 00BC C49A              sbi 0x18,4
 00BE                   .dbline 89
 00BE           ;               SPI_TransferByte(0xFF);

⌨️ 快捷键说明

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