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

📄 nflash.c

📁 处理器采用的是LPC2378
💻 C
📖 第 1 页 / 共 2 页
字号:
    while(!(FIO0PIN&0x00800000));  
    FIO1DIR=0xF807FFFF; 
    FIO1PIN=0x30000000;       
    i=0;      
    do
    {
               
        FIO1PIN=0x20000000;
        //FIO1PIN=0x20000000;            
        ControlData.dataBuffer[i]=(FIO1PIN>>19);
        ControlData.dataBuffer[i]=(FIO1PIN>>19);
        ControlData.dataBuffer[i]=(FIO1PIN>>19);
        FIO1PIN=0x30000000; 
        i++;  
          
    }while(i<512);
    //addr[0] +=64;
    //if(addr[0]==0)
    //{
    
	    addr[1]++;
	    if(addr[1] ==0)
	    {
	    addr[2]++;
	    }
    
    //}
    FIO1PIN = 0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;     

   
}
void FLSRDP1(INT8U addrhs,INT8U addrls,INT8U addrld)
{
   /* int i;
    for( i = 0;i<512;i++)
    {
    Bulk_Task.dataBuffer[i]=i;
    
    }*/
   	unsigned int i,j;
   	
	j = addrld*512;
	addr[2] = addrhs;
	addr[1] = addrls;
   	
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作   
    //FIO0DIR = !FLSRB;			            // 设置FLSRB输入   
     
              
    FLSCMD(0x00);
    //FLSCMD(0x50);
    FLSADD(addr[2],addr[1],addr[0]);
    
    while(!(FIO0PIN&0x00800000));  
    FIO1DIR=0xF807FFFF; 
    FIO1PIN=0x30000000;       
    i=0;      
    do
    {
               
        FIO1PIN=0x20000000;
        //FIO1PIN=0x20000000;            
        p[j+i]=(FIO1PIN>>19);
        p[j+i]=(FIO1PIN>>19);
        p[j+i]=(FIO1PIN>>19);
        FIO1PIN=0x30000000; 
        i++;  
          
    }while(i<512);
    //addr[0] +=64;
    //if(addr[0]==0)
    //{
    
	    //addr[1]++;
	    //if(addr[1] ==0)
	    //{
	    //addr[2]++;
	    //}
    
    //}
    FIO1PIN = 0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;     

   
}

/*********************************************************************************************************
** 函数名称 :FLSEBK(unsigned int blockadd)
** 函数功能 :块擦除 
**********************************************************************************************************/

void FLSEBK(INT8U addrh,INT8U addrl)
{
	
    PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作   
   // FIO0DIR = !FLSRB;			            // 设置FLSRB输入 
                       
    FLSCMD(0x60);
   
    FIO1PIN=(0x50000000)|((addrl)<<19);       
    FIO1PIN=(0x70000000)|((addrl)<<19);
     
    FIO1PIN=(0x50000000)|((addrh)<<19);
    FIO1PIN=(0x70000000)|((addrh)<<19);
    
    FLSCMD(0xD0);

   while(!(FIO0PIN&0x00800000));  
   
    FLSCMD(0xFF);
    FIO1PIN=0x08000000; 
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       
                                
}
/*********************************************************************************************************
** 函数名称 :FLSCOPYBACK(INT8U addrhs,INT8U addrls,INT8U byteaddrs,INT8U addrhd,INT8U addrld,INT8U byteaddrd)
** 函数功能 :块擦除 
**********************************************************************************************************/
/*void FLSCOPYBACK(INT8U addrhs,INT8U addrls,INT8U byteaddrs,INT8U addrhd,INT8U addrld,INT8U byteaddrd)
{
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作   
	FLSCMD(0x00);
	FLSADD(addrhs,addrls,byteaddrs);
	while(!(FIO0PIN&0x00800000)); 
	FLSCMD(0x8A);
	FLSADD(addrhd,addrld,byteaddrd);
	while(!(FIO0PIN&0x00800000));
    FLSCMD(0xFF);
    FIO1PIN=0x08000000; 
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       
}*/
/*void FLSCOPYBACK(INT8U addrhs,INT8U addrls,INT8U byteaddrs,INT8U addrhd,INT8U addrld,INT8U byteaddrd)
{
	   addr[2] = addrhs;
	   addr[1] = addrls;
	   addr[0] = byteaddrs;
	   FLSRDP1();
	   addr[2] = addrhd;
	   addr[1] = addrld;
	   addr[0] = byteaddrd;
	   FLSWR1();
	   
}*/

/************************************************************
**函数功能:读FLASH预处理函数
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
void flashReadcmd(void)
{
    uint32 h;
	/****************说明************
	  对于FLASH的读原理为:FLASH的读
	  可以是随机读取,所以这里只要给
	  定读数据的首地址和读写长度
	********************************/
	h = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[20]+512;
	ControlData.dataBuffer[20] = h;
	ControlData.dataBuffer[19] = h>>8;

	addr[0] = 0;
	addr[1] = ControlData.dataBuffer[20];
	addr[2] = ControlData.dataBuffer[19];
  	ReadResidueVal = (ControlData.dataBuffer[22]<<8) + ControlData.dataBuffer[23];
  	//if(ReadResidueVal == 0x80) BeepFunc();
  	ReadResidueVal = ReadResidueVal <<9;
  	//if(ReadResidueVal>512)	ReadResidueVal=512;
  	offsetr = 0;
	//while(!(FIO0PIN&0x00800000)); 
}
/************************************************************
**函数功能:读FLASH函数
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
void flashRead(void)
{
    //uint8 epstus;
    //epstus = D13_GetEndpointStatusWOInteruptClear(02);
    //epstus &= 0x60;
	if(ReadResidueVal > 0)
 	{
		if((offsetr%512)==0)
		{
			offsetr = 0;
			FLSRDP();
		}
		//if(ReadResidueVal == 0x80*512) BeepFunc();
		/*if(epstus == 0x00)
		{
			ReadResidueVal -= 64;
			D13_WriteEndpoint(2,64,ControlData.dataBuffer+offsetr);
			offsetr += 64;
			ReadResidueVal -= 64;
			D13_WriteEndpoint(2,64,ControlData.dataBuffer+offsetr);
			offsetr += 64;
		}
		else if(epstus != 0x60)
		{*/
			ReadResidueVal -= 64;
			D13_WriteEndpoint(2,64,ControlData.dataBuffer+offsetr);
			offsetr += 64;
		//}
		//return;
	}
	
}
/************************************************************
**函数功能:写FLASH预处理函数
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
void flashWritecmd(void)
{
	//uint16 i;
    uint32 h,m,n;
	unsigned char  Erase_addh,Erase_addl;
	unsigned char  Sour_addh,Sour_addl,Dest_addh,Dest_addl;
	unsigned char  Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl;
	unsigned int  Erase_Count = 0,i = 0;
	unsigned int  CopyBack_Count = 0;
	unsigned int  CopyBack_two_count = 0;
	unsigned int  WritePageNum = 0;
	union{
		unsigned char c[2];
		unsigned int add;
	}Start_add;
	union{
		unsigned char c[2];
		unsigned int add;
	}End_add;
	
	
	
	
	h = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[20]+512;
	ControlData.dataBuffer[20] = h;
	ControlData.dataBuffer[19] = h>>8;
	
	
	
	Sour_addh = ControlData.dataBuffer[19];
	Sour_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
	Dest_addh = 0xFF;
	Dest_addl = 0x00;
	CopyBack_Count = ControlData.dataBuffer[20]%0x20;
	//BeepFunc ();
	
	
	Erase_addh = ControlData.dataBuffer[19];
	Erase_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
	WritePageNum = (ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
	Erase_Count = WritePageNum / 0x20;
	if(WritePageNum % 0x20){
		Erase_Count ++;
		if((WritePageNum % 0x20) > (0x20 - (ControlData.dataBuffer[20] % 0x20)))
			Erase_Count ++;
	}else if(ControlData.dataBuffer[20] % 0x20){
		Erase_Count ++;
	}




	Start_add.add = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[20];
	End_add.add = Start_add.add + WritePageNum;
	Sour_two_addh= End_add.c[1];
	Sour_two_addl= End_add.c[0];
	Dest_two_addh= 0xFF;
	Dest_two_addl= 0x00;
	CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum;
	
	
	
	
	
	m = (Sour_addh<<8)+Sour_addl+32;
	n = End_add.add;
	if(n <= m)
	{
		for(i=0;i<CopyBack_Count;i++){
			FLSRDP1(Sour_addh,Sour_addl,Dest_addl);
			Sour_addl++;
			Dest_addl++;
		}
		/*for(i=0;i<Erase_Count-1;i++){
			FLSEBK(Erase_addh, Erase_addl);
			if(Erase_addl == 224){
				Erase_addl = 0x00;
				Erase_addh ++;
			}else
				Erase_addl += 0x20;
		}
		
		for(i=0;i<CopyBack_Count;i++){
			Sour_addl --;
			Dest_addl --;
			FLSWR1(Sour_addh,Sour_addl,Dest_addl);
		}
		*/
		
		for(i=0;i<CopyBack_two_count;i++){
			 FLSRDP1(Sour_two_addh,Sour_two_addl,Dest_two_addl+Dest_addl);
			 Sour_two_addl++;
			 Dest_two_addl++;
		}
		
		FLSEBK(Erase_addh, Erase_addl);
		
		for(i=0;i<CopyBack_two_count;i++){
			Sour_two_addl --;
			Dest_two_addl --;
			FLSWR1(Sour_two_addh,Sour_two_addl,Dest_two_addl+Dest_addl);
		}
		for(i=0;i<CopyBack_Count;i++){
			Sour_addl --;
			Dest_addl --;
			FLSWR1(Sour_addh,Sour_addl,Dest_addl);
		}
	}
	else
	{
		
		for(i=0;i<CopyBack_Count;i++){
			FLSRDP1(Sour_addh,Sour_addl,Dest_addl);
			Sour_addl++;
			Dest_addl++;
		}
		for(i=0;i<Erase_Count-1;i++){
			FLSEBK(Erase_addh, Erase_addl);
			if(Erase_addl == 224){
				Erase_addl = 0x00;
				Erase_addh ++;
			}else
				Erase_addl += 0x20;
		}
		
		for(i=0;i<CopyBack_Count;i++){
			Sour_addl --;
			Dest_addl --;
			FLSWR1(Sour_addh,Sour_addl,Dest_addl);
		}
		
		
		for(i=0;i<CopyBack_two_count;i++){
			 FLSRDP1(Sour_two_addh,Sour_two_addl,Dest_two_addl);
			 Sour_two_addl++;
			 Dest_two_addl++;
		}
		
		FLSEBK(Erase_addh, Erase_addl);
		
		for(i=0;i<CopyBack_two_count;i++){
			Sour_two_addl --;
			Dest_two_addl --;
			FLSWR1(Sour_two_addh,Sour_two_addl,Dest_two_addl);
		}
		
	}
	
	
	
	addr0 = 0;
	addr[0] = 0;
	addr[1] = ControlData.dataBuffer[20];
	addr[2] = ControlData.dataBuffer[19];
  	WriteResidueVal=(ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
  	WriteResidueVal= WriteResidueVal<<9;
  	WriteResidueValcopy = WriteResidueVal;
  	times1 = 0;
  	times2 = 0;
  	bEPPflags.flashwrstart = 0;
  	bEPPflags.flashwrend = 0;
  	temp = 0;
  	offset = 0;
  	offsetd = 0;
 }
/************************************************************
**函数功能:写FLASH函数
**函数输入参数及说明:写入数据
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
/*void flashWrite(void)     
{
      uint16 i;
	//if(WriteResidueVal > 0)
	//{
		//BeepFunc();
		WriteResidueVal-=offset;
		//WriteResidueVal-=512;
		//if(WriteResidueVal > 0) return;
		for(i = 0;i<offset/512;i++)
		{
			  offsetd = i*512;
			  FLSEBK(0x00, 0x00);
		      FLSWR();
		      
		}
		offsetd = 0;
		//WriteResidueVal-=512;
		
	//}
}*/
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
 

⌨️ 快捷键说明

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