⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.lst

📁 用AVR的MP3代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -