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

📄 sd.lis

📁 AVR单片机系统开发经典实例部分源程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module sd.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\AVR\M\1\sd.c
 0000                   .dbfunc e SD_Port_Init _SD_Port_Init fV
                        .even
 0000           _SD_Port_Init::
 0000                   .dbline -1
 0000                   .dbline 12
 0000           ; 
 0000           ; #include"sd.h"
 0000           ; #include"Usart.h"
 0000           ; 
 0000           ; 
 0000           ; //---------------------------------
 0000           ; //
 0000           ; //     SD卡接口初始化函数 
 0000           ; //
 0000           ; //---------------------------------
 0000           ; void SD_Port_Init(void)
 0000           ; {
 0000                   .dbline 13
 0000           ;  SD_CS_DDR |= 1<<SD_CS_BIT;
 0000 D19A              sbi 0x1a,1
 0002                   .dbline 14
 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_gset3
 000E A02E              mov R10,R16
 0010                   .dbline -1
 0010                   .dbline 27
 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 28
 0010           ;       uint8 r1=1;
 0010 41E0              ldi R20,1
 0012                   .dbline 29
 0012           ;       uint8 retry=0;
 0012 6627              clr R22
 0014                   .dbline 32
 0014           ;       
 0014           ; 
 0014           ;       SPI_SrByte(0xff);
 0014 0FEF              ldi R16,255
 0016 0E940000          xcall _SPI_SrByte
 001A                   .dbline 33
 001A           ;       SPI_CS_Assert;
 001A D998              cbi 0x1b,1
 001C           L3:
 001C                   .dbline 34
 001C           L4:
 001C                   .dbline 34
 001C           ;       while(r1--);
 001C 242E              mov R2,R20
 001E 3324              clr R3
 0020 4150              subi R20,1
 0022 2220              tst R2
 0024 D9F7              brne L3
 0026                   .dbline 36
 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 38
 0030           ;       
 0030           ;       SPI_SrByte(arg>>24);
 0030 88E1              ldi R24,24
 0032 90E0              ldi R25,0
 0034 FE01              movw R30,R28
 0036 2680              ldd R2,z+6
 0038 3780              ldd R3,z+7
 003A 4084              ldd R4,z+8
 003C 5184              ldd R5,z+9
 003E 8A93              st -y,R24
 0040 8101              movw R16,R2
 0042 9201              movw R18,R4
 0044 0E940000          xcall lsr32
 0048 0E940000          xcall _SPI_SrByte
 004C                   .dbline 39
 004C           ;       SPI_SrByte(arg>>16);
 004C FE01              movw R30,R28
 004E 2680              ldd R2,z+6
 0050 3780              ldd R3,z+7
 0052 4084              ldd R4,z+8
 0054 5184              ldd R5,z+9
 0056 1201              movw R2,R4
 0058 4424              clr R4
 005A 5524              clr R5
 005C 022D              mov R16,R2
 005E 0E940000          xcall _SPI_SrByte
 0062                   .dbline 40
 0062           ;       SPI_SrByte(arg>>8);
 0062 88E0              ldi R24,8
 0064 90E0              ldi R25,0
 0066 FE01              movw R30,R28
 0068 2680              ldd R2,z+6
 006A 3780              ldd R3,z+7
 006C 4084              ldd R4,z+8
 006E 5184              ldd R5,z+9
 0070 8A93              st -y,R24
 0072 8101              movw R16,R2
 0074 9201              movw R18,R4
 0076 0E940000          xcall lsr32
 007A 0E940000          xcall _SPI_SrByte
 007E                   .dbline 41
 007E           ;       SPI_SrByte(arg);
 007E FE01              movw R30,R28
 0080 0681              ldd R16,z+6
 0082 0E940000          xcall _SPI_SrByte
 0086                   .dbline 43
 0086           ;       
 0086           ;       SPI_SrByte(0x95);
 0086 05E9              ldi R16,149
 0088 0E940000          xcall _SPI_SrByte
 008C                   .dbline 45
 008C           ;       
 008C           ;       SPI_SrByte(0xff);
 008C 0FEF              ldi R16,255
 008E 0E940000          xcall _SPI_SrByte
 0092 07C0              xjmp L7
 0094           L6:
 0094                   .dbline 47
 0094           ;       while((r1 = SPI_SrByte(0xff)) == 0xff)  /* wait response */
 0094           ;               if(retry++ > 0xfe) break;                               /* time out error */
 0094 262E              mov R2,R22
 0096 3324              clr R3
 0098 6F5F              subi R22,255    ; addi 1
 009A 8EEF              ldi R24,254
 009C 8215              cp R24,R2
 009E 08F4              brsh L9
 00A0                   .dbline 47
 00A0 06C0              xjmp L8
 00A2           L9:
 00A2           L7:
 00A2                   .dbline 46
 00A2 0FEF              ldi R16,255
 00A4 0E940000          xcall _SPI_SrByte
 00A8 402F              mov R20,R16
 00AA 4F3F              cpi R20,255
 00AC 99F3              breq L6
 00AE           L8:
 00AE                   .dbline 49
 00AE           ; 
 00AE           ;       SPI_CS_Deassert;
 00AE D99A              sbi 0x1b,1
 00B0                   .dbline 50
 00B0           ;       SPI_SrByte(0xff);                               // extra 8 CLK
 00B0 0FEF              ldi R16,255
 00B2 0E940000          xcall _SPI_SrByte
 00B6                   .dbline 52
 00B6           ; 
 00B6           ;       return r1;                                                              /* return state */
 00B6 042F              mov R16,R20
 00B8                   .dbline -2
 00B8           L2:
 00B8 0E940000          xcall pop_gset3
 00BC 2296              adiw R28,2
 00BE                   .dbline 0 ; func end
 00BE 0895              ret
 00C0                   .dbsym r retry 22 c
 00C0                   .dbsym r r1 20 c
 00C0                   .dbsym l arg 6 l
 00C0                   .dbsym r cmd 10 c
 00C0                   .dbend
 00C0                   .dbfunc e SD_Init _SD_Init fc
 00C0           ;          retry -> R10
 00C0           ;             r1 -> R12
 00C0           ;              i -> R14
                        .even
 00C0           _SD_Init::
 00C0 0E940000          xcall push_gset5
 00C4 2297              sbiw R28,2
 00C6                   .dbline -1
 00C6                   .dbline 62
 00C6           ; }
 00C6           ; 
 00C6           ; 
 00C6           ; //---------------------------------
 00C6           ; //
 00C6           ; //        SD卡初始化函数 
 00C6           ; //
 00C6           ; //---------------------------------
 00C6           ; uint8 SD_Init(void)
 00C6           ; {
 00C6                   .dbline 65
 00C6           ;     
 00C6           ;       uint8 i;
 00C6           ;       uint8 retry = 0;
 00C6 AA24              clr R10
 00C8                   .dbline 66
 00C8           ;       uint8 r1 = 0;
 00C8 CC24              clr R12
 00CA                   .dbline 68
 00CA           ;       
 00CA           ;       SD_Port_Init();
 00CA 9ADF              xcall _SD_Port_Init
 00CC                   .dbline 70
 00CC           ;       
 00CC           ;       SPI_CS_Assert;
 00CC D998              cbi 0x1b,1
 00CE                   .dbline 71
 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 72
 00DA           ;       SPI_CS_Deassert;
 00DA D99A              sbi 0x1b,1
 00DC                   .dbline 73
 00DC           ;       delay_ms(1);
 00DC 01E0              ldi R16,1
 00DE 10E0              ldi R17,0
 00E0 20E0              ldi R18,0
 00E2 30E0              ldi R19,0
 00E4 0E940000          xcall _delay_ms
 00E8                   .dbline 76
 00E8           ;       
 00E8           ;       
 00E8           ;       SPI_Low();      
 00E8 0E940000          xcall _SPI_Low
 00EC           L12:
 00EC                   .dbline 79
 00EC           ;       
 00EC           ;       do
 00EC           ;       {
 00EC                   .dbline 80
 00EC EE24              clr R14
 00EE 04C0              xjmp L18
 00F0           L15:
 00F0                   .dbline 80
 00F0 0FEF              ldi R16,255
 00F2 0E940000          xcall _SPI_SrByte
 00F6           L16:
 00F6                   .dbline 80
 00F6 E394              inc R14
 00F8           L18:
 00F8                   .dbline 80
 00F8           ;               for(i=0;i<10;i++) SPI_SrByte(0xff);
 00F8 8E2D              mov R24,R14
 00FA 8A30              cpi R24,10
 00FC C8F3              brlo L15
 00FE                   .dbline 81
 00FE           ;               r1 = SD_SendCommand(0, 0);//发idle命令  //send idle command
 00FE 40E0              ldi R20,0
 0100 50E0              ldi R21,0
 0102 60E0              ldi R22,0
 0104 70E0              ldi R23,0
 0106 6883              std y+0,R22
 0108 7983              std y+1,R23
 010A 9A01              movw R18,R20
 010C 0027              clr R16
 010E 7BDF              xcall _SD_SendCommand
 0110 C02E              mov R12,R16
 0112                   .dbline 82
 0112           ;               retry++;
 0112 A394              inc R10
 0114                   .dbline 83
 0114           ;               if(retry>0xfe) return 1;//超时退出              //time out
 0114 8EEF              ldi R24,254
 0116 8A15              cp R24,R10
 0118 10F4              brsh L19
 011A                   .dbline 83
 011A 01E0              ldi R16,1
 011C 2CC0              xjmp L11
 011E           L19:
 011E                   .dbline 84
 011E           L13:
 011E                   .dbline 84
 011E           ;       } while(r1 != 0x01);    
 011E 8C2D              mov R24,R12
 0120 8130              cpi R24,1
 0122 21F7              brne L12
 0124                   .dbline 87
 0124           ; 
 0124           ; 
 0124           ;       retry = 0;
 0124 AA24              clr R10
 0126           L21:
 0126                   .dbline 89
 0126           ;       do
 0126           ;       {
 0126                   .dbline 90
 0126           ;               r1 = SD_SendCommand(1, 0);//发active命令        //send active command
 0126 40E0              ldi R20,0
 0128 50E0              ldi R21,0
 012A 60E0              ldi R22,0
 012C 70E0              ldi R23,0
 012E 6883              std y+0,R22
 0130 7983              std y+1,R23
 0132 9A01              movw R18,R20
 0134 01E0              ldi R16,1
 0136 67DF              xcall _SD_SendCommand
 0138 C02E              mov R12,R16
 013A                   .dbline 91
 013A           ;               retry++;
 013A A394              inc R10
 013C                   .dbline 92
 013C           ;               if(retry>0xfe) return 1;//超时退出              //time out
 013C 8EEF              ldi R24,254
 013E 8A15              cp R24,R10
 0140 10F4              brsh L24
 0142                   .dbline 92
 0142 01E0              ldi R16,1
 0144 18C0              xjmp L11
 0146           L24:
 0146                   .dbline 93
 0146           L22:
 0146                   .dbline 93
 0146           ;       } while(r1);
 0146 CC20              tst R12
 0148 71F7              brne L21
 014A                   .dbline 95
 014A           ;       
 014A           ;       SPI_High();             /* Use High Speed SPI*/
 014A 0E940000          xcall _SPI_High
 014E                   .dbline 97
 014E           ;       
 014E           ;       r1 = SD_SendCommand(59, 0);//关crc              //disable CRC
 014E 40E0              ldi R20,0
 0150 50E0              ldi R21,0
 0152 60E0              ldi R22,0
 0154 70E0              ldi R23,0
 0156 6883              std y+0,R22
 0158 7983              std y+1,R23
 015A 9A01              movw R18,R20
 015C 0BE3              ldi R16,59
 015E 53DF              xcall _SD_SendCommand
 0160                   .dbline 99
 0160           ; 
 0160           ;       r1 = SD_SendCommand(16, 512);//设扇区大小512    //set sector size to 512
 0160 40E0              ldi R20,0
 0162 52E0              ldi R21,2
 0164 60E0              ldi R22,0
 0166 70E0              ldi R23,0
 0168 6883              std y+0,R22
 016A 7983              std y+1,R23
 016C 9A01              movw R18,R20
 016E 00E1              ldi R16,16
 0170 4ADF              xcall _SD_SendCommand
 0172 C02E              mov R12,R16
 0174                   .dbline 100
 0174           ;       return 0;//正常返回             //normal return

⌨️ 快捷键说明

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