📄 sd.lst
字号:
__text_start:
__start:
0AC7 E5CF LDI R28,0x5F
0AC8 E0D4 LDI R29,4
0AC9 BFCD OUT 0x3D,R28
0ACA BFDE OUT 0x3E,R29
0ACB 51C0 SUBI R28,0x10
0ACC 40D0 SBCI R29,0
0ACD EA0A LDI R16,0xAA
0ACE 8308 STD Y+0,R16
0ACF 2400 CLR R0
0AD0 EBE1 LDI R30,0xB1
0AD1 E0F0 LDI R31,0
0AD2 E013 LDI R17,3
0AD3 31EB CPI R30,0x1B
0AD4 07F1 CPC R31,R17
0AD5 F011 BEQ 0x0AD8
0AD6 9201 ST R0,Z+
0AD7 CFFB RJMP 0x0AD3
0AD8 8300 STD Z+0,R16
0AD9 E3EC LDI R30,0x3C
0ADA E1F5 LDI R31,0x15
0ADB E6A0 LDI R26,0x60
0ADC E0B0 LDI R27,0
0ADD E115 LDI R17,0x15
0ADE 38ED CPI R30,0x8D
0ADF 07F1 CPC R31,R17
0AE0 F021 BEQ 0x0AE5
0AE1 95C8 LPM
0AE2 9631 ADIW R30,1
0AE3 920D ST R0,X+
0AE4 CFF9 RJMP 0x0ADE
0AE5 940E10C7 CALL _main
_exit:
0AE7 CFFF RJMP _exit
FILE: D:\Temp\AVRTest\SDMP3~1\sd.c
(0001) /************************************************************/
(0002) /* SD Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #include "1011.h"
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) #define MMC_CS_PIN BIT(4) //PORTB.4
(0013) #define MMC_PORT PORTB
(0014)
(0015) uchar reading=0,a=0,pointer=0;
(0016)
(0017) void sd_port_init()
(0018) {
(0019) MMC_PORT|=MMC_CS_PIN;
_sd_port_init:
0AE8 9AC4 SBI 0x18,4
0AE9 9508 RET
_delay_nus:
b --> R20
n --> R16
0AEA 940E13A2 CALL push_gset1
(0020) }
(0021)
(0022) uchar BUFFER[512]; //扇区缓冲区
(0023) uint i=0;
(0024) void delay_nus(uint n)
(0025) {
(0026) unsigned char b;
(0027) for (b = 1; b<n; b++)
0AEC E041 LDI R20,1
0AED C001 RJMP 0x0AEF
0AEE 9543 INC R20
0AEF 2E24 MOV R2,R20
0AF0 2433 CLR R3
0AF1 1620 CP R2,R16
0AF2 0631 CPC R3,R17
0AF3 F3D0 BCS 0x0AEE
0AF4 940E13A5 CALL pop_gset1
0AF6 9508 RET
_SD_Write_Command:
retry --> R12
tmp --> R10
arg --> Y+10
cmd --> R14
0AF7 933A ST R19,-Y
0AF8 932A ST R18,-Y
0AF9 940E13C5 CALL push_gset5
0AFB 2EE0 MOV R14,R16
(0028) ;
(0029) }
(0030) //****************************************************************************
(0031) //Send a Command to MMC/SD-Card
(0032) //Return: the second byte of response register of MMC/SD-Card
(0033) //****************************************************************************
(0034) uchar SD_Write_Command(uchar cmd,unsigned long arg)
(0035) {
(0036) uchar tmp;
(0037) uchar retry=0;
0AFC 24CC CLR R12
(0038)
(0039) //MMC_PORT|=MMC_CS_PIN; //SD卡关闭
(0040) //send 8 Clock Impulse
(0041) Write_Byte_SPI(0xFF);
0AFD EF0F LDI R16,0xFF
0AFE 940E0BE5 CALL _Write_Byte_SPI
(0042)
(0043) //set MMC_Chip_Select to low (MMC/SD-Card active)
(0044) MMC_PORT&=~MMC_CS_PIN; //SD卡使能
0B00 98C4 CBI 0x18,4
(0045)
(0046) Write_Byte_SPI(cmd|0x40); //送头命令
0B01 2D0E MOV R16,R14
0B02 6400 ORI R16,0x40
0B03 940E0BE5 CALL _Write_Byte_SPI
(0047) Write_Byte_SPI(arg>>24);
0B05 E188 LDI R24,0x18
0B06 E090 LDI R25,0
0B07 01FE MOVW R30,R28
0B08 8422 LDD R2,Z+10
0B09 8433 LDD R3,Z+11
0B0A 8444 LDD R4,Z+12
0B0B 8455 LDD R5,Z+13
0B0C 938A ST R24,-Y
0B0D 0181 MOVW R16,R2
0B0E 0192 MOVW R18,R4
0B0F 940E13FA CALL lsr32
0B11 940E0BE5 CALL _Write_Byte_SPI
(0048) Write_Byte_SPI(arg>>16); //send 6 Byte Command to MMC/SD-Card
0B13 01FE MOVW R30,R28
0B14 8422 LDD R2,Z+10
0B15 8433 LDD R3,Z+11
0B16 8444 LDD R4,Z+12
0B17 8455 LDD R5,Z+13
0B18 0112 MOVW R2,R4
0B19 2444 CLR R4
0B1A 2455 CLR R5
0B1B 2D02 MOV R16,R2
0B1C 940E0BE5 CALL _Write_Byte_SPI
(0049) Write_Byte_SPI(arg>>8);
0B1E E088 LDI R24,0x8
0B1F E090 LDI R25,0
0B20 01FE MOVW R30,R28
0B21 8422 LDD R2,Z+10
0B22 8433 LDD R3,Z+11
0B23 8444 LDD R4,Z+12
0B24 8455 LDD R5,Z+13
0B25 938A ST R24,-Y
0B26 0181 MOVW R16,R2
0B27 0192 MOVW R18,R4
0B28 940E13FA CALL lsr32
0B2A 940E0BE5 CALL _Write_Byte_SPI
(0050) Write_Byte_SPI(arg&0xff);
0B2C EF4F LDI R20,0xFF
0B2D E050 LDI R21,0
0B2E E060 LDI R22,0
0B2F E070 LDI R23,0
0B30 01FE MOVW R30,R28
0B31 8422 LDD R2,Z+10
0B32 8433 LDD R3,Z+11
0B33 8444 LDD R4,Z+12
0B34 8455 LDD R5,Z+13
0B35 2224 AND R2,R20
0B36 2235 AND R3,R21
0B37 2246 AND R4,R22
0B38 2257 AND R5,R23
0B39 2D02 MOV R16,R2
0B3A 940E0BE5 CALL _Write_Byte_SPI
(0051) Write_Byte_SPI(0x95); //仅仅对RESET有效的CRC效验码
0B3C E905 LDI R16,0x95
0B3D 940E0BE5 CALL _Write_Byte_SPI
(0052)
(0053) //get 8 bit response
(0054) //Read_Byte_MMC(); //read the first byte,ignore it.
(0055) do
(0056) { //Only last 8 bit is used here.Read it out.
(0057) tmp = Read_Byte_SPI();
0B3F 940E0BE9 CALL _Read_Byte_SPI
0B41 2EA0 MOV R10,R16
(0058) retry++;
0B42 94C3 INC R12
(0059) }
(0060) while((tmp==0xff)&&(retry<100)); //当没有收到有效的命令的时候
0B43 2D8A MOV R24,R10
0B44 3F8F CPI R24,0xFF
0B45 F419 BNE 0x0B49
0B46 2D8C MOV R24,R12
0B47 3684 CPI R24,0x64
0B48 F3B0 BCS 0x0B3F
(0061)
(0062) if(reading==0)
0B49 90200060 LDS R2,0x60
0B4B 2022 TST R2
0B4C F411 BNE 0x0B4F
(0063) MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1;
0B4D 9AC4 SBI 0x18,4
0B4E C001 RJMP 0x0B50
(0064) else MMC_PORT&=~MMC_CS_PIN; //MMC_CS_PIN=0;
0B4F 98C4 CBI 0x18,4
(0065) return(tmp);
0B50 2D0A MOV R16,R10
0B51 940E139F CALL pop_gset5
0B53 9622 ADIW R28,2
0B54 9508 RET
_SD_Init:
i --> R10
temp --> R12
retry --> R14
0B55 940E13C5 CALL push_gset5
0B57 9722 SBIW R28,2
(0066) }
(0067) //****************************************************************************
(0068) //SD卡初始化(SPI-MODE)
(0069) //****************************************************************************
(0070) uchar SD_Init(void)
(0071) {
(0072) uchar retry,temp;
(0073) uchar i;
(0074) MMC_PORT&=~MMC_CS_PIN; //SD卡使能
0B58 98C4 CBI 0x18,4
(0075)
(0076) delay_nus(250); //Wait MMC/SD ready...
0B59 EF0A LDI R16,0xFA
0B5A E010 LDI R17,0
0B5B DF8E RCALL _delay_nus
(0077) for (i=0;i<0x0f;i++)
0B5C 24AA CLR R10
0B5D C004 RJMP 0x0B62
(0078) {
(0079) Write_Byte_SPI(0xff); //send 74 clock at least!!!
0B5E EF0F LDI R16,0xFF
0B5F 940E0BE5 CALL _Write_Byte_SPI
0B61 94A3 INC R10
0B62 2D8A MOV R24,R10
0B63 308F CPI R24,0xF
0B64 F3C8 BCS 0x0B5E
(0080) }
(0081) //Send Command CMD0 to MMC/SD Card
(0082) retry=0;
0B65 24EE CLR R14
(0083)
(0084) do
(0085) { //retry 200 times to send CMD0 command
(0086) temp=SD_Write_Command(0,0);
0B66 E040 LDI R20,0
0B67 E050 LDI R21,0
0B68 E060 LDI R22,0
0B69 E070 LDI R23,0
0B6A 8368 STD Y+0,R22
0B6B 8379 STD Y+1,R23
0B6C 019A MOVW R18,R20
0B6D 2700 CLR R16
0B6E DF88 RCALL _SD_Write_Command
0B6F 2EC0 MOV R12,R16
(0087) retry++;
0B70 94E3 INC R14
(0088) if(retry==100)
0B71 2D8E MOV R24,R14
0B72 3684 CPI R24,0x64
0B73 F401 BNE 0x0B74
(0089) {
(0090) ;//CMD0 Error!
(0091) }
(0092) }
(0093) while(temp!=1);
0B74 2D8C MOV R24,R12
0B75 3081 CPI R24,1
0B76 F779 BNE 0x0B66
(0094)
(0095) //Send Command CMD1 to MMC/SD-Card
(0096) retry=0;
0B77 24EE CLR R14
(0097) do
(0098) { //retry 100 times to send CMD1 command
(0099) temp=SD_Write_Command(1,0);
0B78 E040 LDI R20,0
0B79 E050 LDI R21,0
0B7A E060 LDI R22,0
0B7B E070 LDI R23,0
0B7C 8368 STD Y+0,R22
0B7D 8379 STD Y+1,R23
0B7E 019A MOVW R18,R20
0B7F E001 LDI R16,1
0B80 DF76 RCALL _SD_Write_Command
0B81 2EC0 MOV R12,R16
(0100) retry++;
0B82 94E3 INC R14
(0101) if(retry==100)
0B83 2D8E MOV R24,R14
0B84 3684 CPI R24,0x64
0B85 F401 BNE 0x0B86
(0102) {
(0103) ;
(0104) }
(0105) }
(0106) while(temp!=0);
0B86 20CC TST R12
0B87 F781 BNE 0x0B78
(0107) retry=0;
0B88 24EE CLR R14
(0108) SD_Write_Command(16,512); //设置一次读写BLOCK的长度为512个字节
0B89 E040 LDI R20,0
0B8A E052 LDI R21,2
0B8B E060 LDI R22,0
0B8C E070 LDI R23,0
0B8D 8368 STD Y+0,R22
0B8E 8379 STD Y+1,R23
0B8F 019A MOVW R18,R20
0B90 E100 LDI R16,0x10
0B91 DF65 RCALL _SD_Write_Command
(0109)
(0110) MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high
0B92 9AC4 SBI 0x18,4
(0111) return(0); //All commands have been taken.
0B93 2700 CLR R16
0B94 9622 ADIW R28,2
0B95 940E139F CALL pop_gset5
0B97 9508 RET
_SD_Read_Block:
temp --> R20
i --> R22
address --> Y+6
0B98 940E12C4 CALL push_arg4
0B9A 940E13B9 CALL push_gset2
0B9C 9722 SBIW R28,2
(0112) }
(0113) //****************************************************************************
(0114) //从SD卡读一个扇区 Return 0 if no Error.
(0115) //****************************************************************************
(0116) uchar SD_Read_Block(unsigned long address)
(0117) {
(0118) uchar temp=0;uint i=0;
0B9D 2744 CLR R20
0B9E 2766 CLR R22
0B9F 2777 CLR R23
(0119) reading=1;
0BA0 E081 LDI R24,1
0BA1 93800060 STS 0x60,R24
(0120) temp=SD_Write_Command(17,address); //读出RESPONSE
0BA3 01FE MOVW R30,R28
0BA4 8026 LDD R2,Z+6
0BA5 8037 LDD R3,Z+7
0BA6 8440 LDD R4,Z+8
0BA7 8451 LDD R5,Z+9
0BA8 8248 STD Y+0,R4
0BA9 8259 STD Y+1,R5
0BAA 0191 MOVW R18,R2
0BAB E101 LDI R16,0x11
0BAC DF4A RCALL _SD_Write_Command
0BAD 2F40 MOV R20,R16
(0121) while (Read_Byte_SPI()!= 0xfe)
0BAE 940E0BE9 CALL _Read_Byte_SPI
0BB0 3F0E CPI R16,0xFE
0BB1 F7E1 BNE 0x0BAE
(0122) {;} //直到读取到了数据的开始头0XFE,才继续
(0123) for(i=0; i<512; i++)
0BB2 2766 CLR R22
0BB3 2777 CLR R23
0BB4 C00A RJMP 0x0BBF
(0124) {
(0125) BUFFER[i]=Read_Byte_SPI();
0BB5 940E0BE9 CALL _Read_Byte_SPI
0BB7 EB81 LDI R24,0xB1
0BB8 E090 LDI R25,0
0BB9 01FB MOVW R30,R22
0BBA 0FE8 ADD R30,R24
0BBB 1FF9 ADC R31,R25
0BBC 8300 STD Z+0,R16
0BBD 5F6F SUBI R22,0xFF
0BBE 4F7F SBCI R23,0xFF
0BBF 3060 CPI R22,0
0BC0 E0E2 LDI R30,2
0BC1 077E CPC R23,R30
0BC2 F390 BCS 0x0BB5
(0126) }
(0127) Read_Byte_SPI();//CRC - Byte
0BC3 940E0BE9 CALL _Read_Byte_SPI
(0128) Read_Byte_SPI();//CRC - Byte
0BC5 940E0BE9 CALL _Read_Byte_SPI
(0129) reading=0;
0BC7 2422 CLR R2
0BC8 92200060 STS 0x60,R2
(0130) MMC_PORT|=MMC_CS_PIN; //关闭SD卡
0BCA 9AC4 SBI 0x18,4
(0131) return(temp);
0BCB 2F04 MOV R16,R20
0BCC 9622 ADIW R28,2
0BCD 940E1396 CALL pop_gset2
0BCF 9624 ADIW R28,4
0BD0 9508 RET
_delay_Nus:
b --> R20
n --> R16
0BD1 940E13A2 CALL push_gset1
FILE: D:\Temp\AVRTest\SDMP3~1\1011.c
(0001) /************************************************************/
(0002) /* VS1011 Code for M32L */
(0003) /* By pasyong */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -