⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.lst

📁 用AVR的MP3代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    03D7 0631      CPC	R3,R17
    03D8 F3D0      BCS	0x03D3
    03D9 940E0DAF  CALL	pop_gset1
    03DB 9508      RET
(0016) 			;
(0017) 	}
(0018) 
(0019) //SPI initialize
(0020) void spi_init(void)
(0021) {
(0022)  DDRB = 0xBF;    //SI输入,SO,SCK,SS输出
_spi_init:
    03DC EB8F      LDI	R24,0xBF
    03DD BB87      OUT	0x17,R24
(0023)  SPCR = 0x51;  //setup SPI
    03DE E581      LDI	R24,0x51
    03DF B98D      OUT	0x0D,R24
(0024)  SPSR = 0x00;  //setup SPI
    03E0 2422      CLR	R2
    03E1 B82E      OUT	0x0E,R2
    03E2 9508      RET
(0025) }
(0026) void mp3_port_init()
(0027) {
(0028) spi_init();
_mp3_port_init:
    03E3 DFF8      RCALL	_spi_init
(0029) MP3_DDR|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
    03E4 B387      IN	R24,0x17
    03E5 6B80      ORI	R24,0xB0
    03E6 BB87      OUT	0x17,R24
(0030) MP3_DDR&=~MP3_DATA_REQ;
    03E7 98BE      CBI	0x17,6
(0031) MP3_PORT|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
    03E8 B388      IN	R24,0x18
    03E9 6B80      ORI	R24,0xB0
    03EA BB88      OUT	0x18,R24
    03EB 9508      RET
(0032) }
(0033) void Write_Byte_SPI(unsigned char byte)
(0034) {   
(0035)     SPDR = byte;
_Write_Byte_SPI:
  byte                 --> R16
    03EC B90F      OUT	0x0F,R16
(0036)     while (!(SPSR & (1<<SPIF)));
    03ED 9B77      SBIS	0x0E,7
    03EE CFFE      RJMP	0x03ED
    03EF 9508      RET
(0037) }
(0038) unsigned char Read_Byte_SPI(void)
(0039) {   
(0040)     SPDR = 0xFF;
_Read_Byte_SPI:
    03F0 EF8F      LDI	R24,0xFF
    03F1 B98F      OUT	0x0F,R24
(0041)     while (!(SPSR &(1<<SPIF)));
    03F2 9B77      SBIS	0x0E,7
    03F3 CFFE      RJMP	0x03F2
(0042)     return SPDR;
    03F4 B10F      IN	R16,0x0F
    03F5 9508      RET
_vs1003_cmd_write:
  data                 --> R20
  address              --> R22
    03F6 940E0DAA  CALL	push_gset2
    03F8 01A9      MOVW	R20,R18
    03F9 2F60      MOV	R22,R16
(0043) }
(0044) 
(0045) void vs1003_cmd_write(uchar address,uint data)
(0046) { 
(0047) //==============新增
(0048) SPCR = 0x53;  //
    03FA E583      LDI	R24,0x53
    03FB B98D      OUT	0x0D,R24
(0049) SPSR = 0x00;  //低速度spi
    03FC 2422      CLR	R2
    03FD B82E      OUT	0x0E,R2
(0050) //============== 
(0051) MP3_PORT|=MP3_DATA_CS;       //MP3_DATA_CS=1;
    03FE 9AC7      SBI	0x18,7
(0052) MP3_PORT&=~MP3_CMD_CS;       //MP3_CMD_CS=0;
    03FF 98C4      CBI	0x18,4
(0053) Write_Byte_SPI(0x02);      //VS1011的写命令
    0400 E002      LDI	R16,2
    0401 DFEA      RCALL	_Write_Byte_SPI
(0054) delay_nnus(20);
    0402 E104      LDI	R16,0x14
    0403 E010      LDI	R17,0
    0404 DFCA      RCALL	_delay_nnus
(0055) Write_Byte_SPI(address);   //地址
    0405 2F06      MOV	R16,R22
    0406 DFE5      RCALL	_Write_Byte_SPI
(0056) Write_Byte_SPI(data>>8);
    0407 018A      MOVW	R16,R20
    0408 2F01      MOV	R16,R17
    0409 2711      CLR	R17
    040A DFE1      RCALL	_Write_Byte_SPI
(0057) Write_Byte_SPI(data);
    040B 2F04      MOV	R16,R20
    040C DFDF      RCALL	_Write_Byte_SPI
(0058) delay_nnus(20);
    040D E104      LDI	R16,0x14
    040E E010      LDI	R17,0
    040F DFBF      RCALL	_delay_nnus
(0059) MP3_PORT|=MP3_CMD_CS;       //MP3_CMD_CS=1;
    0410 9AC4      SBI	0x18,4
(0060) //==============以下新增
(0061) SPCR = 0x50;  //
    0411 E580      LDI	R24,0x50
    0412 B98D      OUT	0x0D,R24
(0062) SPSR = 0x01;  //高速spi
    0413 E081      LDI	R24,1
    0414 B98E      OUT	0x0E,R24
    0415 940E0D98  CALL	pop_gset2
    0417 9508      RET
_vs1003_data_write:
  data                 --> R20
    0418 940E0DAC  CALL	push_gset1
    041A 2F40      MOV	R20,R16
(0063) //========================= 
(0064) } 
(0065) 
(0066) void vs1003_data_write(uchar data)
(0067) {
(0068) MP3_PORT&=~MP3_DATA_CS;         //MP3_DATA_CS=0;
    041B 98C7      CBI	0x18,7
(0069) Write_Byte_SPI(data);
    041C 2F04      MOV	R16,R20
    041D DFCE      RCALL	_Write_Byte_SPI
(0070) MP3_PORT|=MP3_DATA_CS;         //MP3_DATA_CS=1;
    041E 9AC7      SBI	0x18,7
(0071) MP3_PORT|=MP3_CMD_CS;         //MP3_CMD_CS=1; 
    041F 9AC4      SBI	0x18,4
    0420 940E0DAF  CALL	pop_gset1
    0422 9508      RET
_vs1003_read:
  temp1                --> R22
  temp                 --> R20
  address              --> R10
    0423 940E0DA8  CALL	push_gset3
    0425 2EA0      MOV	R10,R16
(0072) }
(0073) 
(0074) uint vs1003_read(uchar address)
(0075) {
(0076) uchar temp1=0;
    0426 2766      CLR	R22
(0077) uint temp=0; 
    0427 2744      CLR	R20
    0428 2755      CLR	R21
(0078) MP3_PORT|=MP3_DATA_CS;        //MP3_DATA_CS=1;
    0429 9AC7      SBI	0x18,7
(0079) MP3_PORT&=~MP3_CMD_CS;        //MP3_CMD_CS=0;
    042A 98C4      CBI	0x18,4
(0080) Write_Byte_SPI(0x03);      //VS1011的读命令
    042B E003      LDI	R16,3
    042C DFBF      RCALL	_Write_Byte_SPI
(0081) delay_nnus(30);
    042D E10E      LDI	R16,0x1E
    042E E010      LDI	R17,0
    042F DF9F      RCALL	_delay_nnus
(0082) Write_Byte_SPI(address);   //地址
    0430 2D0A      MOV	R16,R10
    0431 DFBA      RCALL	_Write_Byte_SPI
(0083) temp=Read_Byte_SPI();
    0432 DFBD      RCALL	_Read_Byte_SPI
    0433 2F40      MOV	R20,R16
    0434 2755      CLR	R21
(0084) temp=temp<<8;
    0435 2F54      MOV	R21,R20
    0436 2744      CLR	R20
(0085) temp1=Read_Byte_SPI();
    0437 DFB8      RCALL	_Read_Byte_SPI
    0438 2F60      MOV	R22,R16
(0086) temp=temp|temp1; 
    0439 2E26      MOV	R2,R22
    043A 2433      CLR	R3
    043B 2942      OR	R20,R2
    043C 2953      OR	R21,R3
(0087) MP3_PORT|=MP3_CMD_CS;       //MP3_CMD_CS=1;
    043D 9AC4      SBI	0x18,4
(0088) return temp;
    043E 018A      MOVW	R16,R20
    043F 940E0D9B  CALL	pop_gset3
    0441 9508      RET
(0089) 
(0090) }
(0091) 
(0092) void vs1003_init(void)
(0093) {
(0094) vs1003_cmd_write(0x0b,0X1010);    //VOLUME
_vs1003_init:
    0442 E120      LDI	R18,0x10
    0443 E130      LDI	R19,0x10
    0444 E00B      LDI	R16,0xB
    0445 DFB0      RCALL	_vs1003_cmd_write
(0095) vs1003_cmd_write(0x00,0x0800);     //NEW MODE
    0446 E020      LDI	R18,0
    0447 E038      LDI	R19,0x8
    0448 2700      CLR	R16
    0449 DFAC      RCALL	_vs1003_cmd_write
(0096) vs1003_cmd_write(0x02,0X1fff);       //BASS
    044A EF2F      LDI	R18,0xFF
    044B E13F      LDI	R19,0x1F
    044C E002      LDI	R16,2
    044D DFA8      RCALL	_vs1003_cmd_write
(0097) vs1003_cmd_write(0x03,0X4000);     //CLOCK F
    044E E020      LDI	R18,0
    044F E430      LDI	R19,0x40
    0450 E003      LDI	R16,3
    0451 DFA4      RCALL	_vs1003_cmd_write
(0098) vs1003_cmd_write(0x03,0X4000);     //CLOCK F
    0452 E020      LDI	R18,0
    0453 E430      LDI	R19,0x40
    0454 E003      LDI	R16,3
    0455 DFA0      RCALL	_vs1003_cmd_write
    0456 9508      RET
_ReadBlock:
  temp                 --> Y+0
  LBA                  --> Y+4
    0457 940E0CAE  CALL	push_arg4
    0459 9724      SBIW	R28,4
FILE: E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
(0001) /************************************************************/
(0002) /*		         FAT Code for   M32L					    */
(0003) /*				   By   pasyong								*/
(0004) /*				   2006-4									*/
(0005) /*				   Base ICC6.31A					        */
(0006) /************************************************************/
(0007) #include <iom64v.h>
(0008) #include <macros.h>
(0009) #include <string.h>
(0010) #include "sd.h"
(0011) #include "fat.h"
(0012) #include "lcd.h"
(0013) 
(0014) 
(0015) extern uchar BUFFER[512];
(0016) unsigned char  LONGNAME_BUFFER_ADDR[30];
(0017) unsigned char  DIRNAME_BUFFER_ADDR[30];
(0018) unsigned char *LongNameBuffer =		(unsigned char *) LONGNAME_BUFFER_ADDR;
(0019) unsigned char *DirNameBuffer =		(unsigned char *) DIRNAME_BUFFER_ADDR;
(0020) struct partrecord PartInfo;
(0021) unsigned char Fat32Enabled;
(0022) unsigned long FirstDataSector;
(0023) unsigned int  BytesPerSector;
(0024) unsigned int  SectorsPerCluster;
(0025) unsigned long FirstFATSector;
(0026) unsigned long FirstDirSector;
(0027) unsigned long FileSize;
(0028) unsigned long FatInCache = 0;
(0029) 
(0030) //********************************************************************************************
(0031) //读一个扇区
(0032) void ReadBlock(unsigned long LBA)
(0033) //********************************************************************************************
(0034) {   unsigned long temp;
(0035)     temp=LBA<<9;
    045A E089      LDI	R24,0x9
    045B E090      LDI	R25,0
    045C 01FE      MOVW	R30,R28
    045D 8024      LDD	R2,Z+4
    045E 8035      LDD	R3,Z+5
    045F 8046      LDD	R4,Z+6
    0460 8057      LDD	R5,Z+7
    0461 938A      ST	R24,-Y
    0462 0181      MOVW	R16,R2
    0463 0192      MOVW	R18,R4
    0464 940E0DE8  CALL	lsl32
    0466 01FE      MOVW	R30,R28
    0467 8300      STD	Z+0,R16
    0468 8311      STD	Z+1,R17
    0469 8322      STD	Z+2,R18
    046A 8333      STD	Z+3,R19
(0036)     SD_Read_Block(temp);
    046B 01FE      MOVW	R30,R28
    046C 8100      LDD	R16,Z+0
    046D 8111      LDD	R17,Z+1
    046E 8122      LDD	R18,Z+2
    046F 8133      LDD	R19,Z+3
    0470 940E0396  CALL	_SD_Read_Block
    0472 9628      ADIW	R28,0x8
    0473 9508      RET
_fatClustToSect:
  clust                --> Y+4
    0474 940E0CAE  CALL	push_arg4
    0476 940E0DAA  CALL	push_gset2
(0037) }
(0038) /*-----------------------------------------------------------------------
(0039)  查询数据区一个簇开始扇区号
(0040) -----------------------------------------------------------------------*/
(0041) unsigned long fatClustToSect(unsigned long clust)
(0042) {
(0043) 	return ((clust-2) * SectorsPerCluster) + FirstDataSector;
    0478 E042      LDI	R20,2
    0479 E050      LDI	R21,0
    047A E060      LDI	R22,0
    047B E070      LDI	R23,0
    047C 01FE      MOVW	R30,R28
    047D 8024      LDD	R2,Z+4
    047E 8035      LDD	R3,Z+5
    047F 8046      LDD	R4,Z+6
    0480 8057      LDD	R5,Z+7
    0481 1A24      SUB	R2,R20
    0482 0A35      SBC	R3,R21
    0483 0A46      SBC	R4,R22
    0484 0A57      SBC	R5,R23
    0485 90600431  LDS	R6,SectorsPerCluster
    0487 90700432  LDS	R7,SectorsPerCluster+1
    0489 2488      CLR	R8
    048A 2499      CLR	R9
    048B 929A      ST	R9,-Y
    048C 928A      ST	R8,-Y
    048D 927A      ST	R7,-Y
    048E 926A      ST	R6,-Y
    048F 0181      MOVW	R16,R2
    0490 0192      MOVW	R18,R4
    0491 940E0D68  CALL	empy32s
    0493 0118      MOVW	R2,R16
    0494 0129      MOVW	R4,R18
    0495 90800437  LDS	R8,FirstDataSector+2
    0497 90900438  LDS	R9,FirstDataSector+3
    0499 90600435  LDS	R6,FirstDataSector
    049B 90700436  LDS	R7,FirstDataSector+1
    049D 0C26      ADD	R2,R6
    049E 1C37      ADC	R3,R7
    049F 1C48      ADC	R4,R8
    04A0 1C59      ADC	R5,R9
    04A1 0181      MOVW	R16,R2
    04A2 0192      MOVW	R18,R4
    04A3 940E0D98  CALL	pop_gset2
    04A5 9624      ADIW	R28,4
    04A6 9508      RET
(0044) }
(0045) /*-----------------------------------------------------------------------
(0046)  查询一个簇所占扇区数
(0047) -----------------------------------------------------------------------*/
(0048) unsigned int fatClusterSize(void)
(0049) {
(0050) 	// return the number of sectors in a disk cluster
(0051) 	return SectorsPerCluster;
_fatClusterSize:
    04A7 91000431  LDS	R16,SectorsPerCluster
    04A9 91100432  LDS	R17,SectorsPerCluster+1
    04AB 9508      RET
_fatInit:
  t2                   --> R10
  t1                   --> R12
  data                 --> R10
  bpb                  --> R10
    04AC 940E0DA6  CALL	push_gset4
    04AE 9722      SBIW	R28,2
(0052) }
(0053) /*-----------------------------------------------------------------------
(0054) 查询SD卡文件系统信息
(0055) -----------------------------------------------------------------------*/
(0056) unsigned char fatInit()
(0057) {
(0058)     unsigned int data;unsigned char t1,t2;
(0059) 
(0060) 	struct bpb710 *bpb;
(0061) 	// 读MBR结构
(0062) 	ReadBlock(0);  
    04AF E000      LDI	R16,0
    04B0 E010      LDI	R17,0
    04B1 E020      LDI	R18,0
    04B2 E030      LDI	R19,0
    04B3 DFA3      RCALL	_ReadBlock
(0063) 	// 读取分区表信息
(0064) 	PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
    04B4 EE83      LDI	R24,0xE3
    04B5 E093      LDI	R25,3
    04B6 E3EA      LDI	R30,0x3A
    04B7 E0F4      LDI	R31,4
    04B8 E100      LDI	R16,0x10
    04B9 E010      LDI	R17,0
    04BA 93FA      ST	R31,-Y
    04BB 93EA      ST	R30,-Y
    04BC 939A      ST	R25,-Y
    04BD 938A      ST	R24,-Y
    04BE 940E0E19  CALL	asgnblk
(0065) 	// 读引导扇区
(0066) 	// 引导扇区号在PartInfo.prStartLBA中
(0067) 	ReadBlock(PartInfo.prStartLBA);  //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
    04C0 91200444  LDS	R18,0x444
    04C2 91300445  LDS	R19,0x445
    04C4 91000442  LDS	R16,0x442
    04C6 91100443  LDS	R17,0x443
    04C8 DF8E      RCALL	_ReadBlock
(0068) 	bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
    04C9 E380      LDI	R24,0x30
    04CA E092      LDI	R25,2
    04CB 015C      MOVW	R10,R24
(0069) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -