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

📄 sd.lst

📁 /*** *** *** *** *** *** *** *** *** *** / /* MP3 Code for M32L */ /* By pasyong
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -