📄 sdmmc.lis
字号:
03FC ; }
03FC ; //Wait till MMC/SD-Card is not busy
03FC ; while (Read_Byte_MMC()!=0xff){};
03FC FCDE xcall _Read_Byte_MMC
03FE 0F3F cpi R16,255
0400 E9F7 brne L99
0402 .dbline 417
0402 .dbline 420
0402 ;
0402 ; //set MMC_Chip_Select to high (MMC/SD-Card Invalid)
0402 ; MMC_Disable();
0402 C49A sbi 0x18,4
0404 .dbline 420
0404 .dbline 422
0404 ; #if !(HW_SPI_Mode)
0404 ; SPCR=spimode;
0404 0E80 ldd R0,y+6
0406 0DB8 out 0xd,R0
0408 .dbline 423
0408 ; SPSR=spispeeddub;
0408 0F80 ldd R0,y+7
040A 0EB8 out 0xe,R0
040C .dbline 425
040C ; #endif
040C ; return(TRUE);
040C 01E0 ldi R16,1
040E .dbline -2
040E L79:
040E 2896 adiw R28,8
0410 0E940000 xcall pop_gset5
0414 2496 adiw R28,4
0416 .dbline 0 ; func end
0416 0895 ret
0418 .dbsym l spispeeddub 7 c
0418 .dbsym l spimode 6 c
0418 .dbsym l CMD 0 A[6:6]c
0418 .dbsym r retry 14 c
0418 .dbsym r tmp 12 c
0418 .dbsym r i 10 i
0418 .dbsym l Buffer 22 pc
0418 .dbsym l addr 18 l
0418 .dbend
0418 .dbfunc e MMC_Read_Block _MMC_Read_Block fc
0418 ; spispeeddub -> R20
0418 ; spimode -> R22
0418 ; temp -> R12
0418 ; retry -> R10
0418 ; i -> R12,R13
0418 ; Bytes -> R14,R15
0418 ; Buffer -> y+12
0418 ; CMD -> y+10
.even
0418 _MMC_Read_Block::
0418 0E940000 xcall push_arg4
041C 0E940000 xcall push_gset5
0420 EE84 ldd R14,y+14
0422 FF84 ldd R15,y+15
0424 .dbline -1
0424 .dbline 433
0424 ; }
0424 ;
0424 ; //****************************************************************************
0424 ; //Routine for reading data Registers of MMC/SD-Card
0424 ; //Return 0 if no Error.
0424 ; uint8 MMC_Read_Block(uint8 *CMD,uint8 *Buffer,uint16 Bytes)
0424 ; //****************************************************************************
0424 ; {
0424 .dbline 438
0424 ; uint16 i;
0424 ; uint8 retry,temp;
0424 ; #if !(HW_SPI_Mode)
0424 ; uint8 spimode,spispeeddub;
0424 ; spimode=SPCR;
0424 6DB1 in R22,0xd
0426 .dbline 439
0426 ; spispeeddub=SPSR;
0426 4EB1 in R20,0xe
0428 .dbline 440
0428 ; SPCR&=~(1<<SPIE);
0428 6F98 cbi 0xd,7
042A .dbline 443
042A ; #endif
042A ; //Send Command CMD to MMC/SD-Card
042A ; retry=0;
042A AA24 clr R10
042C L103:
042C .dbline 445
042C ; do
042C ; { //Retry 100 times to send command.
042C .dbline 446
042C ; temp=Write_Command_MMC(CMD);
042C 0A85 ldd R16,y+10
042E 1B85 ldd R17,y+11
0430 C4DE xcall _Write_Command_MMC
0432 C02E mov R12,R16
0434 .dbline 447
0434 ; retry++;
0434 A394 inc R10
0436 .dbline 448
0436 ; if(retry==100)
0436 8A2D mov R24,R10
0438 8436 cpi R24,100
043A 21F4 brne L106
043C .dbline 449
043C ; {
043C .dbline 451
043C ; #if !(HW_SPI_Mode)
043C ; SPCR=spimode;
043C 6DB9 out 0xd,R22
043E .dbline 452
043E ; SPSR=spispeeddub;
043E 4EB9 out 0xe,R20
0440 .dbline 454
0440 ; #endif
0440 ; return(READ_BLOCK_ERROR); //block read Error!
0440 04E0 ldi R16,4
0442 1BC0 xjmp L102
0444 L106:
0444 .dbline 456
0444 ; }
0444 ; }
0444 L104:
0444 .dbline 457
0444 ; while(temp!=0);
0444 CC20 tst R12
0446 91F7 brne L103
0448 L108:
0448 .dbline 460
0448 .dbline 460
0448 L109:
0448 .dbline 460
0448 ;
0448 ; //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
0448 ; while (Read_Byte_MMC() != 0xfe){};
0448 D6DE xcall _Read_Byte_MMC
044A 0E3F cpi R16,254
044C E9F7 brne L108
044E .dbline 460
044E .dbline 463
044E ;
044E ; //Write blocks(normal 512Bytes) to MMC/SD-Card
044E ; for (i=0;i<Bytes;i++)
044E CC24 clr R12
0450 DD24 clr R13
0452 0AC0 xjmp L114
0454 L111:
0454 .dbline 464
0454 .dbline 465
0454 D0DE xcall _Read_Byte_MMC
0456 202E mov R2,R16
0458 EC85 ldd R30,y+12
045A FD85 ldd R31,y+13
045C 2192 st Z+,R2
045E FD87 std y+13,R31
0460 EC87 std y+12,R30
0462 .dbline 466
0462 L112:
0462 .dbline 463
0462 C601 movw R24,R12
0464 0196 adiw R24,1
0466 6C01 movw R12,R24
0468 L114:
0468 .dbline 463
0468 CE14 cp R12,R14
046A DF04 cpc R13,R15
046C 98F3 brlo L111
046E .dbline 469
046E ; {
046E ; *Buffer++ = Read_Byte_MMC();
046E ; }
046E ;
046E ; //CRC-Byte
046E ; Read_Byte_MMC();//CRC - Byte
046E C3DE xcall _Read_Byte_MMC
0470 .dbline 470
0470 ; Read_Byte_MMC();//CRC - Byte
0470 C2DE xcall _Read_Byte_MMC
0472 .dbline 473
0472 ;
0472 ; //set MMC_Chip_Select to high (MMC/SD-Card invalid)
0472 ; MMC_Disable();
0472 C49A sbi 0x18,4
0474 .dbline 473
0474 .dbline 475
0474 ; #if !(HW_SPI_Mode)
0474 ; SPCR=spimode;
0474 6DB9 out 0xd,R22
0476 .dbline 476
0476 ; SPSR=spispeeddub;
0476 4EB9 out 0xe,R20
0478 .dbline 478
0478 ; #endif
0478 ; return(0);
0478 0027 clr R16
047A .dbline -2
047A L102:
047A 0E940000 xcall pop_gset5
047E 2496 adiw R28,4
0480 .dbline 0 ; func end
0480 0895 ret
0482 .dbsym r spispeeddub 20 c
0482 .dbsym r spimode 22 c
0482 .dbsym r temp 12 c
0482 .dbsym r retry 10 c
0482 .dbsym r i 12 i
0482 .dbsym r Bytes 14 i
0482 .dbsym l Buffer 12 pc
0482 .dbsym l CMD 10 pc
0482 .dbend
.area lit(rom, con, rel)
000C L116:
000C 5100 .byte 'Q,0
000E 0000 .byte 0,0
0010 00FF .byte 0,255
.area text(rom, con, rel)
0482 .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
0482 .dbfunc e MMC_Read_Sector _MMC_Read_Sector fc
0482 ; temp -> <dead>
0482 ; CMD -> y+2
0482 ; Buffer -> y+16
0482 ; addr -> y+12
.even
0482 _MMC_Read_Sector::
0482 0E940000 xcall push_arg4
0486 0E940000 xcall push_gset2
048A 2897 sbiw R28,8
048C .dbline -1
048C .dbline 487
048C ; }
048C ;
048C ;
048C ; //****************************************************************************
048C ; //Routine for reading Blocks(512Byte) from MMC/SD-Card
048C ; //Return 0 if no Error.
048C ; uint8 MMC_Read_Sector(uint32 addr,uint8 *Buffer)
048C ; //****************************************************************************
048C ; {
048C .dbline 489
048C ; //Command 16 is reading Blocks from MMC/SD-Card
048C ; uint8 CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
048C 80E0 ldi R24,<L116
048E 90E0 ldi R25,>L116
0490 FE01 movw R30,R28
0492 3296 adiw R30,2
0494 06E0 ldi R16,6
0496 10E0 ldi R17,0
0498 FA93 st -y,R31
049A EA93 st -y,R30
049C 9A93 st -y,R25
049E 8A93 st -y,R24
04A0 0E940000 xcall asgncblk
04A4 .dbline 494
04A4 ; uint8 temp;
04A4 ;
04A4 ; //#asm("cli"); //clear all interrupt.
04A4 ; //Address conversation(logic block address-->byte address)
04A4 ; addr = addr << 9; //addr = addr * 512
04A4 89E0 ldi R24,9
04A6 90E0 ldi R25,0
04A8 FE01 movw R30,R28
04AA 2484 ldd R2,z+12
04AC 3584 ldd R3,z+13
04AE 4684 ldd R4,z+14
04B0 5784 ldd R5,z+15
04B2 8A93 st -y,R24
04B4 8101 movw R16,R2
04B6 9201 movw R18,R4
04B8 0E940000 xcall lsl32
04BC FE01 movw R30,R28
04BE 0487 std z+12,R16
04C0 1587 std z+13,R17
04C2 2687 std z+14,R18
04C4 3787 std z+15,R19
04C6 .dbline 496
04C6 ;
04C6 ; CMD[1] = ((addr & 0xFF000000) >>24 );
04C6 40E0 ldi R20,0
04C8 50E0 ldi R21,0
04CA 60E0 ldi R22,0
04CC 7FEF ldi R23,255
04CE FE01 movw R30,R28
04D0 2484 ldd R2,z+12
04D2 3584 ldd R3,z+13
04D4 4684 ldd R4,z+14
04D6 5784 ldd R5,z+15
04D8 2422 and R2,R20
04DA 3522 and R3,R21
04DC 4622 and R4,R22
04DE 5722 and R5,R23
04E0 88E1 ldi R24,24
04E2 90E0 ldi R25,0
04E4 8A93 st -y,R24
04E6 8101 movw R16,R2
04E8 9201 movw R18,R4
04EA 0E940000 xcall lsr32
04EE 0B83 std y+3,R16
04F0 .dbline 497
04F0 ; CMD[2] = ((addr & 0x00FF0000) >>16 );
04F0 40E0 ldi R20,0
04F2 50E0 ldi R21,0
04F4 6FEF ldi R22,255
04F6 70E0 ldi R23,0
04F8 FE01 movw R30,R28
04FA 2484 ldd R2,z+12
04FC 3584 ldd R3,z+13
04FE 4684 ldd R4,z+14
0500 5784 ldd R5,z+15
0502 2422 and R2,R20
0504 3522 and R3,R21
0506 4622 and R4,R22
0508 5722 and R5,R23
050A 1201 movw R2,R4
050C 4424 clr R4
050E 5524 clr R5
0510 2C82 std y+4,R2
0512 .dbline 498
0512 ; CMD[3] = ((addr & 0x0000FF00) >>8 );
0512 40E0 ldi R20,0
0514 5FEF ldi R21,255
0516
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -