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

📄 flash.c

📁 这是EP7312开发板的一些测试与开发的源代码
💻 C
字号:
#include "math.h"

#define FLASH_BASE	0x00000000
#define BOOTLEN		0x8000

#define FLASH_555		(*(volatile unsigned long *)(0x1554 + FLASH_BASE))
#define FLASH_2AA		(*(volatile unsigned long *)(0x0AA8 + FLASH_BASE))
#define FLASH_BASEP	(*(volatile unsigned long *)(FLASH_BASE))
#define FLASH_MANU	(*(volatile unsigned long *)(0x0000 + FLASH_BASE))
#define FLASH_CODE	(*(volatile unsigned long *)(0x0004 + FLASH_BASE))

void erase_sector(unsigned long addr);
int  memtest();
int  flashtest();
void program_sector(unsigned long *dst, unsigned long *src, unsigned long len);
void InitFlash();
int Data_polling(unsigned long *addr, unsigned long *data);

//extern unsigned long code[];

const unsigned long topSize[] = {
	0x0,
	0x10000,
	0x20000
};

const unsigned long bottomSize[] = {
	0x0,
	0x4000,
	0x6000,
	0x8000,
	0x10000,
	0x20000
};

int CMAIN()
{
	int i = 0;
	int t = 0;
	int  mflag,fflag;
 	init_serial();
         mflag=memtest();
         fflag=flashtest();
	if(mflag||fflag)
	{
	 puts("\n\nTest Error\n");
	 while(1);
	}
	  puts("\n\nTest Ok\n");
         while(1);

}




//function: Memory test 
int memtest()
{
	
	unsigned char	s[10];
	unsigned long	counter;				
	unsigned  long	getdata;
	unsigned  long    dbuffer1;
	unsigned  long	dbuffer2;
	unsigned  long 	testdata=0;
	volatile unsigned long *p= (unsigned long *)0xc0000000;

	puts("\n\nMemtest Start\n");
	puts("Mem Write and Read Data\n");
	for(counter=0;counter<=0x3fffff;counter++)		//write data to memory
	{
		*p=testdata;
		getdata=*p;
		if(getdata!=testdata)
                  {
		   puts("\nMemtest Error!\n");
	 	   sprintf(s,"x%x",p);
	 	   puts("\nVerify Error The Error Address=");
	 	   puts(s);
	 	   sprintf(s,"x%x",testdata);
	 	   puts("\nThe Correct Data              =");
	 	   puts(s);
	 	   sprintf(s,"x%x",getdata);
	 	   puts("\nThe Read Data                 =");
	 	   puts(s);
		   dbuffer1=getdata&0x0000ffff;
		   dbuffer2=testdata&0x0000ffff;
		   if(dbuffer1!=dbuffer2)
		   {
                        puts("\nThe Error Chip is U3\n");
                      }
		   dbuffer1=getdata&0xffff0000;
		   dbuffer2=testdata&0xffff0000;
		   if(dbuffer1!=dbuffer2)
		   {
	               puts("\nThe Error Chip is U4\n");
		    }	
	 	   return(1);
  	          }
		p=p+1;
		testdata=testdata+0x00010001;
		if((fmod(counter,0xfff))==0)
		{
		   	uart_putc('.');
		}

	 }
         puts("\nMemtest Ok\n");				//data verify correct
	 return(0);

}	



//flash test code 
int flashtest()
{
	
	unsigned char   s[10];					//printf buffer
	unsigned long   dbuffer1;
	unsigned long	dbuffer2;
	unsigned  long	dataq;
	unsigned long   testdata;
	unsigned long   getdata;
	unsigned int    counter;
	volatile unsigned long   delayi;	
	volatile unsigned long *P=(unsigned long*)0x00;
	
	*P=0x00f000f0;
	puts("\n\nFlash Test Star \n");	
	puts("Flash Begin Erase\n");				//erase flash
	FLASH_555	= 0x00aa00aa;
	FLASH_2AA	= 0x00550055;
	FLASH_555	= 0x00800080;
	FLASH_555	= 0x00aa00aa;
	FLASH_2AA	= 0x00550055;
	FLASH_555	= 0x00100010;
	for (;;)
	{
	 dataq            =*P;
	 dataq            =dataq&0x00800080;
	 if(dataq)		          			//polling DQ7
	 {
		break;						//if DQ7=1 quit
	 }
	
	}

	puts("Flash Erase over\n");
         puts("Wait for 15s\n");
	P=(unsigned long*)0x00;					//Reset flash
	for(delayi=0;delayi<=10000000;delayi++)
	    {;}	
						
								//program flash	
	puts("Flash Program Test\n");	
	testdata = 0;
	for(counter=0;counter<=0xfffff;counter++)
	{
          FLASH_555 = 0x00aa00aa;
	  FLASH_2AA = 0x00550055;
	  FLASH_555 = 0x00a000a0;
	  *P=testdata;
	  for(;;)							//Wait for data write
	  {								
	     getdata=*P;

 
	     if((getdata&(0x00800080))==(testdata&(0x00800080))) 	//polling DQ7
	       break;			  		 	        //write ok
	
              if((getdata&(0x00200020))==0x00200020)		 	//polling  DQ5
	     {
	       getdata=*P;
	       if((getdata&(0x00800080))==(testdata&(0x00800080)))
	         break;      						//write ok
	       else
	       {
	         puts("\nFlash Write Fail\n");
		 puts("\nThe Fail Address=");
	         sprintf(s,"x%x",P);
	         puts(s);
	         return(1);						//Write fail
	       }
	      }
            }
	   
	   getdata=*P;
	   if(getdata!=testdata)
	   {
	     sprintf(s,"x%x",P);
	     puts("\nVerify Error The Error Address=");
	     puts(s);
	     sprintf(s,"x%x",testdata);
	     puts("\nThe Correct Data              =");
	     puts(s);
	     sprintf(s,"x%x",getdata);
	     puts("\nThe Read Data                 =");
	     puts(s);
	     dbuffer1=getdata&0x0000ffff;
	     dbuffer2=testdata&0x0000ffff;
	     if(dbuffer1!=dbuffer2)
	      {
               puts("\nThe Error Chip is U5\n");
              }
	     dbuffer1=getdata&0xffff0000;
	     dbuffer2=testdata&0xffff0000;
	     if(dbuffer1!=dbuffer2)
	      {
	        puts("\nThe Error Chip is U6\n");
	      }
	     return(1);	
	    }

	   testdata=testdata+0x00010001;				//Write next data
	   P=P+1;
            if((fmod(counter,0x3ff))==0)
	    {
		uart_putc('.');
	    }
	}
	puts("\nFlash Test Ok\n");
	return(0);
    							               //flash read test


        /*P=(unsigned long *)0x0000000;
	testdata= 0;
	puts("\nFlash Read Data Test\n");
	judge=0;
	for(counter=0;counter<=0xfffff;counter++)
	{
	  getdata=*P;
	  if(getdata!=testdata)
	  {
             judge=1;
	     break;
	   }
	
  	  testdata=testdata+0x00010001;
	  P=P+1;
	  if((fmod(counter,0x3ff))==0)
	    {
		uart_putc('.');
	    }

	}
	if(judge)
	{
	 puts("Flash Test Error");
	 sprintf(s,"x%x",P);
	 puts("\nVerify Error The Error Address=");
	 puts(s);
	 sprintf(s,"x%x",testdata);
	 puts("\nThe Correct Data              =");
	 puts(s);
	 sprintf(s,"x%x",getdata);
	 puts("\nThe Read Data                 =");
	 puts(s);
	 return(1);	
	}
	else
        {
	puts("\nFlash Verify Data Ok\n");
	return(0);
	}*/
}

⌨️ 快捷键说明

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