📄 sd.lis
字号:
00BE 0FEF ldi R16,255
00C0 A5DF rcall _SPI_TransferByte
00C2 .dbline 90
00C2 ; SD_Enable();
00C2 C498 cbi 0x18,4
00C4 .dbline 91
00C4 ; for(i=0;i<6;i++)
00C4 6627 clr R22
00C6 05C0 rjmp L35
00C8 L32:
00C8 .dbline 92
00C8 .dbline 93
00C8 F601 movw R30,R12
00CA 0191 ld R16,Z+
00CC 6F01 movw R12,R30
00CE 9EDF rcall _SPI_TransferByte
00D0 .dbline 94
00D0 L33:
00D0 .dbline 91
00D0 6395 inc R22
00D2 L35:
00D2 .dbline 91
00D2 6630 cpi R22,6
00D4 C8F3 brlo L32
00D6 .dbline 95
00D6 ; {
00D6 ; SPI_TransferByte(*cmd++);
00D6 ; }
00D6 ; SPI_ReadByte();
00D6 94DF rcall _SPI_ReadByte
00D8 L36:
00D8 .dbline 97
00D8 ;
00D8 ; do{
00D8 .dbline 98
00D8 ; tmp = SPI_ReadByte();
00D8 93DF rcall _SPI_ReadByte
00DA A02E mov R10,R16
00DC .dbline 99
00DC L37:
00DC .dbline 99
00DC ; }while((tmp==0xff)&&(retry++ <100));
00DC 8A2D mov R24,R10
00DE 8F3F cpi R24,255
00E0 31F4 brne L39
00E2 242E mov R2,R20
00E4 3324 clr R3
00E6 4F5F subi R20,255 ; addi 1
00E8 822D mov R24,R2
00EA 8436 cpi R24,100
00EC A8F3 brlo L36
00EE L39:
00EE .dbline 100
00EE ; return(tmp);
00EE 0A2D mov R16,R10
00F0 .dbline -2
00F0 L31:
00F0 00D0 rcall pop_gset4
00F2 .dbline 0 ; func end
00F2 0895 ret
00F4 .dbsym r retry 20 c
00F4 .dbsym r i 22 c
00F4 .dbsym r tmp 10 c
00F4 .dbsym r cmd 12 pc
00F4 .dbend
00F4 .dbfunc e SD_Read_Block _SD_Read_Block fc
00F4 ; retry -> R20
00F4 ; temp -> R22
00F4 ; i -> R22,R23
00F4 ; Bytes -> R10,R11
00F4 ; Buffer -> R12,R13
00F4 ; CMD -> R14,R15
.even
00F4 _SD_Read_Block::
00F4 00D0 rcall push_gset5
00F6 6901 movw R12,R18
00F8 7801 movw R14,R16
00FA AA84 ldd R10,y+10
00FC BB84 ldd R11,y+11
00FE .dbline -1
00FE .dbline 105
00FE ; }
00FE ;
00FE ; uint8 SD_Read_Block(uint8 *CMD,uint8 *Buffer,uint16 Bytes)
00FE ; //****************************************************************************
00FE ; {
00FE .dbline 110
00FE ; uint16 i;
00FE ; uint8 retry, temp;
00FE ;
00FE ; //Send Command CMD to MMC/SD-Card
00FE ; retry=0;
00FE 4427 clr R20
0100 L41:
0100 .dbline 112
0100 ; do
0100 ; { //Retry 100 times to send command.
0100 .dbline 113
0100 ; temp=Write_Command_SD(CMD);
0100 8701 movw R16,R14
0102 D9DF rcall _Write_Command_SD
0104 602F mov R22,R16
0106 .dbline 114
0106 ; if(retry++ == 100)
0106 242E mov R2,R20
0108 3324 clr R3
010A 4F5F subi R20,255 ; addi 1
010C 822D mov R24,R2
010E 8436 cpi R24,100
0110 11F4 brne L44
0112 .dbline 115
0112 ; return READ_BLOCK_ERROR; //block write Error!
0112 04E0 ldi R16,4
0114 15C0 rjmp L40
0116 L44:
0116 .dbline 116
0116 ; }
0116 L42:
0116 .dbline 117
0116 ; while (temp != 0);
0116 6623 tst R22
0118 99F7 brne L41
011A L46:
011A .dbline 120
011A L47:
011A .dbline 120
011A ;
011A ; //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
011A ; while (SPI_ReadByte() != 0xfe);
011A 72DF rcall _SPI_ReadByte
011C 0E3F cpi R16,254
011E E9F7 brne L46
0120 .dbline 123
0120 ;
0120 ; //Write blocks(normal 512Bytes) to MMC/SD-Card
0120 ; for (i = 0; i < Bytes; i++)
0120 6627 clr R22
0122 7727 clr R23
0124 06C0 rjmp L52
0126 L49:
0126 .dbline 124
0126 .dbline 125
0126 6CDF rcall _SPI_ReadByte
0128 F601 movw R30,R12
012A 0193 st Z+,R16
012C 6F01 movw R12,R30
012E .dbline 127
012E L50:
012E .dbline 123
012E 6F5F subi R22,255 ; offset = 1
0130 7F4F sbci R23,255
0132 L52:
0132 .dbline 123
0132 6A15 cp R22,R10
0134 7B05 cpc R23,R11
0136 B8F3 brlo L49
0138 .dbline 130
0138 ; {
0138 ; *Buffer++ = SPI_ReadByte();
0138 ; // put_c(*Buffer);
0138 ; }
0138 ;
0138 ; //CRC-Byte
0138 ; SPI_ReadByte();//CRC - Byte
0138 63DF rcall _SPI_ReadByte
013A .dbline 131
013A ; SPI_ReadByte();//CRC - Byte
013A 62DF rcall _SPI_ReadByte
013C .dbline 134
013C ;
013C ; //set MMC_Chip_Select to high (MMC/SD-Card invalid)
013C ; SD_Disable();
013C C49A sbi 0x18,4
013E .dbline 135
013E ; return READ_BLOCK_OK;
013E 0027 clr R16
0140 .dbline -2
0140 L40:
0140 00D0 rcall pop_gset5
0142 .dbline 0 ; func end
0142 0895 ret
0144 .dbsym r retry 20 c
0144 .dbsym r temp 22 c
0144 .dbsym r i 22 i
0144 .dbsym r Bytes 10 i
0144 .dbsym r Buffer 12 pc
0144 .dbsym r CMD 14 pc
0144 .dbend
.area lit(rom, con, rel)
0006 L54:
0006 5100 .byte 'Q,0
0008 0000 .byte 0,0
000A 00FF .byte 0,255
.area text(rom, con, rel)
0144 .dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
0144 .dbfunc e SD_read_sector _SD_read_sector fc
0144 ; CMD -> y+2
0144 ; Buffer -> y+16
0144 ; addr -> y+12
.even
0144 _SD_read_sector::
0144 00D0 rcall push_arg4
0146 00D0 rcall push_gset2
0148 2897 sbiw R28,8
014A .dbline -1
014A .dbline 143
014A ; }
014A ;
014A ; //****************************************************************************
014A ; //Routine for writing a Block(512Byte) to MMC/SD-Card
014A ; //Return 0 if sector writing is completed.
014A ; uint8 SD_read_sector(uint32 addr,uint8 *Buffer)
014A ; //****************************************************************************
014A ; {
014A .dbline 145
014A ; //Command 16 is reading Blocks from MMC/SD-Card
014A ; uint8 CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
014A 80E0 ldi R24,<L54
014C 90E0 ldi R25,>L54
014E FE01 movw R30,R28
0150 3296 adiw R30,2
0152 06E0 ldi R16,6
0154 10E0 ldi R17,0
0156 FA93 st -y,R31
0158 EA93 st -y,R30
015A 9A93 st -y,R25
015C 8A93 st -y,R24
015E 00D0 rcall asgncblk
0160 .dbline 147
0160 ;
0160 ; asm("cli"); //clear all interrupt.
0160 F894 cli
0162 .dbline 149
0162 ; //Address conversation(logic block address-->byte address)
0162 ; addr = addr << 9; //addr = addr * 512
0162 89E0 ldi R24,9
0164 90E0 ldi R25,0
0166 FE01 movw R30,R28
0168 2484 ldd R2,z+12
016A 3584 ldd R3,z+13
016C 4684 ldd R4,z+14
016E 5784 ldd R5,z+15
0170 8A93 st -y,R24
0172 8101 movw R16,R2
0174 9201 movw R18,R4
0176 00D0 rcall lsl32
0178 FE01 movw R30,R28
017A 0487 std z+12,R16
017C 1587 std z+13,R17
017E 2687 std z+14,R18
0180 3787 std z+15,R19
0182 .dbline 151
0182 ;
0182 ; CMD[1] = ((addr & 0xFF000000) >>24 );
0182 40E0 ldi R20,0
0184 50E0 ldi R21,0
0186 60E0 ldi R22,0
0188 7FEF ldi R23,255
018A FE01 movw R30,R28
018C 2484 ldd R2,z+12
018E 3584 ldd R3,z+13
0190 4684 ldd R4,z+14
0192 5784 ldd R5,z+15
0194 2422 and R2,R20
0196 3522 and R3,R21
0198 4622 and R4,R22
019A 5722 and R5,R23
019C 88E1 ldi R24,24
019E 90E0 ldi R25,0
01A0 8A93 st -y,R24
01A2 8101 movw R16,R2
01A4 9201 movw R18,R4
01A6 00D0 rcall lsr32
01A8 0B83 std y+3,R16
01AA .dbline 152
01AA ; CMD[2] = ((addr & 0x00FF0000) >>16 );
01AA 40E0 ldi R20,0
01AC 50E0 ldi R21,0
01AE 6FEF ldi R22,255
01B0 70E0 ldi R23,0
01B2 FE01 movw R30,R28
01B4 2484 ldd R2,z+12
01B6 3584 ldd R3,z+13
01B8 4684 ldd R4,z+14
01BA 5784 ldd R5,z+15
01BC 2422 and R2,R20
01BE 3522 and R3,R21
01C0 4622 and R4,R22
01C2 5722 and R5,R23
01C4 1201 movw R2,R4
01C6 4424 clr R4
01C8 5524 clr R5
01CA 2C82 std y+4,R2
01CC .dbline 153
01CC ; CMD[3] = ((addr & 0x0000FF00) >>8 );
01CC 40E0 ldi R20,0
01CE 5FEF ldi R21,255
01D0 60E0 ldi R22,0
01D2 70E0 ldi R23,0
01D4 FE01 movw R30,R28
01D6 2484 ldd R2,z+12
01D8 3584 ldd R3,z+13
01DA 4684 ldd R4,z+14
01DC 5784 ldd R5,z+15
01DE 2422 and R2,R20
01E0 3522 and R3,R21
01E2 4622 and R4,R22
01E4 5722 and R5,R23
01E6 88E0 ldi R24,8
01E8 90E0 ldi R25,0
01EA 8A93 st -y,R24
01EC 8101 movw R16,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -