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

📄 mmc_sd.i

📁 mp3量不要让站长把时间都花费在为您修正说明上。压缩包解压时不能有密码。系统会自动删除debug和release目录
💻 I
📖 第 1 页 / 共 3 页
字号:
 




extern __declspec(__nothrow) __pure ldiv_t ldiv(long int  , long int  );
   











 







extern __declspec(__nothrow) __pure __int64 llabs(__int64  );
   



 




extern __declspec(__nothrow) __pure lldiv_t lldiv(__int64  , __int64  );
   











 
#line 570 "C:\\Keil\\ARM\\RV31\\INC\\stdlib.h"



 
typedef struct __sdiv32by16 { int quot, rem; } __sdiv32by16;
typedef struct __udiv32by16 { unsigned int quot, rem; } __udiv32by16;
    
typedef struct __sdiv64by32 { int rem, quot; } __sdiv64by32;

__value_in_regs extern __declspec(__nothrow) __pure __sdiv32by16 __rt_sdiv32by16(
     int  ,
     short int  );
   

 
__value_in_regs extern __declspec(__nothrow) __pure __udiv32by16 __rt_udiv32by16(
     unsigned int  ,
     unsigned short  );
   

 
__value_in_regs extern __declspec(__nothrow) __pure __sdiv64by32 __rt_sdiv64by32(
     int  , unsigned int  ,
     int  );
   

 



 
extern __declspec(__nothrow) unsigned int __fp_status(unsigned int  , unsigned int  );
   







 























 
extern __declspec(__nothrow) int mblen(const char *  , size_t  );
   












 
extern __declspec(__nothrow) int mbtowc(wchar_t * __restrict  ,
                   const char * __restrict  , size_t  );
   















 
extern __declspec(__nothrow) int wctomb(char *  , wchar_t  );
   













 





 
extern __declspec(__nothrow) size_t mbstowcs(wchar_t * __restrict  ,
                      const char * __restrict  , size_t  );
   














 
extern __declspec(__nothrow) size_t wcstombs(char * __restrict  ,
                      const wchar_t * __restrict  , size_t  );
   














 

extern __declspec(__nothrow) void __use_realtime_heap(void);
extern __declspec(__nothrow) void __use_realtime_division(void);
extern __declspec(__nothrow) void __use_two_region_memory(void);
extern __declspec(__nothrow) void __use_no_heap(void);
extern __declspec(__nothrow) void __use_no_heap_region(void);

extern __declspec(__nothrow) char const *__C_library_version_string(void);
extern __declspec(__nothrow) int __C_library_version_number(void);











#line 807 "C:\\Keil\\ARM\\RV31\\INC\\stdlib.h"


 
#line 10 "global.h"
#line 1 "C:\\Keil\\ARM\\RV31\\INC\\setjmp.h"
 






 

 
 






 












#line 38 "C:\\Keil\\ARM\\RV31\\INC\\setjmp.h"




typedef __int64 jmp_buf[48];     
                             
                             

extern const int __aeabi_JMP_BUF_SIZE;
              
 
 
 
 

extern __declspec(__nothrow) int setjmp(jmp_buf  );
   




 


extern __declspec(__nothrow) __declspec(__noreturn) void longjmp(jmp_buf  , int  );
   


















 











#line 101 "C:\\Keil\\ARM\\RV31\\INC\\setjmp.h"



 
#line 11 "global.h"
#line 1 "C:\\Keil\\ARM\\RV31\\INC\\rt_misc.h"







 











 
extern void _getenv_init(void);




 
extern void _clock_init(void);





 

extern void *__user_libspace(void);









 
struct __argc_argv {
    int argc;
    char **argv;
    int r2, r3;
};
extern __value_in_regs struct __argc_argv
__rt_lib_init(unsigned  , unsigned  );









 
__value_in_regs struct __argc_argv __ARM_get_argv(void * );




 
extern void __rt_lib_shutdown(void);






 
extern void __rt_exit(int  );    













 
struct __initial_stackheap {
    unsigned heap_base;                 
    unsigned stack_base;                
    unsigned heap_limit;                
    unsigned stack_limit;               
};
extern __value_in_regs struct __initial_stackheap
__user_initial_stackheap(unsigned  , unsigned  ,
                         unsigned  , unsigned  );




 
struct __heap_extent {
    unsigned base, range;
};
extern __value_in_regs struct __heap_extent
__user_heap_extent(unsigned  , unsigned  );










 
struct __stack_slop {
    unsigned always, cleanup;
};
extern __value_in_regs struct __stack_slop
__user_stack_slop(unsigned  , unsigned  );








 
extern unsigned __user_heap_extend(int  ,
                                   void **  ,
                                   unsigned  );






 
int __raise(int  , int  );






 
int __default_signal_handler(int  , int  );





 
void __rt_raise(int  , int  );





#line 12 "global.h"






						    

						    

						    

						    


#line 37 "global.h"









extern unsigned short get16(unsigned char * addr);
extern unsigned short get16_big(unsigned char * addr);
extern unsigned short get16_little(unsigned char * addr);
extern unsigned int get32(unsigned char * addr);
extern unsigned int get32_big(unsigned char * addr);

extern unsigned int get32_little(unsigned char * addr);
extern void put16(unsigned char * addr, unsigned short val);
extern void put16_big(unsigned char * addr, unsigned short val);
extern void put16_little(unsigned char * addr, unsigned short val);
extern void put32(unsigned char * addr, unsigned int val);
extern void put32_big(unsigned char * addr, unsigned int val);
extern void put32_little(unsigned char * addr, unsigned int val);
extern unsigned short swap16(unsigned short val);
extern unsigned int swap32(unsigned int val);
void dump_memory(unsigned char * addr, unsigned int length);
void soft_delay_ms(unsigned int t);



#line 31 "MMC_SD.h"




#line 41 "MMC_SD.h"

#line 65 "MMC_SD.h"









unsigned char MMC_SD_Init(void);
unsigned char MMC_SD_ReadSingleBlock(unsigned int sector, unsigned char* buffer);
unsigned char MMC_SD_WriteSingleBlock(unsigned int sector, unsigned char* buffer);
unsigned int MMC_SD_ReadCapacity(void);

#line 27 "MMC_SD.c"




static unsigned char address_mode=0;





 
void SPI_Low(void)
{
	(*((volatile unsigned long *) 0xE0068010))	= 128; 								

#line 51 "MMC_SD.c"
}

 
void SPI_High(void)
{
	(*((volatile unsigned long *) 0xE0068010))	= 4; 								

#line 67 "MMC_SD.c"
}


 
unsigned char SPI_WriteByte(unsigned char val)
{
	(*((volatile unsigned long *) 0xE0068008)) = val;

	while( ((*((volatile unsigned long *) 0xE006800C)) & 0x01) == 0 );	    			

	return((*((volatile unsigned long *) 0xE0068008)));

#line 88 "MMC_SD.c"
}

  
unsigned char MMC_SD_SendCommand(unsigned char cmd, unsigned int arg)
{
	unsigned char r1;
	unsigned short retry=0;
	
	
	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);
	(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
	
	SPI_WriteByte(cmd | 0x40);	 
	SPI_WriteByte(arg>>24);
	SPI_WriteByte(arg>>16);
	SPI_WriteByte(arg>>8);
	SPI_WriteByte(arg);
	SPI_WriteByte(0x95);
	
	while((r1 = SPI_WriteByte(0xff)) == 0xff)	 
		if(retry++ > 8000) break;				 

	(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
	SPI_WriteByte(0xff);				

	return r1;								 
}

  
unsigned char MMC_SD_SendCommandCRC(unsigned char cmd, unsigned int arg, unsigned char crc)
{
	unsigned char r1;
	unsigned short retry=0;

	
	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);
	(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
	
	SPI_WriteByte(cmd | 0x40);	 
	SPI_WriteByte(arg>>24);
	SPI_WriteByte(arg>>16);
	SPI_WriteByte(arg>>8);
	SPI_WriteByte(arg);
	SPI_WriteByte(crc);
	
	while((r1 = SPI_WriteByte(0xff)) == 0xff)	 
		if(retry++ > 8000) break;				 

	(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
	SPI_WriteByte(0xff);				


	return r1;								 
}


  
unsigned char MMC_SD_SendCommandCRC_NoDeassert(unsigned char cmd, unsigned int arg, unsigned char crc)
{
	unsigned char r1;
	unsigned short retry=0;

	
	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);
	(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
	
	SPI_WriteByte(cmd | 0x40);	 
	SPI_WriteByte(arg>>24);
	SPI_WriteByte(arg>>16);
	SPI_WriteByte(arg>>8);
	SPI_WriteByte(arg);
	SPI_WriteByte(crc);
	
	while((r1 = SPI_WriteByte(0xff)) == 0xff)	 
		if(retry++ > 8000) break;				 

	return r1;								 
}


 
unsigned char MMC_SD_Init(void)
{
	unsigned char i;
	unsigned short retry = 0;
	unsigned char r1 = 0;



	unsigned char buffer[4];
	
	(*((volatile unsigned long *) 0xE002C004)) &= ~(0x03 << 10);		
	(*((volatile unsigned long *) 0xE0028008)) |= (0x01 << 21);
	(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);	
		
	(*((volatile unsigned long *) 0xE002C004)) &= ~((0x01 << 2) + (0x03 << 4) + (0x03 << 6)); 
	(*((volatile unsigned long *) 0xE002C004)) |=  (0x02 << 2) + (0x02 << 4) + (0x02 << 6);
	
	(*((volatile unsigned long *) 0xE0068000)) = (0x00 << 8) |              			
            (0x00 << 7) |             				
            (0x00 << 6) |              				
            (0x00 << 4) |              				
            (0x07 << 0);               				

    (*((volatile unsigned long *) 0xE0068004)) = (0x00 << 3) |              			
            (0x00 << 2) |              				
            (0x01 << 1) |              				
            (0x00 << 0);               				

	(*((volatile unsigned long *) 0xE0068014))	= 0x00;								    
	(*((volatile unsigned long *) 0xE0068020))	= 0x00;                     			

			 
	 
	SPI_Low();
	soft_delay_ms(100);
	do
	{
		for(i=0;i<40;i++) SPI_WriteByte(0xff);
		r1 = MMC_SD_SendCommandCRC(0, 0, 0x95); 
		retry++;
		if(retry>8000) return 1; 
	} while(r1 != 0x01);	

	
	r1 = MMC_SD_SendCommandCRC_NoDeassert(8, 0x1aa, 0x87); 
	
	if(r1 == 0x05)     
	{
		
		(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
		SPI_WriteByte(0xff);				 
		SPI_WriteByte(0xff);	
		
		
		printf(("\r\nVersion 1"));

		retry = 0;
		do
		{
			r1 = MMC_SD_SendCommandCRC(55, 0, 0);
			if(r1!=0x01)
			{
				printf(("\r\n CMD55 r1=%x "),r1);
				return r1;
			}
			retry ++;
			r1 = MMC_SD_SendCommandCRC(41, 0, 0);

		}while((r1!=0)&&(retry<8000));

		if (retry==8000)  
		{
			printf(("\r\nTake it as MMC card "));
			retry = 0;
			do
			{
				r1 = MMC_SD_SendCommand(1, 0); 
				retry++;
				if(retry>8000)
				{
					printf(("\r\n Time out "));
					return 1; 
				}
			} while(r1);
		}	
		
		SPI_High();		 
		soft_delay_ms(1000);

		r1 = MMC_SD_SendCommand(59, 0); 	
		if(r1 != 0)
		{
			printf(("\r\nDisabel CRC error"));
			return r1;
		}

		r1 = MMC_SD_SendCommand(16, 512); 
		if(r1 != 0)
		{
			printf(("\r\nSet sector size error"));
			return r1;
		}

		address_mode = 0;
	}
	
	else if(r1 == 0x01)    
	{
		for(i=0;i<3;i++){buffer[i]=SPI_WriteByte(0xff);printf("%x ",buffer[i]);}
		
		
		
		
		

		(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
		SPI_WriteByte(0xff);				 

		printf(("\r\nVersion 2"));

		retry = 0;
		do
		{
			r1 = MMC_SD_SendCommandCRC(55, 0, 0);
			if(r1!=0x01)
			{
				
				return r1;
			}

			r1 = MMC_SD_SendCommandCRC(41, 0x40000000, 0);

		}while(r1!=0);

		if(MMC_SD_SendCommandCRC_NoDeassert(58, 0, 0)!=0x00)goto exit1;  
		for(i=0;i<4;i++)buffer[i]=SPI_WriteByte(0xff);

		if(buffer[0]&(1<<6))
			address_mode = 1;
		else
			address_mode = 0;
		
		(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
		SPI_WriteByte(0xff);				 


		SPI_High();		 

	}
	else
	{
		printf(("\r\nnot supported card"));
	}


	printf(("\r\naddress mode = %d"),address_mode);


	return 0;  
	exit1:
		printf(("\r\nexit 1  r1=%x "),r1);

		(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
		SPI_WriteByte(0xff);				 
		return 1;	
}




unsigned char MMC_SD_ReadSingleBlock(unsigned int sector, unsigned char* buffer)
{
	unsigned char r1;
	unsigned short i;
	unsigned int retry=0;

	

	r1 = MMC_SD_SendCommandCRC_NoDeassert(17, address_mode?sector:sector<<9,0);
	
	if(r1 != 0x00)
		return r1;

	(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
	
	while(SPI_WriteByte(0xff) != 0xfe)if(retry++ > 0x6ffff){(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);return 1;}

	for(i=0; i<512; i++)
	{
		*buffer++ = SPI_WriteByte(0xff);
	}

	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);
	
	(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
	SPI_WriteByte(0xff);

	return 0;
}



unsigned char MMC_SD_WriteSingleBlock(unsigned int sector, unsigned char* buffer)
{
	unsigned char r1;
	unsigned short i;
	unsigned int retry=0;
	
	

	r1 = MMC_SD_SendCommandCRC_NoDeassert(24,  address_mode?sector:sector<<9,0);
	if(r1 != 0x00)
		return r1;

	(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
	
	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);

	SPI_WriteByte(0xfe);
	
	for(i=0; i<512; i++)
	{
		SPI_WriteByte(*buffer++);
	}
	
	SPI_WriteByte(0xff);			
	SPI_WriteByte(0xff);
	
	r1 = SPI_WriteByte(0xff);
	
	if( (r1&0x1f) != 0x05)
	{
		(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
		return r1;
	}
	
	while(!SPI_WriteByte(0xff))if(retry++ > 0x6ffff){(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);return 1;}

	(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
	SPI_WriteByte(0xff);

	return 0;
}


 
unsigned int MMC_SD_ReadCapacity()
{
	unsigned char r1;
	unsigned short i;
	unsigned short temp;
	unsigned char buffer[16];
	unsigned int Capacity;
	unsigned int retry =0;
	

	
	
	

	r1 = MMC_SD_SendCommandCRC_NoDeassert(9, 0,0);
	if(r1 != 0x00)
		return r1;

	(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
	while(SPI_WriteByte(0xff) != 0xfe)if(retry++ > 0x6ffff){(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);return 1;}

	
	for(i=0;i<16;i++)
	{
		buffer[i]=SPI_WriteByte(0xff);
	}	

	SPI_WriteByte(0xff);
	SPI_WriteByte(0xff);
	
	SPI_WriteByte(0xff);
	
	(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);

	SPI_WriteByte(0xff);

	if((buffer[0]&0xc0)==0x40)
	{
		Capacity =  (((unsigned int)buffer[8])<<8 + (unsigned int)buffer[9] +1)*(unsigned int)1024;
		return Capacity;
	}

 

	i = buffer[6]&0x03;
	i<<=8;
	i += buffer[7];
	i<<=2;
	i += ((buffer[8]&0xc0)>>6);

 


	r1 = buffer[9]&0x03;
	r1<<=1;
	r1 += ((buffer[10]&0x80)>>7);


 


	r1+=2;

	temp = 1;
	while(r1)
	{
		temp*=2;
		r1--;
	}
	
	Capacity = ((unsigned int)(i+1))*((unsigned int)temp);




	i = buffer[5]&0x0f;

 


	temp = 1;
	while(i)
	{
		temp*=2;
		i--;
	}
 


 










 


	
	Capacity *= (unsigned int)temp;	 
	return Capacity/512;		
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -