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