📄 sd.lis
字号:
00E0 .dbline -1
00E0 .dbline 69
00E0 ; }
00E0 ; //****************************************************************************
00E0 ; //SD卡初始化(SPI-MODE)
00E0 ; //****************************************************************************
00E0 ; uchar SD_Init(void)
00E0 ; {
00E0 .dbline 72
00E0 ; uchar retry,temp;
00E0 ; uchar i;
00E0 ; MMC_PORT&=~MMC_CS_PIN; //SD卡使能
00E0 C498 cbi 0x18,4
00E2 .dbline 74
00E2 ;
00E2 ; delay_nus(250); //Wait MMC/SD ready...
00E2 0AEF ldi R16,250
00E4 10E0 ldi R17,0
00E6 8EDF xcall _delay_nus
00E8 .dbline 75
00E8 ; for (i=0;i<0x0f;i++)
00E8 AA24 clr R10
00EA 04C0 xjmp L18
00EC L15:
00EC .dbline 76
00EC .dbline 77
00EC 0FEF ldi R16,255
00EE 0E940000 xcall _Write_Byte_SPI
00F2 .dbline 78
00F2 L16:
00F2 .dbline 75
00F2 A394 inc R10
00F4 L18:
00F4 .dbline 75
00F4 8A2D mov R24,R10
00F6 8F30 cpi R24,15
00F8 C8F3 brlo L15
00FA .dbline 80
00FA ; {
00FA ; Write_Byte_SPI(0xff); //send 74 clock at least!!!
00FA ; }
00FA ; //Send Command CMD0 to MMC/SD Card
00FA ; retry=0;
00FA EE24 clr R14
00FC L19:
00FC .dbline 83
00FC ;
00FC ; do
00FC ; { //retry 200 times to send CMD0 command
00FC .dbline 84
00FC ; temp=SD_Write_Command(0,0);
00FC 40E0 ldi R20,0
00FE 50E0 ldi R21,0
0100 60E0 ldi R22,0
0102 70E0 ldi R23,0
0104 6883 std y+0,R22
0106 7983 std y+1,R23
0108 9A01 movw R18,R20
010A 0027 clr R16
010C 88DF xcall _SD_Write_Command
010E C02E mov R12,R16
0110 .dbline 85
0110 ; retry++;
0110 E394 inc R14
0112 .dbline 86
0112 ; if(retry==100)
0112 8E2D mov R24,R14
0114 8436 cpi R24,100
0116 01F4 brne L22
0118 .dbline 87
0118 ; {
0118 .dbline 88
0118 ; ;//CMD0 Error!
0118 .dbline 89
0118 ; }
0118 L22:
0118 .dbline 90
0118 ; }
0118 L20:
0118 .dbline 91
0118 ; while(temp!=1);
0118 8C2D mov R24,R12
011A 8130 cpi R24,1
011C 79F7 brne L19
011E .dbline 94
011E ;
011E ; //Send Command CMD1 to MMC/SD-Card
011E ; retry=0;
011E EE24 clr R14
0120 L24:
0120 .dbline 96
0120 ; do
0120 ; { //retry 100 times to send CMD1 command
0120 .dbline 97
0120 ; temp=SD_Write_Command(1,0);
0120 40E0 ldi R20,0
0122 50E0 ldi R21,0
0124 60E0 ldi R22,0
0126 70E0 ldi R23,0
0128 6883 std y+0,R22
012A 7983 std y+1,R23
012C 9A01 movw R18,R20
012E 01E0 ldi R16,1
0130 76DF xcall _SD_Write_Command
0132 C02E mov R12,R16
0134 .dbline 98
0134 ; retry++;
0134 E394 inc R14
0136 .dbline 99
0136 ; if(retry==100)
0136 8E2D mov R24,R14
0138 8436 cpi R24,100
013A 01F4 brne L27
013C .dbline 100
013C ; {
013C .dbline 101
013C ; ;
013C .dbline 102
013C ; }
013C L27:
013C .dbline 103
013C ; }
013C L25:
013C .dbline 104
013C ; while(temp!=0);
013C CC20 tst R12
013E 81F7 brne L24
0140 .dbline 105
0140 ; retry=0;
0140 EE24 clr R14
0142 .dbline 106
0142 ; SD_Write_Command(16,512); //设置一次读写BLOCK的长度为512个字节
0142 40E0 ldi R20,0
0144 52E0 ldi R21,2
0146 60E0 ldi R22,0
0148 70E0 ldi R23,0
014A 6883 std y+0,R22
014C 7983 std y+1,R23
014E 9A01 movw R18,R20
0150 00E1 ldi R16,16
0152 65DF xcall _SD_Write_Command
0154 .dbline 108
0154 ;
0154 ; MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high
0154 C49A sbi 0x18,4
0156 .dbline 109
0156 ; return(0); //All commands have been taken.
0156 0027 clr R16
0158 .dbline -2
0158 L14:
0158 2296 adiw R28,2
015A 0E940000 xcall pop_gset5
015E .dbline 0 ; func end
015E 0895 ret
0160 .dbsym r i 10 c
0160 .dbsym r temp 12 c
0160 .dbsym r retry 14 c
0160 .dbend
0160 .dbfunc e SD_Read_Block _SD_Read_Block fc
0160 ; temp -> R20
0160 ; i -> R22,R23
0160 ; address -> y+6
.even
0160 _SD_Read_Block::
0160 0E940000 xcall push_arg4
0164 0E940000 xcall push_gset2
0168 2297 sbiw R28,2
016A .dbline -1
016A .dbline 115
016A ; }
016A ; //****************************************************************************
016A ; //从SD卡读一个扇区 Return 0 if no Error.
016A ; //****************************************************************************
016A ; uchar SD_Read_Block(unsigned long address)
016A ; {
016A .dbline 116
016A ; uchar temp=0;uint i=0;
016A 4427 clr R20
016C .dbline 116
016C 6627 clr R22
016E 7727 clr R23
0170 .dbline 117
0170 ; reading=1;
0170 81E0 ldi R24,1
0172 80930000 sts _reading,R24
0176 .dbline 118
0176 ; temp=SD_Write_Command(17,address); //读出RESPONSE
0176 FE01 movw R30,R28
0178 2680 ldd R2,z+6
017A 3780 ldd R3,z+7
017C 4084 ldd R4,z+8
017E 5184 ldd R5,z+9
0180 4882 std y+0,R4
0182 5982 std y+1,R5
0184 9101 movw R18,R2
0186 01E1 ldi R16,17
0188 4ADF xcall _SD_Write_Command
018A 402F mov R20,R16
018C L30:
018C .dbline 120
018C .dbline 120
018C .dbline 120
018C L31:
018C .dbline 119
018C ; while (Read_Byte_SPI()!= 0xfe)
018C 0E940000 xcall _Read_Byte_SPI
0190 0E3F cpi R16,254
0192 E1F7 brne L30
0194 .dbline 121
0194 ; {;} //直到读取到了数据的开始头0XFE,才继续
0194 ; for(i=0; i<512; i++)
0194 6627 clr R22
0196 7727 clr R23
0198 0AC0 xjmp L36
019A L33:
019A .dbline 122
019A .dbline 123
019A 0E940000 xcall _Read_Byte_SPI
019E 80E0 ldi R24,<_BUFFER
01A0 90E0 ldi R25,>_BUFFER
01A2 FB01 movw R30,R22
01A4 E80F add R30,R24
01A6 F91F adc R31,R25
01A8 0083 std z+0,R16
01AA .dbline 124
01AA L34:
01AA .dbline 121
01AA 6F5F subi R22,255 ; offset = 1
01AC 7F4F sbci R23,255
01AE L36:
01AE .dbline 121
01AE 6030 cpi R22,0
01B0 E2E0 ldi R30,2
01B2 7E07 cpc R23,R30
01B4 90F3 brlo L33
01B6 .dbline 125
01B6 ; {
01B6 ; BUFFER[i]=Read_Byte_SPI();
01B6 ; }
01B6 ; Read_Byte_SPI();//CRC - Byte
01B6 0E940000 xcall _Read_Byte_SPI
01BA .dbline 126
01BA ; Read_Byte_SPI();//CRC - Byte
01BA 0E940000 xcall _Read_Byte_SPI
01BE .dbline 127
01BE ; reading=0;
01BE 2224 clr R2
01C0 20920000 sts _reading,R2
01C4 .dbline 128
01C4 ; MMC_PORT|=MMC_CS_PIN; //关闭SD卡
01C4 C49A sbi 0x18,4
01C6 .dbline 129
01C6 ; return(temp);
01C6 042F mov R16,R20
01C8 .dbline -2
01C8 L29:
01C8 2296 adiw R28,2
01CA 0E940000 xcall pop_gset2
01CE 2496 adiw R28,4
01D0 .dbline 0 ; func end
01D0 0895 ret
01D2 .dbsym r temp 20 c
01D2 .dbsym r i 22 i
01D2 .dbsym l address 6 l
01D2 .dbend
.area bss(ram, con, rel)
0000 .dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\sd.c
0000 _BUFFER::
0000 .blkb 512
0200 .dbsym e BUFFER _BUFFER A[512:512]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -