📄 sdmmc.lis
字号:
.module sdmmc.c
.area data(ram, con, rel)
0000 _readPos::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
0002 .dbsym e readPos _readPos i
0002 _sectorPos::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
0003 .dbsym e sectorPos _sectorPos c
0003 _LBA_Opened::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
0004 .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
0004 .dbsym e LBA_Opened _LBA_Opened c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
0000 .dbfunc e MMC_Port_Init _MMC_Port_Init fV
.even
0000 _MMC_Port_Init::
0000 .dbline -1
0000 .dbline 75
0000 ; /**************************************************************************************
0000 ; //------------------ MMC/SD-Card Reading and Writing implementation -------------------
0000 ; //FileName : mmc.c
0000 ; //Function : Connect AVR to MMC/SD
0000 ; //Created by : ZhengYanbo
0000 ; //Created date : 15/08/2005
0000 ; //Version : V1.2
0000 ; //Last Modified: 19/08/2005
0000 ; //Filesystem : Read or Write MMC without any filesystem
0000 ;
0000 ; //CopyRight (c) 2005 ZhengYanbo
0000 ; //Email: Datazyb_007@163.com
0000 ; ****************************************************************************************/
0000 ; /*
0000 ; 读扇区方法:
0000 ;
0000 ; 1. Set_block_length(default is 512 bytes).Use set_block_length command.如果你的缓冲区是512字节,那么这个区一般不用设置.
0000 ;
0000 ; 2. Send block read command.我用的是cmd16
0000 ; //Command 16 is for reading Blocks from MMC/SD-Card
0000 ; unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
0000 ;
0000 ; 3. Wait for block start token(is 0xFE)
0000 ; //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
0000 ; while (Read_Byte_MMC() != 0xfe){};
0000 ;
0000 ; 4. Read 512 bytes out from your Card.
0000 ;
0000 ; 5. Read CRC bytes(2 bytes) 这里对我没有用处,空读就行了.
0000 ; //CRC-Byte
0000 ; Read_Byte_MMC();//CRC - Byte
0000 ; Read_Byte_MMC();//CRC - Byte
0000 ;
0000 ; 6. Disable SD Card and return TRUE
0000 ;
0000 ; 另外请大家使用时候注意下面函数:
0000 ; unsigned char MMC_Start_Read_Sector(unsigned long sector);
0000 ; void MMC_get_data(unsigned int Bytes,unsigned char *buffer);
0000 ; void MMC_get_data_LBA(unsigned long lba, unsigned int Bytes,unsigned char *buffer);
0000 ; void MMC_GotoSectorOffset(unsigned long LBA,unsigned int offset);
0000 ; void MMC_LBA_Close(void);
0000 ; 如果你的RAM足够大,那么你可以一次缓冲完一个sector,这些函数可以删除(因为我写这些函数时候,使用的CPU是8515) 如果使用例如MEGA8515这样的CPU,RAM不足1KB,你只能定义例如sectBuf[64]这样小的DATA BUFFER. 那么这些函数就可以保留,先使用MMC_Start_Read_Sector(unsigned long sector)打开一个LBA,时候再去读数据到你的循环缓冲区sectBuf[64],分8次完成一个LBA数据.
0000 ;
0000 ; */
0000 ;
0000 ;
0000 ; #include "config.h"
0000 ; #if USE_MMC
0000 ; //BUFFER_TYPE sectorBuffer; //512 bytes for sector buffer
0000 ;
0000 ; //--------------------------------------------------------------
0000 ; uint16 readPos=0;
0000 ; uint8 sectorPos=0;
0000 ; uint8 LBA_Opened=0; //Set to 1 when a sector is opened.
0000 ; uint8 Init_Flag; //Set it to 1 when Init is processing.
0000 ; //---------------------------------------------------------------
0000 ; // Prototypes
0000 ; //---------------------------------------------------------------
0000 ; void MMC_Port_Init(void);
0000 ;
0000 ; uint8 Read_Byte_MMC(void);
0000 ; //uint8 Read_Byte_MMC_Long(void);
0000 ; void Write_Byte_MMC(uint8 value);
0000 ; uint8 MMC_Read_Block(uint8 *CMD,uint8 *Buffer,uint16 Bytes);
0000 ; uint8 Write_Command_MMC(uint8 *CMD);
0000 ; uint8 Read_CSD_MMC(uint8 *Buffer);
0000 ; uint8 Read_CID_MMC(uint8 *Buffer);
0000 ; void delay_us(uint8 us);
0000 ;
0000 ;
0000 ; //****************************************************************************
0000 ; // Port Init
0000 ; void MMC_Port_Init(void)
0000 ; //****************************************************************************
0000 ; {
0000 .dbline 77
0000 ; //Config ports
0000 ; MMC_DDR&=~(1<<SPI_MISO); //Set Pin MMC_DI as Input
0000 BE98 cbi 0x17,6
0002 .dbline 78
0002 ; MMC_DDR|=(1<<SPI_CLK); //Set Pin MMC_Clock as Output
0002 BF9A sbi 0x17,7
0004 .dbline 79
0004 ; MMC_DDR|=(1<<SPI_MOSI); //Set Pin MMC_DO as Output
0004 BD9A sbi 0x17,5
0006 .dbline 80
0006 ; MMC_DDR|=(1<<MMC_Chip_Select); //Set Pin MMC_Chip_Select as Output
0006 BC9A sbi 0x17,4
0008 .dbline 82
0008 ; //busy led port init
0008 ; MMC_DDR|=(1<<SPI_Busy); //Set spi busy led port output
0008 B89A sbi 0x17,0
000A .dbline 83
000A ; MMC_PORT|=(1<<SPI_Busy); //busy led off
000A C09A sbi 0x18,0
000C .dbline 85
000C ;
000C ; MMC_Disable(); //Set MMC_Chip_Select to High,MMC/SD Invalid.
000C C49A sbi 0x18,4
000E .dbline 85
000E .dbline -2
000E L7:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
.area lit(rom, con, rel)
0000 L9:
0000 4000 .byte 64,0
0002 0000 .byte 0,0
0004 0095 .byte 0,149
.area text(rom, con, rel)
0010 .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
0010 .dbfunc e MMC_Init _MMC_Init fc
0010 ; spispeeddub -> R20
0010 ; spimode -> R22
0010 ; CMD -> y+0
0010 ; temp -> R10
0010 ; i -> R12
0010 ; retry -> R14
.even
0010 _MMC_Init::
0010 0E940000 xcall push_gset5
0014 2697 sbiw R28,6
0016 .dbline -1
0016 .dbline 92
0016 ; }
0016 ;
0016 ; //****************************************************************************
0016 ; //Routine for Init MMC/SD card(SPI-MODE)
0016 ; uint8 MMC_Init(void)
0016 ; //****************************************************************************
0016 ; {
0016 .dbline 95
0016 ; uint8 retry,temp,spimode,spispeeddub;
0016 ; uint8 i;
0016 ; uint8 CMD[] = {MMC_RESET,0x00,0x00,0x00,0x00,0x95};
0016 80E0 ldi R24,<L9
0018 90E0 ldi R25,>L9
001A FE01 movw R30,R28
001C 06E0 ldi R16,6
001E 10E0 ldi R17,0
0020 FA93 st -y,R31
0022 EA93 st -y,R30
0024 9A93 st -y,R25
0026 8A93 st -y,R24
0028 0E940000 xcall asgncblk
002C .dbline 99
002C ;
002C ; //MMC_Port_Init(); //Init SPI port
002C ;
002C ; spimode=SPCR;
002C 6DB1 in R22,0xd
002E .dbline 100
002E ; spispeeddub=SPSR;
002E 4EB1 in R20,0xe
0030 .dbline 101
0030 ; SPSR=0;
0030 2224 clr R2
0032 2EB8 out 0xe,R2
0034 .dbline 102
0034 ; SPCR=0;
0034 2DB8 out 0xd,R2
0036 .dbline 104
0036 ;
0036 ; for(i=0;i<200;i++) //Wait MMC/SD ready...
0036 CC24 clr R12
0038 04C0 xjmp L13
003A L10:
003A .dbline 105
003A .dbline 106
003A 0000 nop
003C .dbline 107
003C 0FEF ldi R16,255
003E EED3 xcall _delay_us
0040 .dbline 108
0040 L11:
0040 .dbline 104
0040 C394 inc R12
0042 L13:
0042 .dbline 104
0042 8C2D mov R24,R12
0044 883C cpi R24,200
0046 C8F3 brlo L10
0048 .dbline 110
0048 ; {
0048 ; NOP();
0048 ; delay_us(255);
0048 ; }
0048 ;
0048 ; Init_Flag=1; //Set the init flag
0048 81E0 ldi R24,1
004A 80930000 sts _Init_Flag,R24
004E .dbline 112
004E ;
004E ; MMC_Disable();
004E C49A sbi 0x18,4
0050 .dbline 112
0050 .dbline 114
0050 ;
0050 ; for (i=0;i<0x0f;i++)
0050 CC24 clr R12
0052 03C0 xjmp L17
0054 L14:
0054 .dbline 115
0054 .dbline 116
0054 0FEF ldi R16,255
0056 01D1 xcall _Write_Byte_MMC
0058 .dbline 117
0058 L15:
0058 .dbline 114
0058 C394 inc R12
005A L17:
005A .dbline 114
005A 8C2D mov R24,R12
005C 8F30 cpi R24,15
005E D0F3 brlo L14
0060 .dbline 120
0060 ; {
0060 ; Write_Byte_MMC(0xff); //send 74 clock at least!!!
0060 ; }
0060 ;
0060 ; //Send Command CMD0 to MMC/SD Card
0060 ; retry=0;
0060 EE24 clr R14
0062 L18:
0062 .dbline 123
0062 ;
0062 ; do
0062 ; { //retry 200 times to send CMD0 command
0062 .dbline 124
0062 ; temp=Write_Command_MMC(CMD);
0062 8E01 movw R16,R28
0064 AAD0 xcall _Write_Command_MMC
0066 A02E mov R10,R16
0068 .dbline 125
0068 ; retry++;
0068 E394 inc R14
006A .dbline 126
006A ; if(retry==200)
006A 8E2D mov R24,R14
006C 883C cpi R24,200
006E 11F4 brne L21
0070 .dbline 127
0070 ; { //time out
0070 .dbline 128
0070 ; return(INIT_CMD0_ERROR);//CMD0 Error!
0070 01E0 ldi R16,1
0072 1AC0 xjmp L8
0074 L21:
0074 .dbline 130
0074 ; }
0074 ; }
0074 L19:
0074 .dbline 131
0074 ; while(temp!=1);
0074 8A2D mov R24,R10
0076 8130 cpi R24,1
0078 A1F7 brne L18
007A .dbline 134
007A ;
007A ; //Send Command CMD1 to MMC/SD-Card
007A ; CMD[0] = MMC_INIT; //Command 1
007A 81E4 ldi R24,65
007C 8883 std y+0,R24
007E .dbline 135
007E ; CMD[5] = 0xFF;
007E 8FEF ldi R24,255
0080 8D83 std y+5,R24
0082 .dbline 136
0082 ; retry=0;
0082 EE24 clr R14
0084 L24:
0084 .dbline 138
0084 ; do
0084 ; { //retry 100 times to send CMD1 command
0084 .dbline 139
0084 ; temp=Write_Command_MMC(CMD);
0084 8E01 movw R16,R28
0086 99D0 xcall _Write_Command_MMC
0088 A02E mov R10,R16
008A .dbline 140
008A ; retry++;
008A E394 inc R14
008C .dbline 141
008C ; if(retry==100)
008C 8E2D mov R24,R14
008E 8436 cpi R24,100
0090 11F4 brne L27
0092 .dbline 142
0092 ; { //time out
0092 .dbline 143
0092 ; return(INIT_CMD1_ERROR);//CMD1 Error!
0092 02E0 ldi R16,2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -