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

📄 sd.lis

📁 M16-Mp3.rar
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module sd.c
                        .area text(rom, con, rel)
 0000                   .dbfile ..\..\..\..\..\DOCUME~1\浪仔\桌面\教学实验板\M16_VS1003_test\sd.c
 0000                   .dbfile C:\DOCUME~1\浪仔\桌面\教学实验板\M16_VS1003_test\sd.c
 0000                   .dbfunc e SD_Port_Init _SD_Port_Init fV
                        .even
 0000           _SD_Port_Init::
 0000                   .dbline -1
 0000                   .dbline 19
 0000           ; 
 0000           ; 
 0000           ; //---------------------------- SD卡驱动程序 ----------------------------
 0000           ; //
 0000           ; //简化版SD卡驱动程序
 0000           ; //整理日期:2009.7.8
 0000           ; //
 0000           ; //------------------------------------------------------------------------
 0000           ; 
 0000           ; #include"sd.h"
 0000           ; 
 0000           ; 
 0000           ; //---------------------------------
 0000           ; //
 0000           ; //     SD卡接口初始化函数 
 0000           ; //
 0000           ; //---------------------------------
 0000           ; void SD_Port_Init(void)
 0000           ; {
 0000                   .dbline 20
 0000           ;  SD_CS_DDR |= 1<<SD_CS_BIT;
 0000 D19A              sbi 0x1a,1
 0002                   .dbline 21
 0002           ;  SD_CS_PORT |= 1<<SD_CS_BIT;
 0002 D99A              sbi 0x1b,1
 0004                   .dbline -2
 0004           L1:
 0004                   .dbline 0 ; func end
 0004 0895              ret
 0006                   .dbend
 0006                   .dbfunc e SD_SendCommand _SD_SendCommand fc
 0006           ;          retry -> R22
 0006           ;             r1 -> R20
 0006           ;            arg -> y+6
 0006           ;            cmd -> R10
                        .even
 0006           _SD_SendCommand::
 0006 3A93              st -y,r19
 0008 2A93              st -y,r18
 000A 0E940000          xcall push_xgsetF00C
 000E A02E              mov R10,R16
 0010                   .dbline -1
 0010                   .dbline 34
 0010           ; }
 0010           ; 
 0010           ; 
 0010           ; 
 0010           ; //---------------------------------
 0010           ; //
 0010           ; // SD卡写寄存器函数 
 0010           ; // arg:命令
 0010           ; // cmd:命令号
 0010           ; //
 0010           ; //---------------------------------
 0010           ; uint8 SD_SendCommand(uint8 cmd, uint32 arg)
 0010           ; {
 0010                   .dbline 35
 0010           ;       uint8 r1=1;
 0010 41E0              ldi R20,1
 0012                   .dbline 36
 0012           ;       uint8 retry=0;
 0012 6627              clr R22
 0014                   .dbline 39
 0014           ;       
 0014           ; 
 0014           ;       SPI_SrByte(0xff);
 0014 0FEF              ldi R16,255
 0016 0E940000          xcall _SPI_SrByte
 001A                   .dbline 40
 001A           ;       SPI_CS_Assert;
 001A D998              cbi 0x1b,1
 001C           L3:
 001C                   .dbline 41
 001C           ;       while(r1--);
 001C           L4:
 001C                   .dbline 41
 001C 242E              mov R2,R20
 001E 3324              clr R3
 0020 4150              subi R20,1
 0022 2220              tst R2
 0024 D9F7              brne L3
 0026           X0:
 0026                   .dbline 43
 0026           ;       
 0026           ;       SPI_SrByte((cmd & 0x3f) | 0x40);        /* send command */
 0026 0A2D              mov R16,R10
 0028 0F73              andi R16,63
 002A 0064              ori R16,64
 002C 0E940000          xcall _SPI_SrByte
 0030                   .dbline 45
 0030           ;       
 0030           ;       SPI_SrByte(arg>>24);
 0030 88E1              ldi R24,24
 0032 90E0              ldi R25,0
 0034 0E81              ldd R16,y+6
 0036 1F81              ldd R17,y+7
 0038 2885              ldd R18,y+8
 003A 3985              ldd R19,y+9
 003C 8A93              st -y,R24
 003E 0E940000          xcall lsr32
 0042 0E940000          xcall _SPI_SrByte
 0046                   .dbline 46
 0046           ;       SPI_SrByte(arg>>16);
 0046 2E80              ldd R2,y+6
 0048 3F80              ldd R3,y+7
 004A 4884              ldd R4,y+8
 004C 5984              ldd R5,y+9
 004E 1201              movw R2,R4
 0050 4424              clr R4
 0052 5524              clr R5
 0054 022D              mov R16,R2
 0056 0E940000          xcall _SPI_SrByte
 005A                   .dbline 47
 005A           ;       SPI_SrByte(arg>>8);
 005A 88E0              ldi R24,8
 005C 90E0              ldi R25,0
 005E 0E81              ldd R16,y+6
 0060 1F81              ldd R17,y+7
 0062 2885              ldd R18,y+8
 0064 3985              ldd R19,y+9
 0066 8A93              st -y,R24
 0068 0E940000          xcall lsr32
 006C 0E940000          xcall _SPI_SrByte
 0070                   .dbline 48
 0070           ;       SPI_SrByte(arg);
 0070 0E81              ldd R16,y+6
 0072 0E940000          xcall _SPI_SrByte
 0076                   .dbline 50
 0076           ;       
 0076           ;       SPI_SrByte(0x95);
 0076 05E9              ldi R16,149
 0078 0E940000          xcall _SPI_SrByte
 007C                   .dbline 52
 007C           ;       
 007C           ;       SPI_SrByte(0xff);
 007C 0FEF              ldi R16,255
 007E 0E940000          xcall _SPI_SrByte
 0082 07C0              xjmp L7
 0084           L6:
 0084                   .dbline 54
 0084           ;       while((r1 = SPI_SrByte(0xff)) == 0xff)  /* wait response */
 0084           ;               if(retry++ > 0xfe) break;                               /* time out error */
 0084 262E              mov R2,R22
 0086 3324              clr R3
 0088 6F5F              subi R22,255    ; addi 1
 008A 8EEF              ldi R24,254
 008C 8215              cp R24,R2
 008E 08F4              brsh L9
 0090           X1:
 0090                   .dbline 54
 0090 07C0              xjmp L8
 0092           L9:
 0092           L7:
 0092                   .dbline 53
 0092 0FEF              ldi R16,255
 0094 0E940000          xcall _SPI_SrByte
 0098 A02E              mov R10,R16
 009A 4A2D              mov R20,R10
 009C 0F3F              cpi R16,255
 009E 91F3              breq L6
 00A0           X2:
 00A0           L8:
 00A0                   .dbline 56
 00A0           ; 
 00A0           ;       SPI_CS_Deassert;
 00A0 D99A              sbi 0x1b,1
 00A2                   .dbline 57
 00A2           ;       SPI_SrByte(0xff);                               // extra 8 CLK
 00A2 0FEF              ldi R16,255
 00A4 0E940000          xcall _SPI_SrByte
 00A8                   .dbline 59
 00A8           ; 
 00A8           ;       return r1;                                                              /* return state */
 00A8 042F              mov R16,R20
 00AA                   .dbline -2
 00AA           L2:
 00AA                   .dbline 0 ; func end
 00AA 0E940000          xcall pop_xgsetF00C
 00AE 2296              adiw R28,2
 00B0 0895              ret
 00B2                   .dbsym r retry 22 c
 00B2                   .dbsym r r1 20 c
 00B2                   .dbsym l arg 6 l
 00B2                   .dbsym r cmd 10 c
 00B2                   .dbend
 00B2                   .dbfunc e SD_Init _SD_Init fc
 00B2           ;          retry -> R10
 00B2           ;             r1 -> R20
 00B2           ;              i -> R22
                        .even
 00B2           _SD_Init::
 00B2 0E940000          xcall push_xgsetF00C
 00B6 2297              sbiw R28,2
 00B8                   .dbline -1
 00B8                   .dbline 69
 00B8           ; }
 00B8           ; 
 00B8           ; 
 00B8           ; //---------------------------------
 00B8           ; //
 00B8           ; //        SD卡初始化函数 
 00B8           ; //
 00B8           ; //---------------------------------
 00B8           ; uint8 SD_Init(void)
 00B8           ; {
 00B8                   .dbline 72
 00B8           ;     
 00B8           ;       uint8 i;
 00B8           ;       uint8 retry = 0;
 00B8 AA24              clr R10
 00BA                   .dbline 73
 00BA           ;       uint8 r1 = 0;
 00BA 4427              clr R20
 00BC                   .dbline 75
 00BC           ;       
 00BC           ;       SD_Port_Init();
 00BC A1DF              xcall _SD_Port_Init
 00BE                   .dbline 77
 00BE           ;       
 00BE           ;       SPI_CS_Assert;
 00BE D998              cbi 0x1b,1
 00C0                   .dbline 78
 00C0           ;       delay_ms(1);
 00C0 01E0              ldi R16,1
 00C2 10E0              ldi R17,0
 00C4 20E0              ldi R18,0
 00C6 30E0              ldi R19,0
 00C8 0E940000          xcall _delay_ms
 00CC                   .dbline 79
 00CC           ;       SPI_CS_Deassert;
 00CC D99A              sbi 0x1b,1
 00CE                   .dbline 80
 00CE           ;       delay_ms(1);
 00CE 01E0              ldi R16,1
 00D0 10E0              ldi R17,0
 00D2 20E0              ldi R18,0
 00D4 30E0              ldi R19,0
 00D6 0E940000          xcall _delay_ms
 00DA                   .dbline 83
 00DA           ;       
 00DA           ;       
 00DA           ;       SPI_Low();      
 00DA 0E940000          xcall _SPI_Low
 00DE           L12:
 00DE                   .dbline 86
 00DE           ;       
 00DE           ;       do
 00DE           ;       {
 00DE                   .dbline 87
 00DE           ;               for(i=0;i<10;i++) SPI_SrByte(0xff);
 00DE 6627              clr R22
 00E0 04C0              xjmp L18
 00E2           L15:
 00E2                   .dbline 87
 00E2 0FEF              ldi R16,255
 00E4 0E940000          xcall _SPI_SrByte
 00E8           L16:
 00E8                   .dbline 87
 00E8 6395              inc R22
 00EA           L18:
 00EA                   .dbline 87
 00EA 6A30              cpi R22,10
 00EC D0F3              brlo L15
 00EE           X3:
 00EE                   .dbline 88
 00EE           ;               r1 = SD_SendCommand(0, 0);//发idle命令  //send idle command
 00EE 80E0              ldi R24,0
 00F0 90E0              ldi R25,0
 00F2 A0E0              ldi R26,0
 00F4 B0E0              ldi R27,0
 00F6 A883              std y+0,R26
 00F8 B983              std y+1,R27
 00FA 9C01              movw R18,R24
 00FC 0027              clr R16
 00FE 83DF              xcall _SD_SendCommand
 0100 402F              mov R20,R16
 0102                   .dbline 89
 0102           ;               retry++;
 0102 A394              inc R10
 0104                   .dbline 90
 0104           ;               if(retry>0xfe) return 1;//超时退出              //time out
 0104 8EEF              ldi R24,254
 0106 8A15              cp R24,R10
 0108 10F4              brsh L19
 010A           X4:
 010A                   .dbline 90
 010A 01E0              ldi R16,1
 010C 2CC0              xjmp L11
 010E           L19:
 010E                   .dbline 91
 010E           ;       } while(r1 != 0x01);    
 010E           L13:
 010E                   .dbline 91
 010E 4130              cpi R20,1
 0110 31F7              brne L12
 0112           X5:
 0112                   .dbline 94
 0112           ; 
 0112           ; 
 0112           ;       retry = 0;
 0112 AA24              clr R10
 0114           L21:
 0114                   .dbline 96
 0114           ;       do
 0114           ;       {
 0114                   .dbline 97
 0114           ;               r1 = SD_SendCommand(1, 0);//发active命令        //send active command
 0114 80E0              ldi R24,0
 0116 90E0              ldi R25,0
 0118 A0E0              ldi R26,0
 011A B0E0              ldi R27,0
 011C A883              std y+0,R26
 011E B983              std y+1,R27
 0120 9C01              movw R18,R24
 0122 01E0              ldi R16,1
 0124 70DF              xcall _SD_SendCommand
 0126 402F              mov R20,R16
 0128                   .dbline 98
 0128           ;               retry++;
 0128 A394              inc R10
 012A                   .dbline 99
 012A           ;               if(retry>0xfe) return 1;//超时退出              //time out
 012A 8EEF              ldi R24,254
 012C 8A15              cp R24,R10
 012E 10F4              brsh L24
 0130           X6:
 0130                   .dbline 99
 0130 01E0              ldi R16,1
 0132 19C0              xjmp L11
 0134           L24:
 0134                   .dbline 100
 0134           ;       } while(r1);
 0134           L22:
 0134                   .dbline 100
 0134 4423              tst R20
 0136 71F7              brne L21
 0138           X7:
 0138                   .dbline 102
 0138           ;       
 0138           ;       SPI_High();             /* Use High Speed SPI*/
 0138 0E940000          xcall _SPI_High
 013C                   .dbline 104
 013C           ;       
 013C           ;       r1 = SD_SendCommand(59, 0);//关crc              //disable CRC
 013C 80E0              ldi R24,0
 013E 90E0              ldi R25,0
 0140 A0E0              ldi R26,0
 0142 B0E0              ldi R27,0
 0144 A883              std y+0,R26
 0146 B983              std y+1,R27
 0148 9C01              movw R18,R24
 014A 0BE3              ldi R16,59
 014C 5CDF              xcall _SD_SendCommand
 014E                   .dbline 106
 014E           ; 
 014E           ;       r1 = SD_SendCommand(16, 512);//设扇区大小512    //set sector size to 512
 014E 80E0              ldi R24,0
 0150 92E0              ldi R25,2
 0152 A0E0              ldi R26,0
 0154 B0E0              ldi R27,0
 0156 A883              std y+0,R26
 0158 B983              std y+1,R27
 015A 9C01              movw R18,R24
 015C 00E1              ldi R16,16
 015E 53DF              xcall _SD_SendCommand
 0160 A02E              mov R10,R16

⌨️ 快捷键说明

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