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

📄 sd.lis

📁 AVR单片机系统开发经典实例部分源程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 0174 0027              clr R16
 0176                   .dbline -2
 0176           L11:
 0176 2296              adiw R28,2
 0178 0E940000          xcall pop_gset5
 017C                   .dbline 0 ; func end
 017C 0895              ret
 017E                   .dbsym r retry 10 c
 017E                   .dbsym r r1 12 c
 017E                   .dbsym r i 14 c
 017E                   .dbend
 017E                   .dbfunc e SD_ReadBlock _SD_ReadBlock fc
 017E           ;             r1 -> R10
 017E           ;          retry -> R22,R23
 017E           ;              i -> R10,R11
 017E           ;         buffer -> R20,R21
 017E           ;         sector -> y+8
                        .even
 017E           _SD_ReadBlock::
 017E 0E940000          xcall push_arg4
 0182 0E940000          xcall push_gset3
 0186 2297              sbiw R28,2
 0188 4C85              ldd R20,y+12
 018A 5D85              ldd R21,y+13
 018C                   .dbline -1
 018C                   .dbline 113
 018C           ; }
 018C           ; 
 018C           ; 
 018C           ; 
 018C           ; //---------------------------------------------
 018C           ; //
 018C           ; // SD卡扇区读取函数 
 018C           ; // sector:扇区号
 018C           ; // buffer:数据缓存
 018C           ; //
 018C           ; //---------------------------------------------
 018C           ; uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
 018C           ; {
 018C                   .dbline 116
 018C           ;       uint8 r1;
 018C           ;       uint16 i;
 018C           ;       uint16 retry=0;
 018C 6627              clr R22
 018E 7727              clr R23
 0190                   .dbline 118
 0190           ; 
 0190           ;       SPI_High();             /* Use High Speed SPI*/
 0190 0E940000          xcall _SPI_High
 0194                   .dbline 120
 0194           ; 
 0194           ;       r1 = SD_SendCommand(17, sector<<9);//读命令     //read command
 0194 89E0              ldi R24,9
 0196 90E0              ldi R25,0
 0198 FE01              movw R30,R28
 019A 2084              ldd R2,z+8
 019C 3184              ldd R3,z+9
 019E 4284              ldd R4,z+10
 01A0 5384              ldd R5,z+11
 01A2 8A93              st -y,R24
 01A4 8101              movw R16,R2
 01A6 9201              movw R18,R4
 01A8 0E940000          xcall lsl32
 01AC 2883              std y+0,R18
 01AE 3983              std y+1,R19
 01B0 9801              movw R18,R16
 01B2 01E1              ldi R16,17
 01B4 28DF              xcall _SD_SendCommand
 01B6 A02E              mov R10,R16
 01B8                   .dbline 122
 01B8           ;       
 01B8           ;       if(r1 != 0x00)
 01B8 0023              tst R16
 01BA 09F0              breq L27
 01BC                   .dbline 123
 01BC           ;               return r1;
 01BC 2EC0              xjmp L26
 01BE           L27:
 01BE                   .dbline 125
 01BE           ; 
 01BE           ;       SPI_CS_Assert;
 01BE D998              cbi 0x1b,1
 01C0 0BC0              xjmp L30
 01C2           L29:
 01C2                   .dbline 128
 01C2           ;       //等数据的开始  //wait to start recieve data
 01C2           ;       while(SPI_SrByte(0xff) != 0xfe)
 01C2           ;        if(retry++ > 0xfffe)
 01C2 1B01              movw R2,R22
 01C4 6F5F              subi R22,255  ; offset = 1
 01C6 7F4F              sbci R23,255
 01C8 8EEF              ldi R24,65534
 01CA 9FEF              ldi R25,255
 01CC 8215              cp R24,R2
 01CE 9305              cpc R25,R3
 01D0 18F4              brsh L32
 01D2                   .dbline 129
 01D2           ;                {SPI_CS_Deassert;return 1;}
 01D2                   .dbline 129
 01D2 D99A              sbi 0x1b,1
 01D4                   .dbline 129
 01D4 01E0              ldi R16,1
 01D6 21C0              xjmp L26
 01D8           L32:
 01D8           L30:
 01D8                   .dbline 127
 01D8 0FEF              ldi R16,255
 01DA 0E940000          xcall _SPI_SrByte
 01DE 0E3F              cpi R16,254
 01E0 81F7              brne L29
 01E2                   .dbline 131
 01E2           ; 
 01E2           ;       for(i=0; i<512; i++)//读512个数据       //read 512 bytes
 01E2 AA24              clr R10
 01E4 BB24              clr R11
 01E6 09C0              xjmp L37
 01E8           L34:
 01E8                   .dbline 132
 01E8                   .dbline 133
 01E8 0FEF              ldi R16,255
 01EA 0E940000          xcall _SPI_SrByte
 01EE FA01              movw R30,R20
 01F0 0193              st Z+,R16
 01F2 AF01              movw R20,R30
 01F4                   .dbline 134
 01F4           L35:
 01F4                   .dbline 131
 01F4 C501              movw R24,R10
 01F6 0196              adiw R24,1
 01F8 5C01              movw R10,R24
 01FA           L37:
 01FA                   .dbline 131
 01FA C501              movw R24,R10
 01FC 8030              cpi R24,0
 01FE E2E0              ldi R30,2
 0200 9E07              cpc R25,R30
 0202 90F3              brlo L34
 0204                   .dbline 136
 0204           ;       {
 0204           ;               *buffer++ = SPI_SrByte(0xff);
 0204           ;       }
 0204           ; 
 0204           ;       SPI_SrByte(0xff);//伪crc    //dummy crc
 0204 0FEF              ldi R16,255
 0206 0E940000          xcall _SPI_SrByte
 020A                   .dbline 137
 020A           ;       SPI_SrByte(0xff);
 020A 0FEF              ldi R16,255
 020C 0E940000          xcall _SPI_SrByte
 0210                   .dbline 139
 0210           ;       
 0210           ;       SPI_CS_Deassert;
 0210 D99A              sbi 0x1b,1
 0212                   .dbline 140
 0212           ;       SPI_SrByte(0xff);// extra 8 CLK
 0212 0FEF              ldi R16,255
 0214 0E940000          xcall _SPI_SrByte
 0218                   .dbline 143
 0218           ;        
 0218           ; 
 0218           ;       return 0;
 0218 0027              clr R16
 021A                   .dbline -2
 021A           L26:
 021A 2296              adiw R28,2
 021C 0E940000          xcall pop_gset3
 0220 2496              adiw R28,4
 0222                   .dbline 0 ; func end
 0222 0895              ret
 0224                   .dbsym r r1 10 c
 0224                   .dbsym r retry 22 i
 0224                   .dbsym r i 10 i
 0224                   .dbsym r buffer 20 pc
 0224                   .dbsym l sector 8 l
 0224                   .dbend
 0224                   .dbfunc e SD_WriteSingleBlock _SD_WriteSingleBlock fc
 0224           ;             r1 -> R20
 0224           ;          retry -> R22,R23
 0224           ;              i -> R10,R11
 0224           ;         buffer -> R12,R13
 0224           ;         sector -> y+10
                        .even
 0224           _SD_WriteSingleBlock::
 0224 0E940000          xcall push_arg4
 0228 0E940000          xcall push_gset4
 022C 2297              sbiw R28,2
 022E CE84              ldd R12,y+14
 0230 DF84              ldd R13,y+15
 0232                   .dbline -1
 0232                   .dbline 155
 0232           ; }
 0232           ; 
 0232           ; 
 0232           ; //---------------------------------------------
 0232           ; //
 0232           ; // SD卡扇区写入函数 
 0232           ; // sector:扇区号
 0232           ; // buffer:数据缓存
 0232           ; //
 0232           ; //---------------------------------------------
 0232           ; uint8 SD_WriteSingleBlock(uint32 sector, uint8* buffer)
 0232           ; {
 0232                   .dbline 158
 0232           ;       uint8 r1;
 0232           ;       uint16 i;
 0232           ;       uint16 retry=0;
 0232 6627              clr R22
 0234 7727              clr R23
 0236                   .dbline 162
 0236           ;       
 0236           ;       //SPI_High();           /* Use High Speed SPI*/
 0236           ; 
 0236           ;       r1 = SD_SendCommand(24, sector<<9);//写命令     //send command
 0236 89E0              ldi R24,9
 0238 90E0              ldi R25,0
 023A FE01              movw R30,R28
 023C 2284              ldd R2,z+10
 023E 3384              ldd R3,z+11
 0240 4484              ldd R4,z+12
 0242 5584              ldd R5,z+13
 0244 8A93              st -y,R24
 0246 8101              movw R16,R2
 0248 9201              movw R18,R4
 024A 0E940000          xcall lsl32
 024E 2883              std y+0,R18
 0250 3983              std y+1,R19
 0252 9801              movw R18,R16
 0254 08E1              ldi R16,24
 0256 D7DE              xcall _SD_SendCommand
 0258 402F              mov R20,R16
 025A                   .dbline 163
 025A           ;       if(r1 != 0x00)
 025A 0023              tst R16
 025C 09F0              breq L39
 025E                   .dbline 164
 025E           ;               return r1;
 025E 40C0              xjmp L38
 0260           L39:
 0260                   .dbline 166
 0260           ; 
 0260           ;       SPI_CS_Assert;
 0260 D998              cbi 0x1b,1
 0262                   .dbline 168
 0262           ;       
 0262           ;       SPI_SrByte(0xff);
 0262 0FEF              ldi R16,255
 0264 0E940000          xcall _SPI_SrByte
 0268                   .dbline 169
 0268           ;       SPI_SrByte(0xff);
 0268 0FEF              ldi R16,255
 026A 0E940000          xcall _SPI_SrByte
 026E                   .dbline 170
 026E           ;       SPI_SrByte(0xff);
 026E 0FEF              ldi R16,255
 0270 0E940000          xcall _SPI_SrByte
 0274                   .dbline 172
 0274           ; 
 0274           ;       SPI_SrByte(0xfe);//发开始符                     //send start byte "token"
 0274 0EEF              ldi R16,254
 0276 0E940000          xcall _SPI_SrByte
 027A                   .dbline 174
 027A           ;       
 027A           ;       for(i=0; i<512; i++)//送512字节数据             //send 512 bytes data
 027A AA24              clr R10
 027C BB24              clr R11
 027E 09C0              xjmp L44
 0280           L41:
 0280                   .dbline 175
 0280                   .dbline 176
 0280 F501              movw R30,R10
 0282 EC0D              add R30,R12
 0284 FD1D              adc R31,R13
 0286 0081              ldd R16,z+0
 0288 0E940000          xcall _SPI_SrByte
 028C                   .dbline 177
 028C           L42:
 028C                   .dbline 174
 028C C501              movw R24,R10
 028E 0196              adiw R24,1
 0290 5C01              movw R10,R24
 0292           L44:
 0292                   .dbline 174
 0292 C501              movw R24,R10
 0294 8030              cpi R24,0
 0296 E2E0              ldi R30,2
 0298 9E07              cpc R25,R30
 029A 90F3              brlo L41
 029C                   .dbline 179
 029C           ;       {
 029C           ;               SPI_SrByte(buffer[i]);
 029C           ;       }
 029C           ;       
 029C           ;       SPI_SrByte(0xff);                       //dummy crc
 029C 0FEF              ldi R16,255
 029E 0E940000          xcall _SPI_SrByte
 02A2                   .dbline 180
 02A2           ;       SPI_SrByte(0xff);
 02A2 0FEF              ldi R16,255
 02A4 0E940000          xcall _SPI_SrByte
 02A8                   .dbline 182
 02A8           ;       
 02A8           ;       r1 = SPI_SrByte(0xff);
 02A8 0FEF              ldi R16,255
 02AA 0E940000          xcall _SPI_SrByte
 02AE 402F              mov R20,R16
 02B0                   .dbline 184
 02B0           ;       
 02B0           ;       if( (r1&0x1f) != 0x05)//等待是否成功    //judge if it successful
 02B0 842F              mov R24,R20
 02B2 8F71              andi R24,31
 02B4 8530              cpi R24,5
 02B6 69F0              breq L48
 02B8                   .dbline 185
 02B8           ;       {
 02B8                   .dbline 186
 02B8           ;               SPI_CS_Deassert;
 02B8 D99A              sbi 0x1b,1
 02BA                   .dbline 187
 02BA           ;               return r1;
 02BA 12C0              xjmp L38
 02BC           L47:
 02BC                   .dbline 190
 02BC           ;       }
 02BC           ;       //等待操作完            //wait no busy
 02BC           ;       while(!SPI_SrByte(0xff))if(retry++ > 0xfffe){SPI_CS_Deassert;return 1;}
 02BC 1B01              movw R2,R22
 02BE 6F5F              subi R22,255  ; offset = 1
 02C0 7F4F              sbci R23,255
 02C2 8EEF              ldi R24,65534
 02C4 9FEF              ldi R25,255
 02C6 8215              cp R24,R2
 02C8 9305              cpc R25,R3
 02CA 18F4              brsh L50
 02CC                   .dbline 190
 02CC                   .dbline 190
 02CC D99A              sbi 0x1b,1
 02CE                   .dbline 190
 02CE 01E0              ldi R16,1
 02D0 07C0              xjmp L38
 02D2           L50:
 02D2           L48:
 02D2                   .dbline 190
 02D2 0FEF              ldi R16,255
 02D4 0E940000          xcall _SPI_SrByte
 02D8 0023              tst R16
 02DA 81F3              breq L47
 02DC                   .dbline 192
 02DC           ; 
 02DC           ;       SPI_CS_Deassert;
 02DC D99A              sbi 0x1b,1
 02DE                   .dbline 195
 02DE           ;       //SPI_SrByte(0xff);// extra 8 CLK
 02DE           ; 
 02DE           ;       return 0;
 02DE 0027              clr R16
 02E0                   .dbline -2
 02E0           L38:
 02E0 2296              adiw R28,2
 02E2 0E940000          xcall pop_gset4
 02E6 2496              adiw R28,4
 02E8                   .dbline 0 ; func end
 02E8 0895              ret
 02EA                   .dbsym r r1 20 c
 02EA                   .dbsym r retry 22 i
 02EA                   .dbsym r i 10 i
 02EA                   .dbsym r buffer 12 pc
 02EA                   .dbsym l sector 10 l
 02EA                   .dbend

⌨️ 快捷键说明

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