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

📄 sd.lst

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -