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