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

📄 nandflash.c

📁 WINCE4.25.0下的NANDFLASH驱动2k大页面
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <cdefBF561.h>
#include "nandflash.h"

int pf_direction(int pf, int pf_direction)
{
    volatile unsigned short int *dirc_register;
    if(pf_direction != 0 && pf_direction != 1) return 0;
    if(pf>=0&&pf<=47)
    	{
    	 if(pf<=15&&pf>=0) dirc_register = FIO0_DIR; 
    	 else if(pf<=31&&pf>=16) { dirc_register = FIO1_DIR; pf -= 16;}
    	 else if(pf<=47&&pf>=32) { dirc_register = FIO2_DIR;	pf -= 32;}
 		 
   		if(pf_direction) { *dirc_register |= (0x1<<pf);return 1;}
   		else {*dirc_register &= (0xffff - (0x1<<pf));return 1;}	
   		}
    
    else return 0; 
   
}

int pf_in_enable(int pf, int pf_direction)
{
	volatile unsigned short int *dirc_register;
    if(pf_direction != 0 && pf_direction != 1) return 0;
    if(pf>=0&&pf<=47)
    	{
    	 if(pf<=15&&pf>=0) dirc_register = FIO0_INEN; 
    	 else if(pf<=31&&pf>=16) { dirc_register = FIO1_INEN; pf -= 16;}
    	 else if(pf<=47&&pf>=32) { dirc_register = FIO2_INEN;	pf -= 32;}
 		 
   		if(pf_direction) { *dirc_register |= (0x1<<pf);return 1;}
   		else {*dirc_register &= (0xffff - (0x1<<pf));return 1;}	
   		}
    
    else return 0; 
}

int data_in_enable(int dir)
{
    if(dir)
    	{
   			if( !pf_in_enable(d0,pf_out)) return 0;
   			if( !pf_in_enable(d1,pf_out)) return 0;
   			if( !pf_in_enable(d2,pf_out)) return 0;
   			if( !pf_in_enable(d3,pf_out)) return 0;
   			if( !pf_in_enable(d4,pf_out)) return 0;
   			if( !pf_in_enable(d5,pf_out)) return 0;
   			if( !pf_in_enable(d6,pf_out)) return 0;
   			if( !pf_in_enable(d7,pf_out)) return 0;
    	}
    else
    	{
    		if( !pf_in_enable(d0,pf_in)) return 0;
   			if( !pf_in_enable(d1,pf_in)) return 0;
   			if( !pf_in_enable(d2,pf_in)) return 0;
   			if( !pf_in_enable(d3,pf_in)) return 0;
   			if( !pf_in_enable(d4,pf_in)) return 0;
   			if( !pf_in_enable(d5,pf_in)) return 0;
   			if( !pf_in_enable(d6,pf_in)) return 0;
   			if( !pf_in_enable(d7,pf_in)) return 0;
    	}
}

int pf_outset(int pf, int setdata)
{
     volatile unsigned short int *tempregister;
    if(setdata != 0 && setdata != 1) return 0;
    if(pf>=0&&pf<=47)
    	{
    	 if(pf<=15&&pf>=0) tempregister = FIO0_FLAG_D; 
    	 else if(pf<=31&&pf>=16) { tempregister = FIO1_FLAG_D; pf -= 16;}
    	 else if(pf<=47&&pf>=32) { tempregister = FIO2_FLAG_D;	pf -= 32;}
 		 
   		if(setdata) { *tempregister |= (0x1<<pf);return 1;}
   		else {*tempregister &= (0xffff - (0x1<<pf));return 1;}
    	
   		}
    
    else return 0; 
   
}



int pf_set(int pf)
{
    volatile unsigned short int *tempregister;
    if(pf>=0&&pf<=47)
    	{
    	 if(pf<=15&&pf>=0) {tempregister = FIO0_FLAG_S;
    	 					       *tempregister |= (0x1<<pf);
   									//++
   									delay(2);
   									*tempregister &=0x0;
   									tempregister = FIO0_FLAG_C;
   									*tempregister &=0x0;
   									tempregister = FIO0_FLAG_T;
   									*tempregister &=0x0;
   									} 
    	 else if(pf<=31&&pf>=16) { tempregister = FIO1_FLAG_S;pf -= 16;
    	 							*tempregister |= (0x1<<pf);
   									//++
   									delay(2);
   									*tempregister &=0x0;
   									tempregister = FIO1_FLAG_C;
   									*tempregister &=0x0;
   									tempregister = FIO1_FLAG_T;
   									*tempregister &=0x0;
   									}
    	 else if(pf<=47&&pf>=32) { tempregister = FIO2_FLAG_S;	pf -= 32;
    	 						   *tempregister |= (0x1<<pf);
   									//++
   									delay(2);
   									*tempregister &=0x0;
   									tempregister = FIO2_FLAG_C;
   									*tempregister &=0x0;
   									tempregister = FIO2_FLAG_T;
   									*tempregister &=0x0;
   									}
 
  //  		*tempregister |= (0x1<<pf);
   	
   		}
    
    else return 0; 
   
}


int pf_clear(int pf)
{
     volatile unsigned short int *tempregister;
    if(pf>=0&&pf<=47)
    	{
    	 if(pf<=15&&pf>=0) {tempregister = FIO0_FLAG_C;
    	 					*tempregister |= (0x1<<pf);
   							//++
   							delay(2);
   							*tempregister &=0x0;
   							tempregister = FIO0_FLAG_S;
   							*tempregister &=0x0;
   							tempregister = FIO0_FLAG_T;
   							*tempregister &=0x0;
    	 					}
    	 					 
    	 else if(pf<=31&&pf>=16) { tempregister = FIO1_FLAG_C; pf -= 16;
    	 							*tempregister |= (0x1<<pf);
   									//++
   									delay(2);
   									*tempregister &=0x0;
   									tempregister = FIO1_FLAG_S;
   									*tempregister &=0x0;
   									tempregister = FIO1_FLAG_T;
   									*tempregister &=0x0;
   									}
    	 else if(pf<=47&&pf>=32) { tempregister = FIO2_FLAG_C;	pf -= 32;
    	 							*tempregister |= (0x1<<pf);
   									//++
   									delay(2);
   									*tempregister &=0x0;
   									tempregister = FIO2_FLAG_S;
   									*tempregister &=0x0;
   									tempregister = FIO2_FLAG_T;
   									*tempregister &=0x0;
   									}
 		 
 //  		*tempregister |= (0x1<<pf);
   		}
    
    else return 0; 
   
}


void delay(int time)
{	if(time <= 0) return 0;
	int i;
    for(i=0;i<=time;i++) {;}
    
}

bool nandflash_we_on()
{
     if(pf_outset(we,setdata0)) return true;
     else 
     	{
     	    printf("write enable wrong!!!!\n");
     	    return false;
     	}
}

bool nandflash_we_off()
{
     	//pf_set(we);
     if(pf_outset(we,setdata1)) return true;
     else
     	{
     		printf("write unenable wrong!!!!\n");
     		return false;
     	}
}

bool nandflash_cle_on()
{
    if(pf_outset(cle,setdata1)) return true;
    else
    	{
    		printf("command enable wrong!!!!\n");
    		return false;
    	}
}


bool nandflash_cle_off()
{
	if(pf_outset(cle,setdata0)) return true;
	else 
		{
			printf("command unenable wrong!!!!\n");
			return false;
		}
}


bool nandflash_ale_on()
{
    if(pf_outset(ale,setdata1)) return true;
    else
    	{
    		printf("address enable wrong!!!\n");
    		return false;
    	}
}


bool nandflash_ale_off()
{
    if(pf_outset(ale,setdata0)) return true;
    else
    	{
    		printf("address uneable wrong!!!!\n");
    		return false;
    	}
}

bool nandflash_re_on()
{
    if(pf_outset(re,setdata0)) return true;
    else
    	{
    		printf("read enable wrong!!!!\n");
    		return false;
    	}
}

bool nandflash_re_off()
{
    if(pf_outset(re,setdata1)) return true;
    else
    	{
    		printf("read unenable wrong!!!!\n");
    		return false;
    	}
}


bool nandflash_ce_on()
{
    if(pf_outset(ce,setdata0)) return true;
    else
    	{
    		printf("ce enable wrong!!!!\n");
    		return false;
    	}
}

bool nandflash_ce_off()
{
    if(pf_outset(ce,setdata1))
    	return true;
    else
    	{
    	    printf("ce unenable wrong!!!!\n"); 
    		return false;
    	}
}
/*
bool nandflash_rb_on()
{
	pf_outset(rb,setdata1);
}
bool nandflash_rb_off()
{
	pf_outset(rb,setdata0);
}
*/

void data_thran_dir(int set_dir)
{
	volatile unsigned short int *dirc_register;
    dirc_register = FIO0_DIR; 
    if(set_dir == 1 )
    	{
    		*dirc_register |= 0xFFFF;
		}
    if(set_dir == 0 )
    	{
    	    *dirc_register &= 0xFF00;
    	}	
}   		
    


int nandflash_init()
{	  
   if( !pf_direction(we,pf_out)) return 0;
   if( !pf_direction(re,pf_out)) return 0;
   if( !pf_direction(ale,pf_out)) return 0;
   if( !pf_direction(cle,pf_out)) return 0;
   if( !pf_direction(rb,pf_in)) return 0;
   if( !pf_direction(ce,pf_out)) return 0;
   if( !pf_in_enable(rb,pf_out)) return 0;

   return 1;
  
}

void create_initial_invalid_block_table()
{
	
    unsigned int Block_Address = 0;   //Block_Address 为页地址 Page_Address 为列地址
    int block_count = 0; //first_block;
    int bad_block_count = 0;
    int block_num;
    //int num_bad_block;
 
	struct 	Invalid_Block_Table bad_blocks;
   	struct Invalid_Block * list_table;
   	list_table = bad_blocks.value.next;	
   	for(block_num = 2048; block_num != 0 ; block_num--)
   	{

⌨️ 快捷键说明

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