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

📄 rd_wr_k9f5608.c

📁 C51读写K9F5608源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
          	Nf_ready_write();
		  	Nf_wr_byte(0xDD);
          	Nf_write_start();
          	DelayXms(1);
          	watchdog();
          	Nf_wait_busy();
          } while(!nf_check_status());

	      Area=0;
          Column_Address=0;
          L_Row_Address++;
		  
		  if(L_Row_Address%0x20==0)
		   {
		     if(L_Row_Address==0) { H_Row_Address++; }  
		     //D′íêò????é
             Block_Add=(uint)(H_Row_Address*256)+(uint)(L_Row_Address);
             Block_Add-=0x20;//?°ò??éí·μ??·
			 L_Row_Address=(Byte)(Block_Add);
			 H_Row_Address=(Byte)(Block_Add>>8);
			 //D′è??é?ú±ê????
			 do
 		  	  {
		  	    Area=0x50;
		  		Column_Address=1;
          		Nf_ready_write();
		  		Nf_wr_byte(0xBB);
          		Nf_write_start();
          		DelayXms(1);
          		watchdog();
          		Nf_wait_busy();
         	  } while(!nf_check_status());             
             //
             Block_Add+=0x20;
             if (bad_block)
			  {
			   //òò?aóD?μ?éμ?′??ú£??ùò?òa2é?ò????ò???óDD§μ?o??éμ??·?£
		       while(Block_Add<0xFFE1)
			   {
			    Area=0x50;
                Column_Address=0;
                L_Row_Address=(Byte)(Block_Add);
                H_Row_Address=(Byte)(Block_Add>>8);
                Nf_ready_read();
                Nf_wait_busy();
                for(i=0;i<5;i++)
                 {
                  tmp_buf[i]=Nf_rd_byte();
                 }
                
				if(tmp_buf[4]==0xEE || tmp_buf[4]==0xFF)
				 {
				   //good block
                   goto good_block;
				 }
                else
				 {
				   Block_Add+=0x20;
				 }
			   }//end while(block_add<0xffe1)
			  }//edn if(bad_block)
		good_block:
			 new_block=1;
			 L_Row_Address=(Byte)(Block_Add);
			 H_Row_Address=(Byte)(Block_Add>>8);
			 //D′è??éê1ó?±ê?????
			 //?àD′ò????é?°±ê??£??a?ù??′????ˉê±2é?ò?íê?μúò??????Dμ??·á??£
	         do
 		      {
		        Area=0x50;
		  		Column_Address=0;
          		Nf_ready_write();
		  		Nf_wr_byte(0xAA);
          		Nf_write_start();
          		DelayXms(1);
                watchdog();
                Nf_wait_busy();
              } while(!nf_check_status());   
             new_block=0;
			 Area=0;
	         Column_Address=0;
		   }//end if(L_Row_Address%0x20==0)
	  }//end else if(Area==1)
	}//end if(Column_Address==250)  
}
 
/*****************************************
1|?ü:D′è????tí·±ê??.
?èê?:????μ±?°???tμ??eê?μ??·,ìí3?D??¢
2?êy£o???tDòo?,?eê?μ??·,
·μ??£o
±?×¢£o
******************************************/
void write_header(void)
{
     uchar data  i=0;
	 //±£′?μ±?°
	 rd_Area=Area;
	 rd_Column_Address=Column_Address;
     rd_L_Row_Address=L_Row_Address;
     rd_H_Row_Address=H_Row_Address;
	 
	 //D′è?′?′¢?÷ê1ó?±ê???£
     if(!store_ok)
	  {
	    //′?′¢?÷μúò?′?ê1ó?
        Area=0;
	 	H_Row_Address=0;
	 	L_Row_Address=0;
		Column_Address=51;
	    do
	     {
	     	Nf_ready_write();
         	Nf_wr_byte(0xB0);
         	Nf_write_start();
         	DelayXms(1);
         	watchdog();
            Nf_wait_busy();
      	 } while(!nf_check_status());
	   
		store_ok=1;
	  }
	 //D′è????tí3??--???tμ???êy
	 Area=1;
	 H_Row_Address=0;
	 L_Row_Address=0;
	 Column_Address=file_serial;
     do
	  {
	     Nf_ready_write();
         Nf_wr_byte(file_serial);
         Nf_write_start();
         DelayXms(1);
         watchdog();
         Nf_wait_busy();
      } while(!nf_check_status());
     
	 //D′è????tí·
	 //file_serial==0---->No.1 files
	 i=file_serial/20;
	 H_Row_Address=0;
	 L_Row_Address=11+i;
     i=file_serial%20;
	 
	 if(i<10)   
	  {
	    Area=0;
	  }
	 else         
      {
	    Area=1;
	    i-=10;
	  }
     Column_Address=i*25;
	  
	 do
      {
     	Nf_ready_write();
   	    
        for(i=0;i<5;i++)
     	 {
       	   Nf_wr_byte(FlashBuff[FlashIndex][i]);
     	 }
        Nf_wr_byte(rd_Area);
        Nf_wr_byte(rd_Column_Address);
        Nf_wr_byte(rd_L_Row_Address);
        Nf_wr_byte(rd_H_Row_Address);
        Nf_wr_byte(0x00);
        Nf_write_start();
        DelayXms(1);
        watchdog();
        Nf_wait_busy();
      } while(!nf_check_status());
     
     //???′μ??·
	 Area=rd_Area;
	 H_Row_Address=rd_H_Row_Address;
	 L_Row_Address=rd_L_Row_Address;
     Column_Address=rd_Column_Address;
     //???tí·±ê??
	 firstdata=1;
}
/*****************************************
1|?ü£o×′ì????ì2é
?èê?£o±à3ì/2á3y2ù×÷oó£??ì2é???′×′ì?μ?±ê????ê?·??yè·
2?êy£o
·μ??£o3é1|1/ê§°ü0
±?×¢£o
******************************************/
bit nf_check_status (void)
{
  Nf_wait_busy();
  /* Status Type Command */
  Nf_send_command(NF_READ_STATUS_CMD);
  
  if ( (Nf_rd_byte() & 0x01) == 0x00)
  {  
    return OK;
  }
  else
  {
    return KO;
  }
  watchdog();
}  

/*****************************************
1|?ü£o2á3y????′?′¢?÷????
?èê?£o°?????′?′¢?÷2á3yμ?£??ùóDêy?Yè?2????aFF
2?êy£o
·μ??£o
±?×¢£o
******************************************/
void nf_all_erase (void)
{
  uint blockserial=0;
  uint block_address=0;
  uint badblocknum=0;

  //uchar rd_H_Row_Address=0x00; //bad block table begin
  //uchar rd_L_Row_Address=0x01; //′?′¢?μ?éDòáDo?μ?ò3??μ??·
  //uchar rd_Column_Address=0x00;
  //uchar rd_Area=0x00;
  bit   EraseOk=0;
  uchar i=0;

  watchdog();
  Nf_CS_ON();
  Nf_send_command(NF_RESET_CMD); //reset flash
  Nf_wait_busy();

  //while(blockserial<2048)
  while(blockserial<2048)
   {
     i=0;
     do
      {
     	Nf_send_command (NF_READ_A_AREA_CMD);
     	Nf_send_command (NF_BLOCK_ERASE_CMD);         /* Auto Block Erase Setup     */
     	Nf_send_address ((Byte)(block_address));      /* 1st address cycle          */
     	Nf_send_address ((Byte)(block_address>>8));   /* 2nd address cycle          */
    	Nf_send_command(NF_BLOCK_ERASE_CONFIRM_CMD);  /* Erase command              */
        DelayXms(3);//type=2ms
        watchdog();
        Nf_wait_busy();
        EraseOk=nf_check_status();
      }while(!EraseOk && ++i<3);
     
	 if(EraseOk)
      {
        //sucess erase 
		//63 blockserial_h  blockserial_l 
        do
		 {
			Nf_send_command(NF_READ_C_AREA_CMD);
        	Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
       		Nf_send_address(4);
       		Nf_send_address((Byte)(block_address));  //L_Row_Address
       		Nf_send_address((Byte)(block_address>>8));//H_Row_Address
       		Nf_wr_byte(0xEE);
			//Nf_wr_byte(0xFF);
    		Nf_send_command(NF_PAGE_PROGRAM_CMD);
       		DelayXms(1);
       		watchdog();
       		Nf_wait_busy();
    	 } while(!nf_check_status());
        //ReportEraseOk();
      }
	 else 
	  {
	    //creat bad block flag 
		i=0; 
	    do
		 {
			Nf_send_command(NF_READ_C_AREA_CMD);
        	Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
       		Nf_send_address(4);
       		Nf_send_address((Byte)(block_address));  //L_Row_Address
       		Nf_send_address((Byte)(block_address>>8));//H_Row_Address
       		Nf_wr_byte(0xE0);
			Nf_wr_byte(0xF0);
    		Nf_send_command(NF_PAGE_PROGRAM_CMD);
       		DelayXms(1);
       		watchdog();
       		Nf_wait_busy();
    	 } while(!nf_check_status() && ++i<3);
		/*
		
		//failed erase , create bad block tab
	    do
		 {
		    Nf_send_command(rd_Area);
            Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
        	Nf_send_address(rd_Column_Address);
        	Nf_send_address(rd_L_Row_Address);//L_Row_Address
        	Nf_send_address(rd_H_Row_Address);//H_Row_Address
        	//
    		Nf_wr_byte((Byte)(blockserial>>8));
    		Nf_wr_byte((Byte)(blockserial));
        	Nf_write_start();
        	DelayXms(1);
        	watchdog();
        	Nf_wait_busy();
		  } while(!nf_check_status());
        
		//
        rd_Column_Address+=2;
        if(rd_Column_Address==0) 
         {
         	if(rd_Area==0)         { rd_Area=1; }
            else if(rd_Area==1)    { rd_L_Row_Address++;} //increse Page
         }        
        */
		
		badblocknum++;
        //62 blockserial_h blockserial_l
	    ReportEraseEr();
	  }
     blockserial++;
     block_address+=0x20; 
   }//end while(
   
   //D′è??μ?éí3??
   //block=0,page=0,column=100;
   if(badblocknum!=0)
    {
	 do
 	  {
	    Nf_send_command(00);
        Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
       	Nf_send_address(53);
       	Nf_send_address(0);//L_Row_Address
       	Nf_send_address(0);//H_Row_Address
       	//
        Nf_wr_byte((Byte)(badblocknum>>8));
    	Nf_wr_byte((Byte)(badblocknum));
       	Nf_write_start();
       	DelayXms(1);
       	watchdog();
       	Nf_wait_busy();
     }while(!nf_check_status());
	}
   //write into init info
   do
	{
	    Nf_send_command(00);
        Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
       	Nf_send_address(50);
       	Nf_send_address(0);//L_Row_Address
       	Nf_send_address(0);//H_Row_Address
       	Nf_wr_byte(0xA0);
    	Nf_write_start();
       	DelayXms(1);
       	watchdog();
       	Nf_wait_busy();
    } while(!nf_check_status());
   init_ok=1;

   
}
/*****************************************
1|?ü£o3?ê??ˉFLASH′?′¢?÷
?èê?£o±éé¨?è????FLASH′?′¢?÷£?è·?¨?????éμ?o??μ£??¨á¢μ??·???-??ó|±í?£
2?êy£o
·μ??£oArea£?Column_Address,L_Row_Address,H_Row_Address,FirstBlockArea,FirstBlockColumn,FirstBlockRow
±?×¢£o
******************************************/
void init_flash(void)
{
  uchar i=0,j=0;
  uchar MakerCode,DeviceCode,tmp,page=0;
  uint  Block_Address=0,block_address=0,bad_block_num=0;
  
  watchdog();
  P2 = NF_IDLE_STATE_ADD;
  Nf_CS_ON();

  Nf_send_command(NF_RESET_CMD);
  Nf_wait_busy();
  Nf_send_command(NF_READ_ID_CMD);
  Nf_send_address(0x00);
  Nf_wait_busy();
  watchdog();
    
  MakerCode=Nf_rd_byte();  
  DelayXms(1);
  DeviceCode=Nf_rd_byte();         
  
  //ê×?èè·?¨′?′¢?÷ê?·???DDá?3?ê??ˉ.
  
  Area=0;
  H_Row_Address=0;
  L_Row_Address=0;
  Column_Address=50;
  Nf_ready_read();
  Nf_wait_busy();
  for(j=0;j<5;j++)
   {
     ReceiveBuff[j]=Nf_rd_byte();
   }
  
  MakerCode=ReceiveBuff[0];//ê?·?3?ê??ˉ
  if(MakerCode==0xA0)
   {
    	//ò??-3?ê??ˉ
        init_ok=1;
		DeviceCode=ReceiveBuff[1];
		if(DeviceCode==0xB0)
		 {
		   //′?′¢?÷ò??-ê1ó?1y
		   store_ok=1;
           if((ReceiveBuff[3]==0xFF && ReceiveBuff[4]==0xFF) ||(ReceiveBuff[3]==0x00 && ReceiveBuff[4]==0x00))
		    {
		      bad_block=0;   
            }
		   else                                             
            {
              bad_block_num=ReceiveBuff[3]*256+ReceiveBuff[4];
		      bad_block=1; //óD?μ?é′??
			}
           	//2é?ò×?oóò???′?′¢???tμ?μ??·,D′è????tí·à?.
            //′??ú0?é0ò3μ?B??
			Area=1;
            H_Row_Address=0;
  			L_Row_Address=0;
  			Column_Address=0;
  			Nf_ready_read();     
       	    Nf_wait_busy();
            j=0;
            while(j<200)
			 {
			   tmp=Nf_rd_byte();
			   if(tmp==0xFF) break;
			   else j++;
			 }
            file_serial=j;;//ìí3????t??êy
		    if(j!=0)
			 {
			   //óD???t′¢′?,è·è????t????.
               //
               //?è?á3?é?ò??????tμ??eê?μ??·£??ù?á?áê?±è???ì?£ 
               //?á3?μ±?°?a?????tμ??eê?μ??·
               H_Row_Address=0;
			   L_Row_Address=11;
			   tmp=(file_serial-1)/20;
			   L_Row_Address+=tmp;
			   tmp=(file_serial-1)%20;
			   if(tmp<10)
			    {
				  Area=0;
				}
			   else
			    {
				  tmp-=10;
				  Area=1;
				}
				Column_Address=tmp*25;
                //store file_serial address begin
                rd_Area=Area;
				rd_H_Row_Address=H_Row_Address;
                rd_L_Row_Address=L_Row_Address;
				rd_Column_Address=Column_Address;
                //
                //Nf_ready_read();     
       	        //Nf_wait_busy(); 
				//for(i=0;i<20;i++)
				// {
				//  ReceiveBuff[i]=Nf_rd_byte();
				// }
				Column_Address+=17;
                Nf_ready_read();     
       	        Nf_wait_busy(); 
				tmp=Nf_rd_byte();
				if(tmp==0xAA) 
			     {
			        Column_Address-=7;
					Nf_ready_read();     
       	            Nf_wait_busy(); 
				    for(i=0;i<5;i++)
                     {
                       ReceiveBuff[i]=Nf_rd_byte();
                     } 
					Area=ReceiveBuff[0];
					Column_Address=ReceiveBuff[1];
					L_Row_Address=ReceiveBuff[2];
					H_Row_Address=ReceiveBuff[3];
		            goto exit_init; 
				 }//ò??-D′íêá?
				Column_Address-=12;
				//Column_Address+=5;
				Nf_ready_read();     
       	        Nf_wait_busy();
                for(i=0;i<5;i++)
                 {
                   ReceiveBuff[i]=Nf_rd_byte();
                 } 
               
			   Area=ReceiveBuff[0];
			   Column_Address=ReceiveBuff[1];
			   L_Row_Address=ReceiveBuff[2];
               H_Row_Address=ReceiveBuff[3];

⌨️ 快捷键说明

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