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

📄 main.c

📁 BF561外挂NANDFLASH
💻 C
字号:


#include "main.h"
#include "stdio.h"
#include "ccblkfn.h"
#include "sysreg.h"
#include "bf5xx.h"


// set up DMA descriptors (one for each frame, then repeat)
// small descriptor model, only start address needs to be fetched

/*tDMA_descriptor DMA_PPI0_first = 	{&DMA_PPI0_second, sFrame0};
tDMA_descriptor DMA_PPI0_second = 	{&DMA_PPI0_third , sFrame1};
tDMA_descriptor DMA_PPI0_third = 	{&DMA_PPI0_fourth, sFrame2};
tDMA_descriptor DMA_PPI0_fourth = 	{&DMA_PPI0_first , sFrame3};

extern volatile char p=0,b;


bool write_page(unsigned int Page_Address,unsigned char *Buffer);
bool read_page(unsigned int Page_Address,unsigned char *Buffer);
bool Block_Erase(unsigned int Block_Address);
void Create_Invalid_Blocks_Table(void);
void Reset_NAND(void);
void delay(unsigned int DelayValue);
bool Read_Chip_ID(void);

unsigned char Verify_Table[512];
unsigned char Test_Data_Table[512];
unsigned char Read_Table[512];

#define DELAY_SIZE 0x00fffffff
//long sum,t,i;
//int ave,l1=0x60,l2=0x80,lp=0x70;
//int DGC=0x20;
//int AGC=0x00;
volatile int current_in_Frame  = -1;		// 0, 1, 2 or 3  ... indicates the last frame that was received COMPLETELY
//short c,d1,d2;
bool Set_PACK32 = false;
bool Set_Entire_Field = false;
bool ISPAL=1;
//int *r1,*r2;
// User program
void Setup_FlashFlags()
{

    *pFIO2_DIR      = 0x0EFF;				// PF32-47 Outputs (LEDs)   
    *pFIO2_INEN		= 0x0100;
}


void Init_Flash()
{	
	*pEBIU_AMBCTL0	= 0x7bb07bb0;
	*pEBIU_AMBCTL1	= 0xfff0fff0;
	*pEBIU_AMGCTL	= 0x000f;
	Setup_FlashFlags();
	Reset_NAND();
	Read_Chip_ID();	

}

void main() {

	// unblock Core B if dual core operation is desired	
#ifndef RUN_ON_SINGLE_CORE
	*pSICA_SYSCR &= 0xFFDF; // clear bit 5 to unlock  
#endif

	// set Clocks
	Set_PLL( (short)(CORECLK/CLKIN), (short)(CORECLK/SYSCLK));			// sets Core and System Clocks to the values defined in system.h 

	// initialise SDRAM
	InitSDRAM();
	
	*pTC_PER = 0x0770;			// set DMA traffic control register to favour unidirectional transfers to SDRAM

	// initialise Video Encoder ADV7179
	//Reset_ADV7171();
	//if (!Init_ADV7171(ISPAL))
	//return false;

	// initialise Video Decoder ADV7183
	//Reset_tvp5150();
	//if (!Init_tvp5150(ISPAL))
	//return false;
	//if (!I2C_Read5150(&r, 0x07)) return false;
	
	// initialise PPI0 and associated DMA channel for Video IN
	current_in_Frame  = -1;				// no frames received yet
	semaphore_frames_received = false;	// do not start output stream yet

	Set_Entire_Field = false;
#ifdef ENTIRE_FIELD_MODE
	Set_Entire_Field = true;
#endif

	Set_PACK32 = false;
#ifdef PACK_32
	Set_PACK32 = true;
#endif
	
	InitPPI0(Set_Entire_Field, Set_PACK32, &DMA_PPI0_first, PIXEL_PER_LINE, LINES_PER_FRAME);
	

		
	// initialise Interrupts
	InitInterrupts_coreA();
	
	
	// enable transfers
	*pDMA1_0_CONFIG |= DMAEN;
	ssync();
	*pPPI0_CONTROL |= PORT_EN;
	
	ssync();

	//while(!p){}
	
	
	
		Init_TEST_DATA_BUFFER();
     	Init_Flash();
	    int count=0;
		int Block,Page,i,j;	
	    for(Block=1;Block<34;Block++)
	    {
		Block_Erase(Block);
		for(Page=0;Page<32;Page++)
		{	
			for(j = 0;j<512;j++)
			{
				Test_Data_Table[j] = j+Page;//sFrame0[count++];
			}
			write_page(Block*32+Page,Test_Data_Table);
			udelay(0xfff);
			read_page(Block*32+Page,Verify_Table);
			for(i=0;i<512;i++)
			{	
				if(Test_Data_Table[i] != Verify_Table[i])
				{
					printf("ERORR! Block is %x, page is %x\n",Block,Page);
					printf("ERORR! Test_Data_Table is %x, Verify_Table is %x\n",Test_Data_Table[i],Verify_Table[i]);
				}	
				else
				sFrame3[count++]=Verify_Table[i];		
			}
			
		}
		
	}
	printf("TEST 100 Bank is OK!\n");
	semaphore_frames_received = true;

	

	
	while(1)
	{idle();
	}
	
}		// main*/


unsigned char Verify_Table[512];
unsigned char Test_Data_Table[512];
unsigned char Read_Table[512];


unsigned int Blockn_Address = 0;
unsigned short Pagen_address = 0;
bool write_page(unsigned int Page_Address,unsigned char *Buffer);
bool read_page(unsigned int Page_Address,unsigned char *Buffer);
bool Block_Erase(unsigned int Block_Address);
void Create_Invalid_Blocks_Table(void);
void Reset_NAND(void);
void delay(unsigned int DelayValue);
bool Read_Chip_ID(void);

/****************************************************************************
* 名称 : RW_Test
* 功能 : 校验写入数据的正确性,将前100页写入数据,读出做比较
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
RW_Test()
{ 
	int Block,Page,i,j;	
	for(Block=1;Block<100;Block++)
	{
		Block_Erase(Block);
		for(Page=0;Page<32;Page++)
		{	
			for(j = 0;j<512;j++)
			{
				Test_Data_Table[j] = j+Page;
			}
			write_page(Block*32+Page,Test_Data_Table);
			udelay(0xfff);
			read_page(Block*32+Page,Verify_Table);
			for(i=0;i<512;i++)
			{	
				if(Test_Data_Table[i] != Verify_Table[i])
				{
					printf("ERORR! Block is %x, page is %x\n",Block,Page);
					printf("ERORR! Test_Data_Table is %x, Verify_Table is %x\n",Test_Data_Table[i],Verify_Table[i]);
				}			
			}
			
		}
		
	}
	printf("TEST 100 Bank is OK!\n");
}

void Setup_FlashFlags()
{

    *pFIO2_DIR      = 0x0EFF;				// PF32-47 Outputs (LEDs)   
    *pFIO2_INEN		= 0x0100;
}

void Init_Flash()
{	
	Init_EBIU();
	Setup_FlashFlags();
	Reset_NAND();
	Read_Chip_ID();	

}


void main(void)
{
	Set_PLL( (short)(CORECLK/CLKIN), (short)(CORECLK/SYSCLK));	
	int Block,Page,i;
	Init_TEST_DATA_BUFFER();
	Init_Flash();
	RW_Test();
	while(1){
		  
	};
}

⌨️ 快捷键说明

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