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

📄 sd.lst

📁 /*** *** *** *** *** *** *** *** *** *** / /* MP3 Code for M32L */ /* By pasyong
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0004) /*				   2006-4									*/
(0005) /*				   Base ICC6.31A					        */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011) #define MP3_DDR        DDRB
(0012) #define MP3_PORT       PORTB
(0013) #define MP3_PIN        PINB
(0014) #define MP3_CMD_CS     BIT(0)
(0015) #define MP3_DATA_CS    BIT(3)
(0016) #define MP3_DATA_REQ   BIT(2)   
(0017) #define MP3_DATA_REST  BIT(1)   
(0018) void delay_Nus(unsigned int n)
(0019) 	{
(0020) 	unsigned char  b;
(0021) 		for (b = 1; b<n; b++)
    0BD3 E041      LDI	R20,1
    0BD4 C001      RJMP	0x0BD6
    0BD5 9543      INC	R20
    0BD6 2E24      MOV	R2,R20
    0BD7 2433      CLR	R3
    0BD8 1620      CP	R2,R16
    0BD9 0631      CPC	R3,R17
    0BDA F3D0      BCS	0x0BD5
    0BDB 940E13A5  CALL	pop_gset1
    0BDD 9508      RET
(0022) 			;
(0023) 	}
(0024) //SPI initialize
(0025) // clock rate: 500000hz
(0026) void spi_init(void)
(0027) {
(0028)  DDRB=0xBF;    //SI输入,SO,SCK,SS输出
_spi_init:
    0BDE EB8F      LDI	R24,0xBF
    0BDF BB87      OUT	0x17,R24
(0029)  SPCR = 0x53;  //setup SPI
    0BE0 E583      LDI	R24,0x53
    0BE1 B98D      OUT	0x0D,R24
(0030)  SPSR = 0x00;  //setup SPI
    0BE2 2422      CLR	R2
    0BE3 B82E      OUT	0x0E,R2
    0BE4 9508      RET
(0031) }
(0032) void Write_Byte_SPI(unsigned char byte)
(0033) {   
(0034)     SPDR = byte;
_Write_Byte_SPI:
  byte                 --> R16
    0BE5 B90F      OUT	0x0F,R16
(0035)     while (!(SPSR & (1<<SPIF)));
    0BE6 9B77      SBIS	0x0E,7
    0BE7 CFFE      RJMP	0x0BE6
    0BE8 9508      RET
(0036) }
(0037) unsigned char Read_Byte_SPI(void)
(0038) {   
(0039)     SPDR = 0xFF;
_Read_Byte_SPI:
    0BE9 EF8F      LDI	R24,0xFF
    0BEA B98F      OUT	0x0F,R24
(0040)     while (!(SPSR &(1<<SPIF)));
    0BEB 9B77      SBIS	0x0E,7
    0BEC CFFE      RJMP	0x0BEB
(0041)     return SPDR;
    0BED B10F      IN	R16,0x0F
    0BEE 9508      RET
(0042) }
(0043) void mp3_port_init()
(0044) {
(0045) spi_init();
_mp3_port_init:
    0BEF DFEE      RCALL	_spi_init
(0046) MP3_DDR|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
    0BF0 B387      IN	R24,0x17
    0BF1 608B      ORI	R24,0xB
    0BF2 BB87      OUT	0x17,R24
(0047) MP3_DDR&=~MP3_DATA_REQ;
    0BF3 98BA      CBI	0x17,2
(0048) MP3_PORT|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
    0BF4 B388      IN	R24,0x18
    0BF5 608B      ORI	R24,0xB
    0BF6 BB88      OUT	0x18,R24
    0BF7 9508      RET
_vs1011_cmd_write:
  data                 --> R20
  address              --> R22
    0BF8 940E13B9  CALL	push_gset2
    0BFA 01A9      MOVW	R20,R18
    0BFB 2F60      MOV	R22,R16
(0049) //MP3_PORT&=~MP3_DATA_REST;
(0050) }
(0051) void vs1011_cmd_write(uchar address,uint data)
(0052) { 
(0053) MP3_PORT|=MP3_DATA_CS;       //MP3_DATA_CS=1;
    0BFC 9AC3      SBI	0x18,3
(0054) MP3_PORT&=~MP3_CMD_CS;       //MP3_CMD_CS=0;
    0BFD 98C0      CBI	0x18,0
(0055) Write_Byte_SPI(0x02);      //VS1011的写命令
    0BFE E002      LDI	R16,2
    0BFF DFE5      RCALL	_Write_Byte_SPI
(0056) //delay_nus(20);
(0057) Write_Byte_SPI(address);   //地址
    0C00 2F06      MOV	R16,R22
    0C01 DFE3      RCALL	_Write_Byte_SPI
(0058) Write_Byte_SPI(data>>8);
    0C02 018A      MOVW	R16,R20
    0C03 2F01      MOV	R16,R17
    0C04 2711      CLR	R17
    0C05 DFDF      RCALL	_Write_Byte_SPI
(0059) Write_Byte_SPI(data);
    0C06 2F04      MOV	R16,R20
    0C07 DFDD      RCALL	_Write_Byte_SPI
(0060) //delay_nus(200);
(0061) MP3_PORT|=MP3_CMD_CS;       //MP3_CMD_CS=1;
    0C08 9AC0      SBI	0x18,0
    0C09 940E1396  CALL	pop_gset2
    0C0B 9508      RET
_vs1011_data_write:
  data                 --> R20
    0C0C 940E13A2  CALL	push_gset1
    0C0E 2F40      MOV	R20,R16
(0062) } 
(0063) 
(0064) void vs1011_data_write(uchar data)
(0065) {
(0066) MP3_PORT&=~MP3_DATA_CS;         //MP3_DATA_CS=0;
    0C0F 98C3      CBI	0x18,3
(0067) Write_Byte_SPI(data);
    0C10 2F04      MOV	R16,R20
    0C11 DFD3      RCALL	_Write_Byte_SPI
(0068) MP3_PORT|=MP3_DATA_CS;         //MP3_DATA_CS=1;
    0C12 9AC3      SBI	0x18,3
(0069) MP3_PORT|=MP3_CMD_CS;         //MP3_CMD_CS=1; 
    0C13 9AC0      SBI	0x18,0
    0C14 940E13A5  CALL	pop_gset1
    0C16 9508      RET
_vs1011_read:
  temp1                --> R22
  temp                 --> R20
  address              --> R10
    0C17 940E13BD  CALL	push_gset3
    0C19 2EA0      MOV	R10,R16
(0070) }
(0071) 
(0072) uint vs1011_read(uchar address)
(0073) {
(0074) uchar temp1=0;
    0C1A 2766      CLR	R22
(0075) uint temp=0; 
    0C1B 2744      CLR	R20
    0C1C 2755      CLR	R21
(0076) MP3_PORT|=MP3_DATA_CS;        //MP3_DATA_CS=1;
    0C1D 9AC3      SBI	0x18,3
(0077) MP3_PORT&=~MP3_CMD_CS;        //MP3_CMD_CS=0;
    0C1E 98C0      CBI	0x18,0
(0078) Write_Byte_SPI(0x03);      //VS1011的读命令
    0C1F E003      LDI	R16,3
    0C20 DFC4      RCALL	_Write_Byte_SPI
(0079) //delay_nus(20);
(0080) Write_Byte_SPI(address);   //地址
    0C21 2D0A      MOV	R16,R10
    0C22 DFC2      RCALL	_Write_Byte_SPI
(0081) temp=Read_Byte_SPI();
    0C23 DFC5      RCALL	_Read_Byte_SPI
    0C24 2F40      MOV	R20,R16
    0C25 2755      CLR	R21
(0082) temp=temp<<8;
    0C26 2F54      MOV	R21,R20
    0C27 2744      CLR	R20
(0083) temp1=Read_Byte_SPI();
    0C28 DFC0      RCALL	_Read_Byte_SPI
    0C29 2F60      MOV	R22,R16
(0084) temp=temp|temp1; 
    0C2A 2E26      MOV	R2,R22
    0C2B 2433      CLR	R3
    0C2C 2942      OR	R20,R2
    0C2D 2953      OR	R21,R3
(0085) MP3_PORT|=MP3_CMD_CS;       //MP3_CMD_CS=1;
    0C2E 9AC0      SBI	0x18,0
(0086) return temp;
    0C2F 018A      MOVW	R16,R20
    0C30 940E1399  CALL	pop_gset3
    0C32 9508      RET
(0087) 
(0088) }
(0089) 
(0090) void vs1011_init(void)
(0091) {
(0092) 
(0093) delay_Nus(50);
_vs1011_init:
    0C33 E302      LDI	R16,0x32
    0C34 E010      LDI	R17,0
    0C35 DF9B      RCALL	_delay_Nus
(0094) vs1011_cmd_write(0x00,0x0800);     //NEW MODE
    0C36 E020      LDI	R18,0
    0C37 E038      LDI	R19,0x8
    0C38 2700      CLR	R16
    0C39 DFBE      RCALL	_vs1011_cmd_write
(0095) vs1011_cmd_write(0x02,0X75);       //BASS
    0C3A E725      LDI	R18,0x75
    0C3B E030      LDI	R19,0
    0C3C E002      LDI	R16,2
    0C3D DFBA      RCALL	_vs1011_cmd_write
(0096) vs1011_cmd_write(0x03,0X9800);     //CLOCK F
    0C3E E020      LDI	R18,0
    0C3F E938      LDI	R19,0x98
    0C40 E003      LDI	R16,3
    0C41 DFB6      RCALL	_vs1011_cmd_write
(0097) vs1011_cmd_write(0x0b,0X3030);    //VOLUME
    0C42 E320      LDI	R18,0x30
    0C43 E330      LDI	R19,0x30
    0C44 E00B      LDI	R16,0xB
    0C45 DFB2      RCALL	_vs1011_cmd_write
    0C46 9508      RET
_ReadBlock:
  temp                 --> Y+0
  LBA                  --> Y+4
    0C47 940E12C4  CALL	push_arg4
    0C49 9724      SBIW	R28,4
FILE: D:\Temp\AVRTest\SDMP3~1\fat.c
(0001) /************************************************************/
(0002) /*		         FAT Code for   M32L					    */
(0003) /*				   By   pasyong								*/
(0004) /*				   2006-4									*/
(0005) /*				   Base ICC6.31A					        */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #include <string.h>
(0010) #include "sd.h"
(0011) #include "fat.h"
(0012) #include "3310.h"
(0013) 
(0014) extern uchar BUFFER[512];
(0015) unsigned char  LONGNAME_BUFFER_ADDR[30];
(0016) unsigned char  DIRNAME_BUFFER_ADDR[30];
(0017) unsigned char *LongNameBuffer =		(unsigned char *) LONGNAME_BUFFER_ADDR;
(0018) unsigned char *DirNameBuffer =		(unsigned char *) DIRNAME_BUFFER_ADDR;
(0019) struct partrecord PartInfo;
(0020) unsigned char Fat32Enabled;
(0021) unsigned long FirstDataSector;
(0022) unsigned int  BytesPerSector;
(0023) unsigned int  SectorsPerCluster;
(0024) unsigned long FirstFATSector;
(0025) unsigned long FirstDirSector;
(0026) unsigned long FileSize;
(0027) unsigned long FatInCache = 0;
(0028) 
(0029) //********************************************************************************************
(0030) //读一个扇区
(0031) void ReadBlock(unsigned long LBA)
(0032) //********************************************************************************************
(0033) {   
(0034)   unsigned long temp;
(0035)   temp=LBA<<9;
    0C4A E089      LDI	R24,0x9
    0C4B E090      LDI	R25,0
    0C4C 01FE      MOVW	R30,R28
    0C4D 8024      LDD	R2,Z+4
    0C4E 8035      LDD	R3,Z+5
    0C4F 8046      LDD	R4,Z+6
    0C50 8057      LDD	R5,Z+7
    0C51 938A      ST	R24,-Y
    0C52 0181      MOVW	R16,R2
    0C53 0192      MOVW	R18,R4
    0C54 940E13EE  CALL	lsl32
    0C56 01FE      MOVW	R30,R28
    0C57 8300      STD	Z+0,R16
    0C58 8311      STD	Z+1,R17
    0C59 8322      STD	Z+2,R18
    0C5A 8333      STD	Z+3,R19
(0036)   SD_Read_Block(temp);
    0C5B 01FE      MOVW	R30,R28
    0C5C 8100      LDD	R16,Z+0
    0C5D 8111      LDD	R17,Z+1
    0C5E 8122      LDD	R18,Z+2
    0C5F 8133      LDD	R19,Z+3
    0C60 940E0B98  CALL	_SD_Read_Block
    0C62 9628      ADIW	R28,0x8
    0C63 9508      RET
_fatClustToSect:
  clust                --> Y+4
    0C64 940E12C4  CALL	push_arg4
    0C66 940E13B9  CALL	push_gset2
(0037) }
(0038) /*-----------------------------------------------------------------------
(0039)  查询数据区一个簇开始扇区号
(0040) -----------------------------------------------------------------------*/
(0041) unsigned long fatClustToSect(unsigned long clust)
(0042) {
(0043) 	return ((clust-2) * SectorsPerCluster) + FirstDataSector;
    0C68 E042      LDI	R20,2
    0C69 E050      LDI	R21,0
    0C6A E060      LDI	R22,0
    0C6B E070      LDI	R23,0
    0C6C 01FE      MOVW	R30,R28
    0C6D 8024      LDD	R2,Z+4
    0C6E 8035      LDD	R3,Z+5
    0C6F 8046      LDD	R4,Z+6
    0C70 8057      LDD	R5,Z+7
    0C71 1A24      SUB	R2,R20
    0C72 0A35      SBC	R3,R21
    0C73 0A46      SBC	R4,R22
    0C74 0A57      SBC	R5,R23
    0C75 906002BD  LDS	R6,_SectorsPerCluster
    0C77 907002BE  LDS	R7,_SectorsPerCluster+1
    0C79 2488      CLR	R8
    0C7A 2499      CLR	R9
    0C7B 929A      ST	R9,-Y
    0C7C 928A      ST	R8,-Y
    0C7D 927A      ST	R7,-Y
    0C7E 926A      ST	R6,-Y
    0C7F 0181      MOVW	R16,R2
    0C80 0192      MOVW	R18,R4
    0C81 940E1366  CALL	empy32s
    0C83 0118      MOVW	R2,R16
    0C84 0129      MOVW	R4,R18
    0C85 908002C3  LDS	R8,_FirstDataSector+2
    0C87 909002C4  LDS	R9,_FirstDataSector+3
    0C89 906002C1  LDS	R6,_FirstDataSector
    0C8B 907002C2  LDS	R7,_FirstDataSector+1
    0C8D 0C26      ADD	R2,R6
    0C8E 1C37      ADC	R3,R7
    0C8F 1C48      ADC	R4,R8
    0C90 1C59      ADC	R5,R9
    0C91 0181      MOVW	R16,R2
    0C92 0192      MOVW	R18,R4
    0C93 940E1396  CALL	pop_gset2
    0C95 9624      ADIW	R28,4
    0C96 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:
    0C97 910002BD  LDS	R16,_SectorsPerCluster
    0C99 911002BE  LDS	R17,_SectorsPerCluster+1
    0C9B 9508      RET
_fatInit:
  t2                   --> R10
  t1                   --> R12
  data                 --> R10
  bpb                  --> R10
    0C9C 940E13C1  CALL	push_gset4
    0C9E 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);  
    0C9F E000      LDI	R16,0
    0CA0 E010      LDI	R17,0
    0CA1 E020      LDI	R18,0
    0CA2 E030      LDI	R19,0
    0CA3 DFA3      RCALL	_ReadBlock
(0063) 	// 读取分区表信息
(0064) 	PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
    0CA4 E68F      LDI	R24,0x6F
    0CA5 E092      LDI	R25,2
    0CA6 ECE6      LDI	R30,0xC6
    0CA7 E0F2      LDI	R31,2
    0CA8 E100      LDI	R16,0x10
    0CA9 E010      LDI	R17,0
    0CAA 93FA      ST	R31,-Y
    0CAB 93EA      ST	R30,-Y
    0CAC 939A      ST	R25,-Y
    0CAD 938A      ST	R24,-Y
    0CAE 940E1406  CALL	asgnblk
(0065) 	// 读引导扇区
(0066) 	// 引导扇区号在PartInfo.prStartLBA中
(0067) 	ReadBlock(PartInfo.prStartLBA);  //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
    0CB0 912002D0  LDS	R18,0x2D0
    0CB2 913002D1  LDS	R19,0x2D1
    0CB4 910002CE  LDS	R16,0x2CE
    0CB6 911002CF  LDS	R17,0x2CF
    0CB8 DF8E      RCALL	_ReadBlock
(0068) 	bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
    0CB9 EB8C      LDI	R24,0xBC
    0CBA E090      LDI	R25,0
    0CBB 015C      MOVW	R10,R24
(0069) 
(0070) 	FirstDataSector	= PartInfo.prStartLBA;
    0CBC 904002D0  LDS	R4,0x2D0
    0CBE 905002D1  LDS	R5,0x2D1

⌨️ 快捷键说明

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