📄 sd.lst
字号:
__text_start:
__start:
02D1 EFCF LDI R28,0xFF
02D2 E1D0 LDI R29,0x10
02D3 BFCD OUT 0x3D,R28
02D4 BFDE OUT 0x3E,R29
02D5 51C0 SUBI R28,0x10
02D6 40D0 SBCI R29,0
02D7 EA0A LDI R16,0xAA
02D8 8308 STD Y+0,R16
02D9 2400 CLR R0
02DA E2E5 LDI R30,0x25
02DB E0F2 LDI R31,2
02DC E014 LDI R17,4
02DD 38ED CPI R30,0x8D
02DE 07F1 CPC R31,R17
02DF F011 BEQ 0x02E2
02E0 9201 ST R0,Z+
02E1 CFFB RJMP 0x02DD
02E2 8300 STD Z+0,R16
02E3 E7EC LDI R30,0x7C
02E4 E0F4 LDI R31,4
02E5 E0A0 LDI R26,0
02E6 E0B1 LDI R27,1
02E7 E015 LDI R17,5
02E8 3AE1 CPI R30,0xA1
02E9 07F1 CPC R31,R17
02EA F021 BEQ 0x02EF
02EB 95C8 LPM
02EC 9631 ADIW R30,1
02ED 920D ST R0,X+
02EE CFF9 RJMP 0x02E8
02EF 940E08B9 CALL _main
_exit:
02F1 CFFF RJMP _exit
FILE: E:\V3U~1\sd\M64-SD卡MP3程序\sd.c
(0001) /************************************************************/
(0002) /* SD Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom64v.h>
(0008) #include <macros.h>
(0009) #include "1011.h"
(0010) #include "delay.h"
(0011) #define uchar unsigned char
(0012) #define uint unsigned int
(0013) #define MMC_CS_PIN BIT(0) //PORTB.0
(0014) #define MMC_PORT PORTB
(0015)
(0016) uchar reading=0,a=0,pointer=0;
(0017) void sd_port_init()
(0018) {
(0019) MMC_PORT|=MMC_CS_PIN;
_sd_port_init:
02F2 9AC0 SBI 0x18,0
02F3 9508 RET
_SD_Write_Command:
retry --> R12
tmp --> R10
arg --> Y+10
cmd --> R14
02F4 933A ST R19,-Y
02F5 932A ST R18,-Y
02F6 940E0DA4 CALL push_gset5
02F8 2EE0 MOV R14,R16
(0020) }
(0021) uchar BUFFER[512]; //扇区缓冲区
(0022) uint i=0;
(0023)
(0024) //****************************************************************************
(0025) //Send a Command to MMC/SD-Card
(0026) //Return: the second byte of response register of MMC/SD-Card
(0027) //****************************************************************************
(0028) uchar SD_Write_Command(uchar cmd,unsigned long arg)
(0029) {
(0030) uchar tmp;
(0031) uchar retry=0;
02F9 24CC CLR R12
(0032)
(0033) //MMC_PORT|=MMC_CS_PIN; //SD卡关闭
(0034) //send 8 Clock Impulse
(0035) Write_Byte_SPI(0xFF);
02FA EF0F LDI R16,0xFF
02FB 940E03EC CALL _Write_Byte_SPI
(0036)
(0037) //set MMC_Chip_Select to low (MMC/SD-Card active)
(0038) MMC_PORT&=~MMC_CS_PIN; //SD卡使能
02FD 98C0 CBI 0x18,0
(0039)
(0040) Write_Byte_SPI(cmd|0x40); //送头命令
02FE 2D0E MOV R16,R14
02FF 6400 ORI R16,0x40
0300 940E03EC CALL _Write_Byte_SPI
(0041) Write_Byte_SPI(arg>>24);
0302 E188 LDI R24,0x18
0303 E090 LDI R25,0
0304 01FE MOVW R30,R28
0305 8422 LDD R2,Z+10
0306 8433 LDD R3,Z+11
0307 8444 LDD R4,Z+12
0308 8455 LDD R5,Z+13
0309 938A ST R24,-Y
030A 0181 MOVW R16,R2
030B 0192 MOVW R18,R4
030C 940E0DF4 CALL lsr32
030E 940E03EC CALL _Write_Byte_SPI
(0042) Write_Byte_SPI(arg>>16); //send 6 Byte Command to MMC/SD-Card
0310 01FE MOVW R30,R28
0311 8422 LDD R2,Z+10
0312 8433 LDD R3,Z+11
0313 8444 LDD R4,Z+12
0314 8455 LDD R5,Z+13
0315 0112 MOVW R2,R4
0316 2444 CLR R4
0317 2455 CLR R5
0318 2D02 MOV R16,R2
0319 940E03EC CALL _Write_Byte_SPI
(0043) Write_Byte_SPI(arg>>8);
031B E088 LDI R24,0x8
031C E090 LDI R25,0
031D 01FE MOVW R30,R28
031E 8422 LDD R2,Z+10
031F 8433 LDD R3,Z+11
0320 8444 LDD R4,Z+12
0321 8455 LDD R5,Z+13
0322 938A ST R24,-Y
0323 0181 MOVW R16,R2
0324 0192 MOVW R18,R4
0325 940E0DF4 CALL lsr32
0327 940E03EC CALL _Write_Byte_SPI
(0044) Write_Byte_SPI(arg&0xff);
0329 EF4F LDI R20,0xFF
032A E050 LDI R21,0
032B E060 LDI R22,0
032C E070 LDI R23,0
032D 01FE MOVW R30,R28
032E 8422 LDD R2,Z+10
032F 8433 LDD R3,Z+11
0330 8444 LDD R4,Z+12
0331 8455 LDD R5,Z+13
0332 2224 AND R2,R20
0333 2235 AND R3,R21
0334 2246 AND R4,R22
0335 2257 AND R5,R23
0336 2D02 MOV R16,R2
0337 940E03EC CALL _Write_Byte_SPI
(0045) Write_Byte_SPI(0x95); //仅仅对RESET有效的CRC效验码
0339 E905 LDI R16,0x95
033A 940E03EC CALL _Write_Byte_SPI
(0046)
(0047) //get 8 bit response
(0048) //Read_Byte_MMC(); //read the first byte,ignore it.
(0049) do
(0050) { //Only last 8 bit is used here.Read it out.
(0051) tmp = Read_Byte_SPI();
033C 940E03F0 CALL _Read_Byte_SPI
033E 2EA0 MOV R10,R16
(0052) retry++;
033F 94C3 INC R12
(0053) }
(0054) while((tmp==0xff)&&(retry<100)); //当没有收到有效的命令的时候
0340 2D8A MOV R24,R10
0341 3F8F CPI R24,0xFF
0342 F419 BNE 0x0346
0343 2D8C MOV R24,R12
0344 3684 CPI R24,0x64
0345 F3B0 BCS 0x033C
(0055)
(0056) if(reading==0)
0346 90200100 LDS R2,reading
0348 2022 TST R2
0349 F411 BNE 0x034C
(0057) MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1;
034A 9AC0 SBI 0x18,0
034B C001 RJMP 0x034D
(0058) else MMC_PORT&=~MMC_CS_PIN; //MMC_CS_PIN=0;
034C 98C0 CBI 0x18,0
(0059) return(tmp);
034D 2D0A MOV R16,R10
034E 940E0DA1 CALL pop_gset5
0350 9622 ADIW R28,2
0351 9508 RET
_SD_Init:
i --> R10
temp --> R12
retry --> R14
0352 940E0DA4 CALL push_gset5
0354 9722 SBIW R28,2
(0060) }
(0061) //****************************************************************************
(0062) //SD卡初始化(SPI-MODE)
(0063) //****************************************************************************
(0064) uchar SD_Init(void)
(0065) {
(0066) uchar retry,temp;
(0067) uchar i;
(0068) MMC_PORT&=~MMC_CS_PIN; //SD卡使能
0355 98C0 CBI 0x18,0
(0069)
(0070) delay_nus(250); //Wait MMC/SD ready...
0356 EF0A LDI R16,0xFA
0357 E010 LDI R17,0
0358 940E0C76 CALL _delay_nus
(0071) for (i=0;i<0x0f;i++)
035A 24AA CLR R10
035B C004 RJMP 0x0360
(0072) {
(0073) Write_Byte_SPI(0xff); //send 74 clock at least!!!
035C EF0F LDI R16,0xFF
035D 940E03EC CALL _Write_Byte_SPI
035F 94A3 INC R10
0360 2D8A MOV R24,R10
0361 308F CPI R24,0xF
0362 F3C8 BCS 0x035C
(0074) }
(0075) //Send Command CMD0 to MMC/SD Card
(0076) retry=0;
0363 24EE CLR R14
(0077)
(0078) do
(0079) { //retry 200 times to send CMD0 command
(0080) temp=SD_Write_Command(0,0);
0364 E040 LDI R20,0
0365 E050 LDI R21,0
0366 E060 LDI R22,0
0367 E070 LDI R23,0
0368 8368 STD Y+0,R22
0369 8379 STD Y+1,R23
036A 019A MOVW R18,R20
036B 2700 CLR R16
036C DF87 RCALL _SD_Write_Command
036D 2EC0 MOV R12,R16
(0081) retry++;
036E 94E3 INC R14
(0082) if(retry==100)
036F 2D8E MOV R24,R14
0370 3684 CPI R24,0x64
0371 F401 BNE 0x0372
(0083) {
(0084) ;//CMD0 Error!
(0085) }
(0086) }
(0087) while(temp!=1);
0372 2D8C MOV R24,R12
0373 3081 CPI R24,1
0374 F779 BNE 0x0364
(0088)
(0089) //Send Command CMD1 to MMC/SD-Card
(0090) retry=0;
0375 24EE CLR R14
(0091) do
(0092) { //retry 100 times to send CMD1 command
(0093) temp=SD_Write_Command(1,0);
0376 E040 LDI R20,0
0377 E050 LDI R21,0
0378 E060 LDI R22,0
0379 E070 LDI R23,0
037A 8368 STD Y+0,R22
037B 8379 STD Y+1,R23
037C 019A MOVW R18,R20
037D E001 LDI R16,1
037E DF75 RCALL _SD_Write_Command
037F 2EC0 MOV R12,R16
(0094) retry++;
0380 94E3 INC R14
(0095) if(retry==100)
0381 2D8E MOV R24,R14
0382 3684 CPI R24,0x64
0383 F401 BNE 0x0384
(0096) {
(0097) ;
(0098) }
(0099) }
(0100) while(temp!=0);
0384 20CC TST R12
0385 F781 BNE 0x0376
(0101) retry=0;
0386 24EE CLR R14
(0102) SD_Write_Command(16,512); //设置一次读写BLOCK的长度为512个字节
0387 E040 LDI R20,0
0388 E052 LDI R21,2
0389 E060 LDI R22,0
038A E070 LDI R23,0
038B 8368 STD Y+0,R22
038C 8379 STD Y+1,R23
038D 019A MOVW R18,R20
038E E100 LDI R16,0x10
038F DF64 RCALL _SD_Write_Command
(0103)
(0104) MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high
0390 9AC0 SBI 0x18,0
(0105) return(0); //All commands have been taken.
0391 2700 CLR R16
0392 9622 ADIW R28,2
0393 940E0DA1 CALL pop_gset5
0395 9508 RET
_SD_Read_Block:
temp --> R20
i --> R22
address --> Y+6
0396 940E0CAE CALL push_arg4
0398 940E0DAA CALL push_gset2
039A 9722 SBIW R28,2
(0106) }
(0107) //****************************************************************************
(0108) //从SD卡读一个扇区 Return 0 if no Error.
(0109) //****************************************************************************
(0110) uchar SD_Read_Block(unsigned long address)
(0111) {
(0112) uchar temp=0;uint i=0;
039B 2744 CLR R20
039C 2766 CLR R22
039D 2777 CLR R23
(0113) reading=1;
039E E081 LDI R24,1
039F 93800100 STS reading,R24
(0114) temp=SD_Write_Command(17,address); //读出RESPONSE
03A1 01FE MOVW R30,R28
03A2 8026 LDD R2,Z+6
03A3 8037 LDD R3,Z+7
03A4 8440 LDD R4,Z+8
03A5 8451 LDD R5,Z+9
03A6 8248 STD Y+0,R4
03A7 8259 STD Y+1,R5
03A8 0191 MOVW R18,R2
03A9 E101 LDI R16,0x11
03AA DF49 RCALL _SD_Write_Command
03AB 2F40 MOV R20,R16
(0115) while (Read_Byte_SPI()!= 0xfe)
03AC 940E03F0 CALL _Read_Byte_SPI
03AE 3F0E CPI R16,0xFE
03AF F7E1 BNE 0x03AC
(0116) {;} //直到读取到了数据的开始头0XFE,才继续
(0117) for(i=0; i<512; i++)
03B0 2766 CLR R22
03B1 2777 CLR R23
03B2 C00A RJMP 0x03BD
(0118) {
(0119) BUFFER[i]=Read_Byte_SPI();
03B3 940E03F0 CALL _Read_Byte_SPI
03B5 E285 LDI R24,0x25
03B6 E092 LDI R25,2
03B7 01FB MOVW R30,R22
03B8 0FE8 ADD R30,R24
03B9 1FF9 ADC R31,R25
03BA 8300 STD Z+0,R16
03BB 5F6F SUBI R22,0xFF
03BC 4F7F SBCI R23,0xFF
03BD 3060 CPI R22,0
03BE E0E2 LDI R30,2
03BF 077E CPC R23,R30
03C0 F390 BCS 0x03B3
(0120) }
(0121) Read_Byte_SPI();//CRC - Byte
03C1 940E03F0 CALL _Read_Byte_SPI
(0122) Read_Byte_SPI();//CRC - Byte
03C3 940E03F0 CALL _Read_Byte_SPI
(0123) reading=0;
03C5 2422 CLR R2
03C6 92200100 STS reading,R2
(0124) MMC_PORT|=MMC_CS_PIN; //关闭SD卡
03C8 9AC0 SBI 0x18,0
(0125) return(temp);
03C9 2F04 MOV R16,R20
03CA 9622 ADIW R28,2
03CB 940E0D98 CALL pop_gset2
03CD 9624 ADIW R28,4
03CE 9508 RET
_delay_nnus:
b --> R20
n --> R16
03CF 940E0DAC CALL push_gset1
FILE: E:\V3U~1\sd\M64-SD卡MP3程序\1011.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #define MP3_DDR DDRB
(0006) #define MP3_PORT PORTB
(0007) #define MP3_PIN PINB
(0008) #define MP3_CMD_CS BIT(4)
(0009) #define MP3_DATA_REST BIT(5)
(0010) #define MP3_DATA_REQ BIT(6)
(0011) #define MP3_DATA_CS BIT(7)
(0012) void delay_nnus(unsigned int n)
(0013) {
(0014) unsigned char b;
(0015) for (b = 1; b<n; b++)
03D1 E041 LDI R20,1
03D2 C001 RJMP 0x03D4
03D3 9543 INC R20
03D4 2E24 MOV R2,R20
03D5 2433 CLR R3
03D6 1620 CP R2,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -