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

📄 main.c

📁 非常完整的sd卡、mmc卡读取及文件系统的源代码
💻 C
字号:
/*
 Copyright:       
 Author:          
 Remarks:        
 known Problems: none
 Version:         
 Description:    
*/


#include "main.h"
 
 
 
//AVR_ATmega32
#	define USR UCSRA
#	define UCR UCSRB
#	define UBRR UBRRL
#	define EICR EICRB
 

#define SYSCLK	7372800  
#define BAUD_RATE 9600	//Baud Rate 

 
//Installation  
void IOInit (void)
{
	DDRD=(1 << DDD0);
	UCR=(1 << TXEN)|(1 << RXEN)  ;//Enable TXEN AND RXEN in Register UCR  
	UBRR=(SYSCLK / (BAUD_RATE * 16L) - 1);
}
  
//================================================================
 
//printf
void USART_Transmit( char c)
{
    if (c == '\n')
	USART_Transmit('\r');//0DH
	loop_until_bit_is_set(USR, UDRE);
	UDR = c;
}

//================================================================

unsigned char USART_Receive( void )
{
  loop_until_bit_is_set(USR, RXC);
  return UDR;
   
}


//================================================================
//================================================================
//================================================================
//================================================================
//================================================================



unsigned char Root_directory() 


{
	unsigned int Clustervar;
	unsigned char Dir_Attrib = 0;
	unsigned long Size = 0;
	unsigned char a;
    int tmp;
	unsigned char Buffer[512];

	printf("\n[Root Directory:]\n");

	for (a = 0;a < 240;a++)
	{
		Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
//Clustervar 起始簇
		if (Clustervar == 0xffff){break;}

		if (Size<=0x0000FFFF)
		   {
		   	tmp = (Size & 0x0000FFFF);
		   }
		   else 
		   {
		    tmp=Size/1024;
		   }
 
		printf("Cluster = %4x DirA = %2x Size= %8d  FileName = ",Clustervar,Dir_Attrib,tmp);
		printf(Buffer);
		printf("\n");
	}

	printf("\n>[Root Directory End!]\n\n>");

  

  return(0);
 }

//================================================================


unsigned char read_file(U08 *filename) 
{
	unsigned int Clustervar;
	unsigned char Dir_Attrib = 0;
	unsigned long Size = 0;
    unsigned char Buffer[512];
    int tmp;

	Clustervar = 0;//search in Root Directory
	if (fat_search_file(filename,&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
       {
        printf("\n");
		int b;
        int c;

		c=Size/BlockSize;//512

        //1010BYTE /512 = 2.

//    size (bytes) / BlockSize
//eg.  1025        /  512     = 2*512   + 1   bytes = 2 个 block 再加下一个block里的前 1   个byte
//     3456        /  512     = 6*512   + 384 bytes = 6 个 block 再加下一个block里的前 384 个byte


//总簇数 


		for (b = 0;b<=c;b++)//已读的
			{
			fat_read_file (Clustervar,Buffer,b);

			for (tmp = 0;tmp<512;tmp++)
			   {

			    if ((b==c)&&(tmp==Size%512))
				  {

				  printf("\n\n\n[the File end1 !]\n>");
				  return(0);
				  
				  }

				printf ("%c",Buffer[tmp]);
				}
			}
		}
		
		
     else
	 {

       printf("\n");

 	   printf(filename);

 	   printf("   file not Found!\n>");

 


	   return(1);
	 }
	
	 
	printf("\n\n\n[the File end !]\n>");


  return(0);
}

//================================================================

unsigned char exec_cmd (U08 *command)

{	
  	unsigned char filename[16];
    unsigned char b;
	U08 *pointer; 
	pointer = filename;
  
  switch ( command[0] )
  {
   case 'D':
		 Root_directory() ;
	     return(0);
	     break;
   case 'T':
		 for(b=2;b<16;b++)
			{
    			if ((command[b] != 13)&&	(command[b]  != SPACE))
					{
						*pointer++=command[b];
					}
			}

         read_file(filename) ; 
		 return(0);
	     break;
  }

  printf ("\n>[bad command ......]\n>");

  return(0);
}



//================================================================



//---------------------------------------------
//------------------ main ---------------------
//---------------------------------------------
 
int main (void)
{
    unsigned char Buffer[512];
    unsigned int tmp;
	unsigned char command[16];
	unsigned char rxdcnt;

	char i;
	
	IOInit();
	fdevopen (USART_Transmit,0);
  
    printf ("\n\n............. MMC/SD + FAT16 Test System ..............\n\n");	
 	printf(">Detecting MMC/SD Card ...");
	
//-------------- detect mmc/sd card ----------------
	while ( mmc_init() !=0)    
		{
	      printf(".");
		}
	
//------------- load Cluster OFFSET and Size  -------
	fat_cluster_data_store(); //  

	printf("\n\n>Found MMC/SD CARD !!!\n");


//get mmc/sd card volume_info...
	mmc_read_cid (Buffer);
	// get the name of the card 
    printf(">Card Name:");
    for (tmp = 3;tmp<8;tmp++){printf("%c",Buffer[tmp]);};
    printf("\n");

	
    unsigned char sector_multiply;
    int sector_count,size_MB;

	mmc_read_csd (Buffer);
 
	sector_count = Buffer[6] & 0x03;
	sector_count <<= 8;
	sector_count += Buffer[7];
	sector_count <<= 2;
	sector_count += (Buffer[8] & 0xc0) >> 6;
		
	// get the val for C_SIZE_MULT. bits [49:47] of sectorBuffer.data
	// [49:48] == sectorBuffer.data[5] && 0x03
	// [47]    == sectorBuffer.data[4] && 0x80
	sector_multiply = Buffer[9] & 0x03;
	sector_multiply <<= 1;
	sector_multiply += (Buffer[10] & 0x80) >> 7;

	// work out the MBs
	// mega bytes in u08 == C_SIZE / (2^(9-C_SIZE_MULT))
	size_MB = sector_count >> (9-sector_multiply);

    printf(">Card Size:");
	printf("%d",size_MB);
    printf("MB\n>"); 

    
//----------------------------------
//-------- Root Directory ----------
//----------------------------------  

 U08 j;

	while(1)
		{
		i=USART_Receive();
		USART_Transmit(i); 
        

		if (rxdcnt<=16)
		   {
		      command[rxdcnt]=i;
		   }

         if (i == '\r')  //0DH
		    {
			 
			  exec_cmd(command);
              rxdcnt=0;


             for (j = 0;j < 16;j++){command[j]=0; }

			  	
			}else {rxdcnt++;}
			


  
		}

/*


			
			*/


/*
	unsigned int Clustervar;
	unsigned char Dir_Attrib = 0;
	unsigned long Size = 0;
	unsigned char a;

	printf("\n[Root Directory] \n\n");

	for (a = 0;a < 240;a++)
	{
		Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
//Clustervar 起始簇
		if (Clustervar == 0xffff){break;}

		if (Size<=0x0000FFFF)
		   {
		   	tmp = (Size & 0x0000FFFF);
		   }
		   else 
		   {
		    tmp=Size/1024;
		   }
 
		printf("Cluster = %4x DirA = %2x Size= %8d  FileName = ",Clustervar,Dir_Attrib,tmp);
		printf(Buffer);
		printf("\n");
	}

	printf("\n>Root Directory End!\n\n");
*/
	 
	
/*
	printf("find file ...\n\n");

	 

		unsigned int Clustervar;
	unsigned char Dir_Attrib = 0;
	unsigned long Size = 0;
 


	Clustervar = 0;//search in Root Directory
	if (fat_search_file("c.TXT",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
	
		{
		
		printf("the File Found!!\n\n");
		printf("FAT.TXT:\n\n");
		
		//Lese File und gibt es auf der seriellen Schnittstelle aus

 
        printf("\n");


		int b;
        int c;
		c=Size/512;


		for (b = 0;b<c+1;b++)//已读的Bock
			{
			fat_read_file (Clustervar,Buffer,b);

			for (tmp = 0;tmp<512;tmp++)
			   {
				printf ("%c",Buffer[tmp]);
				}
			}
		}
		
		
     else
	 {
	   printf("the File not Found!!\n\n");
	 }
	
	
	
	 
	printf("...");

*/
	while (1)
		{
		i=USART_Receive();
		USART_Transmit(i);
		if (i == '0')
		{
		printf("  sector  \n");
		
		
	    mmc_read_sector (0,Buffer);
		
		
	i=0;
	for (tmp = 0;tmp<512;tmp++)
		{
		 
					
		if (i == 16)
			{
			 i=0;
             printf("\n");
			}
			
		if (i == 0)
			{
			 
             printf("%04X:  ",tmp);
			}
			
		i++;
		
		printf("%02X ",Buffer[tmp]);
		
		};


		printf("\n");
	
		
		}
		
		
		
		if (i == '1')
		{
		printf("  sector  \n");
		
		
	    mmc_read_sector (1,Buffer);
		
		
	i=0;
	for (tmp = 0;tmp<512;tmp++)
		{
		 
					
		if (i == 16)
			{
			 i=0;
             printf("\n");
			}
			
		if (i == 0)
			{
			 
             printf("%04X:  ",tmp);
			}
			
		i++;
		
		printf("%02X ",Buffer[tmp]);
		
		};


		printf("\n");
	
		
		}
		
		
		
		}
	
	
	
		
		
	
	
	
	while (1)
		{
		 
		//USART_Transmit('as');
		i=USART_Receive();
		
 	    USART_Transmit(i);
		
		
		 
		}
return (1);
}


/*

    U08 i;
	int tmp;
    i=0;
	printf("\n");
	for (tmp = 0;tmp<512;tmp++)
		{
		if (i == 16)
			{
			 i=0;
             printf("\n");
			}
			
		if (i == 0)
			{
			 
             printf("%04X:  ",tmp);
			}
			
		i++;
		
		printf("%02X ",Buffer[tmp]);
		
		};

 printf("\n");

   for (;;);



*/


⌨️ 快捷键说明

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