📄 sd.lst
字号:
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 + -