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

📄 flashcc.c

📁 FLASH芯片K9F2808的读写
💻 C
字号:
#include "include.h"
uchar hantemp[1005];

void flash_read(uchar column,uint page,uint length,uchar fors)  //fors 表示是第一或者第二区段
{
	uchar temp,temp1;
    	uint num;
	DDRA  = 0xff;  //PORTA 变成输出口
	                          
	dir_1h;   //设置 UC1 方向为写  
	 NOP();           
	oe_1l;    //设置 UC1 输出使能    
	  NOP();       
	dir_2h;   //设置 UC2 方向为写 
	  NOP();                      
	oe_2l;    //设置 UC2 输出使能           
	    NOP();            
	rd_fh;     //设置 FLASH 读为高  
	    NOP();       
	ale_fl;    //ALE_4245 = 0 ALE置低
	   NOP();                          
	we_fl;     //WE_4245 = 0	WE置低 
	   NOP();                          
	cle_fh;    //CLE_4245 = 1 CLE置高
	    NOP();                         
	PORTA = fors;   //命令字,'00'从前面为读 '01'从后面读
	   NOP();                          
	we_fh;     //WE_4245 = 1	WE置高
	    NOP();                         
	cle_fl;    //CLE_4245 = 0	CLE置低  
	    NOP();                         
	ale_fh;      //ALE_4245 = 1	ALE置高 
	    NOP();                        
	we_fl;     //WE_4245 = 0	WE置低 
	    NOP();                         
	PORTA = column;     //P0 = column		地址0-7位
	    NOP();                        
	we_fh;      //WE_4245 = 1	WE置高 
	    NOP();                        
	we_fl;    //WE_4245 = 0	WE置低 
	    NOP();                         
	temp = (uchar)((page>>1) & 0x00ff);
	NOP();
	PORTA = temp;   //P0 = temp	地址8-15位
	    NOP();                         
	we_fh;   //WE_4245 = 1	WE置高   
	    NOP();                         
	we_fl;    //WE_4245 = 0	WE置低
	   NOP();                         
	temp = (uchar)((page>>9) & 0x00ff);
	 NOP();
	PORTA = temp;   //P0 = temp	地址16-23位
	   NOP();                          
	we_fh;    //WE_4245 = 1	WE置高 
	    NOP();                         
	ale_fl;   //ALE_4245 = 0	 ALE置低  
	   NOP();                          
	for(temp = 0;temp < 50;temp++)
		NOP();
	
	dir_1l;   //设置UC1 方向为读
	NOP();
	PORTA = 0XFF;
	NOP();
	DDRA  = 0x00;  //PORTA 变成输入口
	NOP();
    for(num = 1;num <= length; num++)
    {
		rd_fl;     //读为低
		NOP();NOP();//加两个NOP 才能满足,64太快了
		temp = PINA;
		NOP();
		rd_fh;     //读为高  	
	   // hantemp[num-1] = temp;
		uart1_txd(temp);
		
        
    }
	oe_1h;//断开数据总线
 }
 
 
uchar flash_write(uchar col,uint page,uchar *Ptr,uint length,uchar fors)
{
    uchar COMP;
	uint  temp1=0;
	uint change;
    uint  i;
	change=page;
	temp1=0;
   while(temp1<length)
   {
	 DDRA  = 0xff;  //PORTA 变成输出口
	 dir_1h;   //设置 UC1 方向为写  
	 NOP();           
	 oe_1l;    //设置 UC1 输出使能    
	 NOP();  
	 dir_2h;   //设置 UC2 方向为写 
     NOP();                      
	 oe_2l;    //设置 UC2 输出使能  
	 rd_fh;     //设置 FLASH 读为高  
	 NOP();       
	 ale_fl;  
	 NOP();                          
	 we_fl;    
	 NOP();                          
	 cle_fh;    
	 NOP();                     
     PORTA = fors; NOP();
	 we_fh;  NOP();
	 we_fl; NOP();
     PORTA = 0x80; NOP();
     we_fh;  NOP();NOP();  
     we_fl;
	 cle_fl;  NOP();  NOP();    //CLE_4245 = 0	CLE置低  
	 ale_fh; NOP(); NOP();// ALE_4245 = 1;	//ALE置高
	 
	 // if(temp1>527)
	 //   change=page+(temp1>>9);
	 // else
	 //   change=page;
	 
	 PORTA= col;	//0-7位
	 NOP();   NOP();
	 we_fh;// WE_4245 = 1;	//WE置高
     NOP();  NOP(); NOP(); 
	 we_fl; //WE_4245 = 0;	//WE置低
	 NOP();// WE_4245 = 0;	//WE置低
	 NOP(); 
	 //PORTA = (uchar)(change& 0x00ff);	//地址8-15位
	 // PORTA =(uchar)((change>>1) & 0x00ff);//地址16-23位
	 COMP = (uchar)((change>>1) & 0x00ff);
	 
	 PORTA =COMP;
	 NOP();  NOP(); 
	 we_fh;// WE_4245 = 1;	//WE置高
     NOP(); NOP(); 
	 we_fl; // WE_4245 = 0;	//WE置低
	 NOP(); NOP(); 
	 COMP =(uchar)((change>>9) & 0x00ff);//地址16-23位
	 
	
	 PORTA =COMP;
	 we_fh; NOP(); NOP();//  WE_4245 = 1;	//WE置高
     we_fl;
	 ale_fl;// ALE_4245 = 0;	//ALE置低
	 NOP(); NOP(); 
	
	for(i=0;(i<528)&&(temp1<length);i++)
	  {
		  we_fl;//  WE_4245 = 0;NOP(); 
		  NOP(); NOP();  
          PORTA =*Ptr;
		  NOP(); NOP(); 
		  we_fh; // WE_4245 = 1;
		  temp1++;
		  Ptr++; 
		  
	  }
	
	  change+=0x0002;
	we_fl;// WE_4245 = 0;
	NOP(); NOP(); 
    ale_fl;//ALE_4245 = 0;
	NOP(); NOP(); 
	cle_fh;//CLE_4245 = 1;
	NOP(); NOP(); 
	we_fl;// WE_4245 =0;
	NOP(); NOP(); 
	PORTA =0x10;
	NOP(); NOP(); 
	we_fh; // WE_4245 =1;
    NOP(); NOP(); NOP(); 
	 //we_fl;
	  for(i=0;i<10000;i++)
	  {
		  NOP();     
	  }
     dir_2h;   //设置 UC2 方向为写 
	 NOP();                      
	 oe_2l;    //设置 UC2 输出使能  
     cle_fh;// CLE_4245 = 1;
	 NOP();  NOP();
	 we_fl;//WE_4245 = 0 ;
	 NOP();  NOP();
	 PORTA =0x70;
	 NOP();  NOP();
     we_fh;// WE_4245 = 1;
     NOP();  NOP();
	 we_fl;
     cle_fl;//CLE_4245 = 0;
     NOP(); NOP(); 
	 rd_fh;     //读为高  	RE_4245 = 1;
	 DDRA=0X00;
	 PORTA=0XFF;
	 dir_1l;   //设置UC1 方向为读
	 NOP();  NOP();  
     rd_fl;   //RE_4245 = 0;	
	 NOP();  NOP();
     COMP=PINA;
     i=0;
	 rd_fh; 
	 
	 if(COMP&0x01!=0)
	 {oe_1h;//断开数据总线
		  return 1;
	 }
	// else
	// {
	//	  return 0;//写成功 返回 0
	// }
	 
  }//while(temp1!=length)
oe_1h;//断开数据总线
return 0;
}

void flash_id(void)
{uchar temp,COMP;
  uint  i;
  DDRA  = 0xff;  //PORTA 变成输出口
	 dir_1h;   //设置 UC1 方向为写  
	 NOP();           
	 oe_1l;    //设置 UC1 输出使能    
	  NOP();  
	dir_2h;   //设置 UC2 方向为写 
    NOP();                      
	oe_2l;    //设置 UC2 输出使能  
	//while(1);
	 rd_fh;   NOP(); NOP();  
	ale_fl;    //ALE_4245 = 0 ALE置低
	   NOP();    NOP();                       
	we_fl;     //WE_4245 = 0	WE置低 
	   NOP();   NOP();   
	    rd_fh;     //设置 FLASH 读为高  
	    NOP();                       
	cle_fh;    //CLE_4245 = 1 CLE置高
	    NOP();   NOP();     

	PORTA = 0x90;NOP(); NOP();
	//while(1);
we_fh;  NOP();NOP();
 cle_fl; NOP();NOP(); 
	 ale_fh;NOP();NOP(); NOP();
	 we_fl; NOP();NOP();
	 NOP();  
	//temp = (uchar)((block<<5)&0x00ff);//取低三位 a14---a16
	temp=0;
	PORTA=temp;		//地址8-15位 
	we_fh;  NOP();NOP();//WE_4245 = 1;	//WE置高
	ale_fl;    //ALE_4245 = 0 ALE置低
	   NOP();    NOP();  
for( i=0;i<10000;i++)
	{ NOP(); 
	   //延时3ms以上
    }
 dir_1l; // RW_4245_1 = 0;	//设置第一个4245方向为读
	//OE_4245_1 = 0;  //第一个4245使能输出
	DDRA=0X00;
	PORTA=0XFF;
	 rd_fh;NOP(); NOP();  //RE_4245 = 1 ;
	
	rd_fl;NOP(); NOP();
	
	COMP=PINA;
	 NOP();  NOP();
	  if(debug) 
	 uart1_txd(COMP);//读成功返回 0XEC
	 rd_fh;NOP(); NOP(); //RE_4245 = 1 ;
	
	rd_fl;NOP(); NOP();NOP();
	
	COMP=PINA;
	 NOP();  
	 if(debug)
	 uart1_txd(COMP);//读成功返回 0X73
	oe_1h;//断开数据总线
	
}
/////////////////////////////////////////////////////////////////////////
uchar flash_erase(uint block)
{
  uchar temp,COMP;
  uint  i;
  DDRA  = 0xff;  //PORTA 变成输出口
	 dir_1h;   //设置 UC1 方向为写  
	 NOP();           
	 oe_1l;    //设置 UC1 输出使能    
	  NOP();  
	dir_2h;   //设置 UC2 方向为写 
    NOP();                      
	oe_2l;    //设置 UC2 输出使能  
        rd_fh;   NOP(); NOP();  
	ale_fl;    //ALE_4245 = 0 ALE置低
	   NOP();    NOP();                       
	we_fl;     //WE_4245 = 0	WE置低 
	   NOP();   NOP();   
	    rd_fh;     //设置 FLASH 读为高  
	    NOP();                       
	cle_fh;    //CLE_4245 = 1 CLE置高
	    NOP();   NOP();    

	PORTA = 0x60;NOP(); NOP();
	 we_fh;  NOP();NOP();
	 cle_fl; NOP();NOP(); 
	 ale_fh;NOP();NOP();
	 we_fl; NOP();NOP();
	 NOP();  
	//temp = (uchar)((block<<5)&0x00ff);//取低三位 a14---a16
	temp = (uchar)((block>>1)&0x00ff);
	// (uchar)((change>>1) & 0x00ff);
	//temp=0;
	PORTA=temp;		//地址8-15位 
	we_fh;  NOP();NOP();//WE_4245 = 1;	//WE置高
 
	we_fl;  NOP(); NOP();//WE_4245 = 0;	//WE置低
	//temp=(uchar)((block>>3)&0x00ff);
	temp=(uchar)((block>>9)&0x00ff);//取高七位 共1024个BLOCK
	//temp=0;
	PORTA=temp;		//地址16-23位   
	we_fh;NOP();NOP();//WE_4245 = 1;	//WE置高

	ale_fl;NOP();NOP();//ALE_4245 = 0;	//ALE置低
	
	 cle_fh; NOP();NOP();//CLE_4245 = 1;
	we_fl; NOP();NOP();/////WE_4245  = 0;
	PORTA=0xd0;NOP();  //写入开始擦除命令
	we_fh; NOP(); NOP();
	
	cle_fl; NOP();NOP();//CLE_4245 = 0;

	
	for( i=0;i<10000;i++)
	{ NOP(); 
	   //延时3ms以上
    }
	

       ale_fl;NOP();NOP();// ALE_4245 = 0;
       cle_fh;NOP();NOP(); // CLE_4245 = 1;
       we_fl; NOP();NOP();/// WE_4245  =0;
        PORTA=0x70; //写入读状态命令
       we_fh; NOP(); NOP();// WE_4245 = 1;
       cle_fl; NOP();NOP();// CLE_4245 = 0;

        for(temp = 0;temp < 70;temp++)
		NOP();
	
		

   dir_1l; // RW_4245_1 = 0;	//设置第一个4245方向为读
	//OE_4245_1 = 0;  //第一个4245使能输出
	DDRA=0X00;
	PORTA=0XFF;
	 rd_fh;NOP(); NOP();  //RE_4245 = 1 ;
	
	rd_fl;NOP(); NOP();
	
	COMP=PINA;
	 NOP();  NOP(); 
	rd_fh;NOP();
	if((COMP&0x01)==0)
	{oe_1h;//断开数据总线
        return 0;//擦除成功返回 0
        }
	else
        {oe_1h;//断开数据总线
        return 1;
        }
}




⌨️ 快捷键说明

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