📄 mp3.lst
字号:
0248 837B STD Y+3,R23
0249 E021 LDI R18,1
024A E209 LDI R16,0x29
024B DE6A RCALL _sd_write_command
(0110) }
024C C002 RJMP 0x024F
(0111) else
(0112) n=SD_IDLE_WAIT_MAX; //no response
024D E684 LDI R24,0x64
024E 2EA8 MOV R10,R24
(0113) delay(500);//经调试需要加延迟
024F EF04 LDI R16,0xF4
0250 E011 LDI R17,1
0251 940E0293 CALL _delay
(0114) }
(0115) while(((response[0]&MSK_IDLE)==MSK_IDLE)&&(n<SD_IDLE_WAIT_MAX));
0253 91800065 LDS R24,_response
0255 7081 ANDI R24,1
0256 3081 CPI R24,1
0257 F419 BNE 0x025B
0258 2D8A MOV R24,R10
0259 3684 CPI R24,0x64
025A F280 BCS 0x022B
(0116) if(n>=SD_IDLE_WAIT_MAX)
025B 2D8A MOV R24,R10
025C 3684 CPI R24,0x64
025D F010 BCS 0x0260
(0117) return 0;
025E 2700 CLR R16
025F C01B RJMP 0x027B
(0118) if(sd_write_command(CMD58,CMD58_R,0,response)==0)//读取OCR
0260 E685 LDI R24,0x65
0261 E090 LDI R25,0
0262 839D STD Y+5,R25
0263 838C STD Y+4,R24
0264 E040 LDI R20,0
0265 E050 LDI R21,0
0266 E060 LDI R22,0
0267 E070 LDI R23,0
0268 8348 STD Y+0,R20
0269 8359 STD Y+1,R21
026A 836A STD Y+2,R22
026B 837B STD Y+3,R23
026C E024 LDI R18,4
026D E30A LDI R16,0x3A
026E DE47 RCALL _sd_write_command
026F 2300 TST R16
0270 F411 BNE 0x0273
(0119) return 0;
0271 2700 CLR R16
0272 C008 RJMP 0x027B
(0120) if((response[2]&MSK_OCR_33)!=MSK_OCR_33)//电压最低为3.3V
0273 91800067 LDS R24,_response+2
0275 7C80 ANDI R24,0xC0
0276 3C80 CPI R24,0xC0
0277 F011 BEQ 0x027A
(0121) return 0;
0278 2700 CLR R16
0279 C001 RJMP 0x027B
(0122) /*set block length
(0123) if(sd_write_command(CMD16,CMD16_R,DATA_LENGTH,response)==0)
(0124) return 0;
(0125) */
(0126) return 1;
027A E001 LDI R16,1
027B 9626 ADIW R28,6
027C 940E0A71 CALL pop_gset3
027E 9508 RET
_sd_init:
j --> R20
n --> R22
027F 940E0A91 CALL push_gset2
(0127) }
(0128)
(0129) uchar sd_init(void)
(0130) { uchar n,j;
(0131) j=0;
0281 2744 CLR R20
(0132) for(n=0;(n<SD_INIT_TRY)&&(j!=1);n++)
0282 2766 CLR R22
0283 C003 RJMP 0x0287
(0133) j=do_sd_init();
0284 DF85 RCALL _do_sd_init
0285 2F40 MOV R20,R16
0286 9563 INC R22
0287 3362 CPI R22,0x32
0288 F410 BCC 0x028B
0289 3041 CPI R20,1
028A F7C9 BNE 0x0284
(0134) if(n>=SD_INIT_TRY)//超次数
028B 3362 CPI R22,0x32
028C F010 BCS 0x028F
(0135) return 0;
028D 2700 CLR R16
028E C001 RJMP 0x0290
(0136) return 1;
028F E001 LDI R16,1
0290 940E0A6E CALL pop_gset2
0292 9508 RET
_delay:
m --> R20
n --> R22
dat --> R16
0293 940E0A91 CALL push_gset2
FILE: F:\mine\mp3\MP3\vs1001K.c
(0001) #include<all.h>
(0002)
(0003) void delay(uint dat)//延迟10us
(0004) { uint m,n;
(0005) for(m=0;m<dat;m++)
0295 2744 CLR R20
0296 2755 CLR R21
0297 C00B RJMP 0x02A3
(0006) for(n=0;n<2;n++);
0298 2766 CLR R22
0299 2777 CLR R23
029A C002 RJMP 0x029D
029B 5F6F SUBI R22,0xFF
029C 4F7F SBCI R23,0xFF
029D 3062 CPI R22,2
029E E0E0 LDI R30,0
029F 077E CPC R23,R30
02A0 F3D0 BCS 0x029B
02A1 5F4F SUBI R20,0xFF
02A2 4F5F SBCI R21,0xFF
02A3 1740 CP R20,R16
02A4 0751 CPC R21,R17
02A5 F390 BCS 0x0298
(0007) }
02A6 940E0A6E CALL pop_gset2
02A8 9508 RET
(0008) /*等DREQ*/
(0009) void vs_wait_dreq(void)
(0010) { while(!(PIND&0x04)); }
_vs_wait_dreq:
02A9 9B82 SBIS 0x10,2
02AA CFFE RJMP _vs_wait_dreq
02AB 9508 RET
(0011)
(0012) /*发单个命令*/
(0013) uchar write_single(uchar dat)//发
(0014) {
(0015) SPDR=dat;
_write_single:
dat --> R16
02AC B90F OUT 0x0F,R16
(0016) while(!(SPSR&0x80));
02AD 9B77 SBIS 0x0E,7
02AE CFFE RJMP 0x02AD
(0017) return SPDR;
02AF B10F IN R16,0x0F
02B0 9508 RET
(0018) }
(0019)
(0020) uchar read_single(void)//读单个数据
(0021) { return write_single(0xff); }
_read_single:
02B1 EF0F LDI R16,0xFF
02B2 CFF9 RJMP _write_single
_vs_write_sci:
dat --> R20
add --> R22
02B3 940E0A91 CALL push_gset2
02B5 01A9 MOVW R20,R18
02B6 2F60 MOV R22,R16
(0022)
(0023) /*写命令*/
(0024) void vs_write_sci(uchar add,uint dat)//写命令
(0025) { clear_xcs;//XCS有效
02B7 98C4 CBI 0x18,4
(0026) select_vs;
02B8 9AC3 SBI 0x18,3
(0027) write_single(0x02);//写命令
02B9 E002 LDI R16,2
02BA DFF1 RCALL _write_single
(0028) write_single(add);//写地址
02BB 2F06 MOV R16,R22
02BC DFEF RCALL _write_single
(0029) write_single((uchar)(dat>>8));
02BD 018A MOVW R16,R20
02BE 2F01 MOV R16,R17
02BF 2711 CLR R17
02C0 DFEB RCALL _write_single
(0030) write_single((uchar)dat );
02C1 2F04 MOV R16,R20
02C2 DFE9 RCALL _write_single
(0031) set_xcs;
02C3 9AC4 SBI 0x18,4
(0032) }
02C4 940E0A6E CALL pop_gset2
02C6 9508 RET
_vs_read_sci:
dat --> R20
add --> R20
02C7 940E0A7A CALL push_gset1
02C9 2F40 MOV R20,R16
(0033)
(0034) uint vs_read_sci(uchar add)//读命令
(0035) { uint dat;
(0036) clear_xcs;//XCS有效
02CA 98C4 CBI 0x18,4
(0037) select_vs;
02CB 9AC3 SBI 0x18,3
(0038) write_single(0x03);//读命令
02CC E003 LDI R16,3
02CD DFDE RCALL _write_single
(0039) write_single(add);//写地址
02CE 2F04 MOV R16,R20
02CF DFDC RCALL _write_single
(0040) dat=(uint)read_single()<<8;
02D0 DFE0 RCALL _read_single
02D1 2F40 MOV R20,R16
02D2 2755 CLR R21
02D3 2F54 MOV R21,R20
02D4 2744 CLR R20
(0041) dat|=read_single();
02D5 DFDB RCALL _read_single
02D6 2E20 MOV R2,R16
02D7 2433 CLR R3
02D8 2942 OR R20,R2
02D9 2953 OR R21,R3
(0042) set_xcs;
02DA 9AC4 SBI 0x18,4
(0043) return dat;
02DB 018A MOVW R16,R20
02DC 940E0A7D CALL pop_gset1
02DE 9508 RET
(0044) }
(0045) /*发数据*/
(0046) void vs_write_sdi_byte(uchar dat)//发送单个字节
(0047) { set_xcs;
_vs_write_sdi_byte:
dat --> R16
02DF 9AC4 SBI 0x18,4
(0048) select_vs;
02E0 9AC3 SBI 0x18,3
(0049) clear_bysnc;
02E1 98C0 CBI 0x18,0
(0050) set_bysnc;
02E2 9AC0 SBI 0x18,0
(0051) SPDR=dat;
02E3 B90F OUT 0x0F,R16
(0052) while(!(SPSR&0x80));
02E4 9B77 SBIS 0x0E,7
02E5 CFFE RJMP 0x02E4
(0053) clear_bysnc;
02E6 98C0 CBI 0x18,0
(0054) }
02E7 9508 RET
_vs_write_sdi_bytes:
i --> R20
n --> R18
add --> R16
02E8 940E0A7A CALL push_gset1
(0055) void vs_write_sdi_bytes(uchar *add,uint n)//发送多个数据
(0056) { uint i;
(0057) // vs_wait_dreq();//等DREQ变高
(0058) select_vs;
02EA 9AC3 SBI 0x18,3
(0059) set_xcs;//选中DCLK
02EB 9AC4 SBI 0x18,4
(0060) for(i=0;i<n;i++)
02EC 2744 CLR R20
02ED 2755 CLR R21
02EE C00A RJMP 0x02F9
(0061) { clear_bysnc;
02EF 98C0 CBI 0x18,0
(0062) set_bysnc;
02F0 9AC0 SBI 0x18,0
(0063) SPDR=*add++;
02F1 01F8 MOVW R30,R16
02F2 9021 LD R2,Z+
02F3 018F MOVW R16,R30
02F4 B82F OUT 0x0F,R2
(0064) while(!(SPSR&0x80));
02F5 9B77 SBIS 0x0E,7
02F6 CFFE RJMP 0x02F5
02F7 5F4F SUBI R20,0xFF
02F8 4F5F SBCI R21,0xFF
02F9 1742 CP R20,R18
02FA 0753 CPC R21,R19
02FB F398 BCS 0x02EF
(0065) }
(0066) while(!(SPSR&0x80));
02FC 9B77 SBIS 0x0E,7
02FD CFFE RJMP 0x02FC
(0067) clear_bysnc;
02FE 98C0 CBI 0x18,0
(0068) }
02FF 940E0A7D CALL pop_gset1
0301 9508 RET
(0069) void vs1001k_reset(void)//VS1001K复位
(0070) { vs_write_sci(MODE,0x0004);
_vs1001k_reset:
0302 E024 LDI R18,4
0303 E030 LDI R19,0
0304 2700 CLR R16
0305 DFAD RCALL _vs_write_sci
(0071) delay(500);
0306 EF04 LDI R16,0xF4
0307 E011 LDI R17,1
0308 DF8A RCALL _delay
(0072) vs_wait_dreq();
0309 DF9F RCALL _vs_wait_dreq
(0073) vs_write_sci(MODE,0x0000);
030A 2722 CLR R18
030B 2733 CLR R19
030C 2700 CLR R16
030D DFA5 RCALL _vs_write_sci
(0074) vs_write_sci(VOL,0x0000);
030E 2722 CLR R18
030F 2733 CLR R19
0310 E00B LDI R16,0xB
0311 DFA1 RCALL _vs_write_sci
(0075) vs_write_sdi_byte(0x00);
0312 2700 CLR R16
0313 DFCB RCALL _vs_write_sdi_byte
(0076) vs_write_sdi_byte(0x00);
0314 2700 CLR R16
(0077) }
0315 CFC9 RJMP _vs_write_sdi_byte
_KEY:
n --> R20
0316 940E0AC6 CALL push_lset
0318 940E0A7A CALL push_gset1
FILE: F:\mine\mp3\MP3\fat.c
(0001) #include<all.h>
(0002) #include<vs1001k.h>
(0003) #include<sd.h>
(0004) #include<sdcom.h>
(0005) #define FAT12 3 //占1个半
(0006) #define FAT16 2 //占有2个byte
(0007) #define FAT32 4 //占4 byte
(0008)
(0009) #define PlayEnd 1//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -