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

📄 main.c

📁 Embest开发的nor flash读写工程
💻 C
字号:
/*********************************************************************************************
* File:	main.c
* Author:	embest
* Desc:	c main entry file for the IO port test
* History:	
*********************************************************************************************/

/*------------------------------------------------------------------------------------------*/
/*                                     includes files	                                    */
/*------------------------------------------------------------------------------------------*/
#include "2410lib.h"
#define BASE_FLASH	0x00000000
#define WriteFlash(addr,dat) (*(volatile unsigned short*)(addr*2)) = (unsigned short)dat 
#define ReadFlash(addr)		 (*(volatile unsigned short*)(addr*2))
#define AM29LV160DB_FLASH_MASK			0x001FFFFF
#define myaddr	0x001f0000
#define RamBase 0x30002000

static void Flash_Delay(void)
{
	volatile unsigned int i;
	
	// delay about 70 us
	//for(i=0; i<231; i++);
	for(i=0; i<21; i++);		
}


static void MyDelay(void)
{
	volatile unsigned int i;
	
	// delay about 70 us

	for(i=0; i<1000; i++);
	for(i=0; i<1000; i++);		
}


void WriteInfo(unsigned int addr,unsigned short data)
{
	unsigned int write_addr;
	volatile unsigned short* p;// = ((volatile unsigned short*)(addr + write_addr));
	short a;
	write_addr = (addr & AM29LV160DB_FLASH_MASK); 
	addr &= ~AM29LV160DB_FLASH_MASK;
	p = ((volatile unsigned short*)(addr + write_addr));
	(*((volatile unsigned short*)(addr+0x555*2))) = 0xAA;
	(*((volatile unsigned short*)(addr+0x2AA*2))) = 0x55;
	(*((volatile unsigned short*)(addr+0x555*2))) = 0xA0;
	//(*((volatile unsigned short*)(addr + write_addr))) = data;
	*p = data;
	MyDelay();
	


}

void UnlockByPass()
{
	(*((volatile unsigned short*)(0x555 << 1))) = 0xAA;
	(*((volatile unsigned short*)(0x2AA << 1))) = 0x55;
	(*((volatile unsigned short*)(0x555 << 1))) = 0x20;
}
int FastWrite(unsigned int addr,unsigned short data)
{
	int i;
	unsigned int write_addr;
	volatile unsigned short* p;// = ((volatile unsigned short*)(addr + write_addr));
	volatile unsigned short a;
	
	write_addr = (addr & AM29LV160DB_FLASH_MASK); 
	addr &= ~AM29LV160DB_FLASH_MASK;


	(*((volatile unsigned short*)(addr+0xAAA))) = 0xA0;
		p = (volatile unsigned short*)(addr+write_addr);

//	(*((volatile unsigned short*)(addr+write_addr))) = data;
	*p = data;
//	uart_printf("address is: %x\n",p);
//	uart_printf("data is: %d\n",*p);
	//MyDelay();
	for(i=0; i<1000; i++)
		Flash_Delay();  
	

/*		
	do
	{
		*p = data;
		a = *p;
		if(((a^data) & 0x0080) != 0)
			{
			uart_printf("result is:%d\n",1);
			return 1;
			}
		else
		{}
	}while(((a^data)&0x0020) == 0);

		
		if(((a^data) & 0x0080) != 0)
			{
		//	uart_printf("result is:%d\n",1);
			return 1;
			}
		else
			return 1;
*/
return 1;
}

void UnlockBypassReset()
{
	(*((volatile unsigned short*)(0x555 << 1))) = 0x90;
	(*((volatile unsigned short*)(0xAAA << 1))) = 0x00;
}

unsigned short ReadInfo(unsigned int addr)
{
	//return ReadFlash(addr);
	return (*((volatile unsigned short*)(BASE_FLASH+addr)));
	
	
}

unsigned int _RD(addr)
{
	return (*((volatile unsigned int*)(BASE_FLASH+addr)));
}
int _WAIT(unsigned int addr) 

{
      volatile int flashStatus,old;
      old=_RD(addr);
      
      while(1)
      {
        flashStatus=_RD(addr);
        if( (old&0x40) == (flashStatus&0x40))
            break;
if( flashStatus&0x20 ) //测试超时标志位DQ5

        {
            old=_RD(addr);
            flashStatus=_RD(addr);
            if( (old&0x40) == (flashStatus&0x40) ) return 1; //无翻转

            else return 0; //翻转

        }
        old=flashStatus;
    }
    return 1;
}

void RamTest()
{
	int base = RamBase;
	int* p = base;
	int* q = base;
	int i = 0;
	uart_printf("Begin check!\n");
	for(i = 0; i < 256; i++)
	{
		*p = p;
		p++;
	}
	p = q;
	for(i = 0; i < 256; i++)
	{
		if(*p != q)
		{
			uart_printf("There is error in %x\n",q);
			return;
		}
		p++;
		q++;
		
	}
	uart_printf("Checking end! No Error!\n");
}
void SectorErase(unsigned int addr)
{
	unsigned int sector_addr;
	int i;
	sector_addr = (addr & AM29LV160DB_FLASH_MASK);
	sector_addr >>= 1;
	sector_addr <<= 1;
	addr &= ~AM29LV160DB_FLASH_MASK;
	
	
	//	OS_ENTER_CRITICAL();
	(*((volatile unsigned short*)(addr+0x555*2))) = 0xAA;
	(*((volatile unsigned short*)(addr+0x2AA*2))) = 0x55;
	(*((volatile unsigned short*)(addr+0x555*2))) = 0x80;
	(*((volatile unsigned short*)(addr+0x555*2))) = 0xAA;
	(*((volatile unsigned short*)(addr+0x2AA*2))) = 0x55;
	(*((volatile unsigned short*)(addr+sector_addr))) = 0x30;
	// delay about 700 ms 
	for(i=0; i<10000; i++)
		Flash_Delay();

	//	OS_EXIT_CRITICAL();
}
void Main(int argc,short **argv)
{
	unsigned int i = 0; 
	unsigned int temp = (unsigned int)myaddr;
	int size = 256;
	unsigned short data[size];
	unsigned short test[size];
	unsigned int addr;
	int d;
	
	sys_init(); 			

		
	uart_printf("Begin to write\n");
	for(i = 0; i < size; i++)
		{
			
			data[i] = (short)i;
			//uart_printf("%d\n",data[i]);
		}


	temp = (unsigned int)myaddr;
	SectorErase((unsigned int)myaddr);
	uart_printf("End Erase\n"); 
		for(i = 0; i < size; i++)
		{
			test[i] = ReadInfo(temp);
			//uart_printf("%d ",test[i]);
			//if(i % 16 == 0)
			//uart_printf("\n");
			temp += 2;
		}

	UnlockByPass();
	temp = (unsigned int)myaddr;
	for(i = 0; i < size; i++)
		{
			
		//	WriteInfo(temp,(short)data[i]);
			if((d = FastWrite(temp+i*2,(short)data[i])) == 0)
			{
				uart_printf("%d\n",data[i]);
				UnlockBypassReset();
				uart_printf("Error!\n");
				return 0;
			}

		}
	UnlockBypassReset();

	temp = (unsigned int)myaddr;
	addr = temp;
	addr &= ~AM29LV160DB_FLASH_MASK;
	uart_printf("Begin to read\n");
	for(i = 0; i < size; i++)
		{
			test[i] = ReadInfo(temp+i*2);
			uart_printf("%d ",test[i]);
			if(i % 16 == 0)
			uart_printf("\n");
			
		//	uart_printf("%x\n",data[i]);
		}
	uart_printf("End Fast write!\n"); 
	temp = (unsigned int)myaddr;
	SectorErase((unsigned int)myaddr);
	uart_printf("End Erase\n"); 
		for(i = 0; i < size; i++)
		{
			test[i] = ReadInfo(temp);
			//uart_printf("%d ",test[i]);
			//if(i % 16 == 0)
			//uart_printf("\n");
			temp += 2;
		}
	temp = (unsigned int)myaddr;
	for(i = 0; i < size; i++)
		{
			
		//	WriteInfo(temp,(short)data[i]);
			WriteInfo(temp+i*2,(short)data[i]);
		
		}
	uart_printf("End slow write!\n");
	temp = (unsigned int)myaddr;
	addr = temp;
	addr &= ~AM29LV160DB_FLASH_MASK;
	uart_printf("Begin to read\n");
	for(i = 0; i < size; i++)
		{
			test[i] = ReadInfo(temp+i*2);
			uart_printf("%d ",test[i]);
			if(i % 16 == 0)
			uart_printf("\n");
			
		//	uart_printf("%x\n",data[i]);
		} 	
	uart_printf("\n");
		RamTest();
		
		
}
/*********************************************************************************************
* name:		main
* func:		c code entry
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
/*void Main(int argc,short **argv)
{
	sys_init();        /* Initial s3c2410's Clock, MMU, Interrupt,Port and UART */

	// user interface 

	
/*	while(1)
	{
		led_test();
	}
}*/

⌨️ 快捷键说明

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