📄 mp3.lst
字号:
012B 5041 SUBI R20,1
012C 4050 SBCI R21,0
012D 3040 CPI R20,0
012E E0E0 LDI R30,0
012F 075E CPC R21,R30
0130 F79C BGE 0x0124
(0055) }
(0056) if(response_type==R1B)//忙等待结束
0131 2D8C MOV R24,R12
0132 3082 CPI R24,2
0133 F441 BNE 0x013C
(0057) { do
(0058) { dat=read_single();}
0134 940E02B1 CALL _read_single
0136 2F60 MOV R22,R16
(0059) while(dat!=0xff);
0137 3F6F CPI R22,0xFF
0138 F7D9 BNE 0x0134
(0060) write_single(0xff);
0139 EF0F LDI R16,0xFF
013A 940E02AC CALL _write_single
(0061) }
(0062) select_vs;//释放SD
013C 9AC3 SBI 0x18,3
(0063) return 1;
013D E001 LDI R16,1
013E 940E0A77 CALL pop_gset5
0140 9508 RET
_read_block:
dat --> R12
n --> Y+6
mp3_data --> R10
length --> Y+22
blockadd --> Y+18
0141 940E0A0D CALL push_arg4
0143 940E0A99 CALL push_gset4
0145 972A SBIW R28,0xA
0146 8CAA LDD R10,Y+26
0147 8CBB LDD R11,Y+27
(0064) }
(0065)
(0066) uchar read_block(ulong blockadd,ulong length,uchar *mp3_data)
(0067) { uchar dat;
(0068) ulong n;
(0069) sd_wait_nobusy();
0148 DF54 RCALL _sd_wait_nobusy
(0070) if(sd_write_command(CMD16,CMD16_R,length,response)==0)//设置读取数据的长度
0149 E685 LDI R24,0x65
014A E090 LDI R25,0
014B 839D STD Y+5,R25
014C 838C STD Y+4,R24
014D 01FE MOVW R30,R28
014E 8826 LDD R2,Z+22
014F 8837 LDD R3,Z+23
0150 8C40 LDD R4,Z+24
0151 8C51 LDD R5,Z+25
0152 8228 STD Y+0,R2
0153 8239 STD Y+1,R3
0154 824A STD Y+2,R4
0155 825B STD Y+3,R5
0156 E021 LDI R18,1
0157 E100 LDI R16,0x10
0158 DF5D RCALL _sd_write_command
0159 2300 TST R16
015A F411 BNE 0x015D
(0071) return 0;
015B 2700 CLR R16
015C C089 RJMP 0x01E6
(0072) //blockadd<<=9;//增加512B
(0073) if(sd_write_command(CMD17,CMD17_R,blockadd,response)==0)
015D E685 LDI R24,0x65
015E E090 LDI R25,0
015F 839D STD Y+5,R25
0160 838C STD Y+4,R24
0161 01FE MOVW R30,R28
0162 8822 LDD R2,Z+18
0163 8833 LDD R3,Z+19
0164 8844 LDD R4,Z+20
0165 8855 LDD R5,Z+21
0166 8228 STD Y+0,R2
0167 8239 STD Y+1,R3
0168 824A STD Y+2,R4
0169 825B STD Y+3,R5
016A E021 LDI R18,1
016B E101 LDI R16,0x11
016C DF49 RCALL _sd_write_command
016D 2300 TST R16
016E F411 BNE 0x0171
(0074) return 0;
016F 2700 CLR R16
0170 C075 RJMP 0x01E6
(0075) if(response[0]!=0)//出现error
0171 90200065 LDS R2,_response
0173 2022 TST R2
0174 F011 BEQ 0x0177
(0076) return 0;
0175 2700 CLR R16
0176 C06F RJMP 0x01E6
(0077) select_sd;
0177 98C3 CBI 0x18,3
(0078) n=0;
0178 E040 LDI R20,0
0179 E050 LDI R21,0
017A E060 LDI R22,0
017B E070 LDI R23,0
017C 01FE MOVW R30,R28
017D 8346 STD Z+6,R20
017E 8357 STD Z+7,R21
017F 8760 STD Z+8,R22
0180 8771 STD Z+9,R23
(0079) do
(0080) { dat=read_single();
0181 940E02B1 CALL _read_single
0183 2EC0 MOV R12,R16
(0081) n++;
0184 E041 LDI R20,1
0185 E050 LDI R21,0
0186 E060 LDI R22,0
0187 E070 LDI R23,0
0188 01FE MOVW R30,R28
0189 8026 LDD R2,Z+6
018A 8037 LDD R3,Z+7
018B 8440 LDD R4,Z+8
018C 8451 LDD R5,Z+9
018D 0E24 ADD R2,R20
018E 1E35 ADC R3,R21
018F 1E46 ADC R4,R22
0190 1E57 ADC R5,R23
0191 01FE MOVW R30,R28
0192 8226 STD Z+6,R2
0193 8237 STD Z+7,R3
0194 8640 STD Z+8,R4
0195 8651 STD Z+9,R5
(0082) }
(0083) while((dat==0xff)&&(n<TIMEOUT_READ));//读出数据的头0xfe
0196 2D8C MOV R24,R12
0197 3F8F CPI R24,0xFF
0198 F471 BNE 0x01A7
0199 E840 LDI R20,0x80
019A E15A LDI R21,0x1A
019B E066 LDI R22,6
019C E070 LDI R23,0
019D 01FE MOVW R30,R28
019E 8026 LDD R2,Z+6
019F 8037 LDD R3,Z+7
01A0 8440 LDD R4,Z+8
01A1 8451 LDD R5,Z+9
01A2 1624 CP R2,R20
01A3 0635 CPC R3,R21
01A4 0646 CPC R4,R22
01A5 0657 CPC R5,R23
01A6 F2D0 BCS 0x0181
(0084) for(n=0;n<length;n++)
01A7 E040 LDI R20,0
01A8 E050 LDI R21,0
01A9 E060 LDI R22,0
01AA E070 LDI R23,0
01AB 01FE MOVW R30,R28
01AC 8346 STD Z+6,R20
01AD 8357 STD Z+7,R21
01AE 8760 STD Z+8,R22
01AF 8771 STD Z+9,R23
01B0 C01F RJMP 0x01D0
(0085) { mp3_data[n]=read_single();}
01B1 940E02B1 CALL _read_single
01B3 01FE MOVW R30,R28
01B4 93AF PUSH R26
01B5 93BF PUSH R27
01B6 81A6 LDD R26,Z+6
01B7 81B7 LDD R27,Z+7
01B8 01FD MOVW R30,R26
01B9 91BF POP R27
01BA 91AF POP R26
01BB 0DEA ADD R30,R10
01BC 1DFB ADC R31,R11
01BD 8300 STD Z+0,R16
01BE E041 LDI R20,1
01BF E050 LDI R21,0
01C0 E060 LDI R22,0
01C1 E070 LDI R23,0
01C2 01FE MOVW R30,R28
01C3 8026 LDD R2,Z+6
01C4 8037 LDD R3,Z+7
01C5 8440 LDD R4,Z+8
01C6 8451 LDD R5,Z+9
01C7 0E24 ADD R2,R20
01C8 1E35 ADC R3,R21
01C9 1E46 ADC R4,R22
01CA 1E57 ADC R5,R23
01CB 01FE MOVW R30,R28
01CC 8226 STD Z+6,R2
01CD 8237 STD Z+7,R3
01CE 8640 STD Z+8,R4
01CF 8651 STD Z+9,R5
01D0 01FE MOVW R30,R28
01D1 8826 LDD R2,Z+22
01D2 8837 LDD R3,Z+23
01D3 8C40 LDD R4,Z+24
01D4 8C51 LDD R5,Z+25
01D5 01FE MOVW R30,R28
01D6 8066 LDD R6,Z+6
01D7 8077 LDD R7,Z+7
01D8 8480 LDD R8,Z+8
01D9 8491 LDD R9,Z+9
01DA 1462 CP R6,R2
01DB 0473 CPC R7,R3
01DC 0484 CPC R8,R4
01DD 0495 CPC R9,R5
01DE F408 BCC 0x01E0
01DF CFD1 RJMP 0x01B1
(0086) read_single();//CRC 16bit
01E0 940E02B1 CALL _read_single
(0087) read_single();
01E2 940E02B1 CALL _read_single
(0088) select_vs;
01E4 9AC3 SBI 0x18,3
(0089) return 1;
01E5 E001 LDI R16,1
01E6 962A ADIW R28,0xA
01E7 940E0A74 CALL pop_gset4
01E9 9624 ADIW R28,4
01EA 9508 RET
_sd_read_block:
mp3_data --> R20
length --> Y+12
blockadd --> Y+8
01EB 940E0A0D CALL push_arg4
01ED 940E0A7A CALL push_gset1
01EF 9726 SBIW R28,6
01F0 8948 LDD R20,Y+16
01F1 8959 LDD R21,Y+17
(0090) }
(0091)
(0092) void sd_read_block(ulong blockadd,ulong length,uchar *mp3_data)//读SD数据
(0093) { while(read_block(blockadd,length,mp3_data)==0);}
01F2 835D STD Y+5,R21
01F3 834C STD Y+4,R20
01F4 01FE MOVW R30,R28
01F5 8424 LDD R2,Z+12
01F6 8435 LDD R3,Z+13
01F7 8446 LDD R4,Z+14
01F8 8457 LDD R5,Z+15
01F9 8228 STD Y+0,R2
01FA 8239 STD Y+1,R3
01FB 824A STD Y+2,R4
01FC 825B STD Y+3,R5
01FD 01FE MOVW R30,R28
01FE 8500 LDD R16,Z+8
01FF 8511 LDD R17,Z+9
0200 8522 LDD R18,Z+10
0201 8533 LDD R19,Z+11
0202 DF3E RCALL _read_block
0203 2300 TST R16
0204 F369 BEQ 0x01F2
0205 9626 ADIW R28,6
0206 940E0A7D CALL pop_gset1
0208 9624 ADIW R28,4
0209 9508 RET
_do_sd_init:
n --> R10
020A 940E0A95 CALL push_gset3
020C 9726 SBIW R28,6
(0094)
(0095) uchar do_sd_init(void)//sd初始化
(0096) { uchar n;
(0097) delay(200);
020D EC08 LDI R16,0xC8
020E E010 LDI R17,0
020F 940E0293 CALL _delay
(0098) select_sd;
0211 98C3 CBI 0x18,3
(0099) sd_delay(100);
0212 E604 LDI R16,0x64
0213 DE8F RCALL _sd_delay
(0100) select_vs;
0214 9AC3 SBI 0x18,3
(0101) sd_delay(2);
0215 E002 LDI R16,2
0216 DE8C RCALL _sd_delay
(0102) if(sd_write_command(CMD0,CMD0_R,0,response)==0)
0217 E685 LDI R24,0x65
0218 E090 LDI R25,0
0219 839D STD Y+5,R25
021A 838C STD Y+4,R24
021B E040 LDI R20,0
021C E050 LDI R21,0
021D E060 LDI R22,0
021E E070 LDI R23,0
021F 8348 STD Y+0,R20
0220 8359 STD Y+1,R21
0221 836A STD Y+2,R22
0222 837B STD Y+3,R23
0223 E021 LDI R18,1
0224 2700 CLR R16
0225 DE90 RCALL _sd_write_command
0226 2300 TST R16
0227 F411 BNE 0x022A
(0103) return 0;
0228 2700 CLR R16
0229 C051 RJMP 0x027B
(0104) n=0;
022A 24AA CLR R10
(0105) do
(0106) { n++;
022B 94A3 INC R10
(0107) if(sd_write_command(CMD55,CMD55_R,0,response)==1)//进入special command
022C E685 LDI R24,0x65
022D E090 LDI R25,0
022E 839D STD Y+5,R25
022F 838C STD Y+4,R24
0230 E040 LDI R20,0
0231 E050 LDI R21,0
0232 E060 LDI R22,0
0233 E070 LDI R23,0
0234 8348 STD Y+0,R20
0235 8359 STD Y+1,R21
0236 836A STD Y+2,R22
0237 837B STD Y+3,R23
0238 E021 LDI R18,1
0239 E307 LDI R16,0x37
023A DE7B RCALL _sd_write_command
023B 3001 CPI R16,1
023C F481 BNE 0x024D
(0108) { /*getin OCR*/
(0109) sd_write_command(ACMD41,ACMD41_R,0,response);
023D E685 LDI R24,0x65
023E E090 LDI R25,0
023F 839D STD Y+5,R25
0240 838C STD Y+4,R24
0241 E040 LDI R20,0
0242 E050 LDI R21,0
0243 E060 LDI R22,0
0244 E070 LDI R23,0
0245 8348 STD Y+0,R20
0246 8359 STD Y+1,R21
0247 836A STD Y+2,R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -