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

📄 nflash.c

📁 处理器采用的是LPC2378
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**                                       KAIXIN Co.,Ltd.                                 
**
**--------------文件信息-------------------------------------------------------------------------------
** 文件名:			    NFLASH.c
** 修改日期:	        2007-8-8
** 版本:		        V1.0
** 描述:       		ISP61A1 设备端驱动程序 FLASH操作层
**						
**------------------------------------------------------------------------------------------------------
** 创建:			    安 宁
** 创建日期:		    2007-8-8
** 版本:				V1.0
** 描述:		        原始版本
********************************************************************************************************/
#include "config.h"
#include "D13Config.h"
#include "D13CI.h"
#include "Chap_9.h"
#include "D13Driver.h"
//#include "SCSI.h"
#include "NFLASH.h"
INT8U addr[3] = {0,0,0};
uint16 addr0;
INT8U addrd[3] = {0,0,0};
uint8 databuffer[512];
uint8 *p = (uint8 *)0x7FE00000;
//p ;




unsigned int WriteResidueVal = 0;
unsigned int WriteResidueValcopy = 0;
unsigned int  ReadResidueVal = 0;



extern INT32U offset,offsetr,offsetd,times1,times2,temp;

/*********************************************************************************************************
** 函数名称 :FLSCMD(unsigned char CMD)
** 函数功能 :发送FLASH操作命令 
**********************************************************************************************************/
void FLSCMD(unsigned char CMD)
{
	
    PINSEL3 = 0x00000005;		            // 设置P1管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
    FIO1PIN = 0x78000000; 
    FIO1PIN = 0xB0000000; 
    FIO1PIN = 0x90000000; 
    FIO1PIN = (0x90000000)|((0x000000FF &CMD)<<19);         //SEND CMD  

    FIO1PIN = (0xB0000000)|((0x000000FF &CMD)<<19);         //SEND CMD
    FIO1PIN = 0x7FF80000;        
    FIO1MASK = 0x00000000;       
}
/*********************************************************************************************************
** 函数名称 :FLSADD(unsigned int blockadd,unsigned char pageadd)
** 函数功能 :发送FLASH  块地址,页地址。
**********************************************************************************************************/

void FLSADD(INT8U addrh,INT8U addrl,INT8U byteaddr)
{
	
    PINSEL3 = 0x00000005;		            // 设置P1管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR=0xFFFFFFFF;                      // 定义为输出
                        
    FIO1PIN=0xB8000000;
    FIO1PIN=0x30000000;     
    FIO1PIN=0x70000000; 
          
    FIO1PIN=(0x50000000)|((0x000000FF &byteaddr)<<19);  
    FIO1PIN=(0x70000000)|((0x000000FF &byteaddr)<<19);
      
    FIO1PIN=(0x50000000)|((addrl)<<19);        
    FIO1PIN=(0x70000000)|((addrl)<<19);   
      
    FIO1PIN=(0x50000000)|((addrh)<<19);        
    FIO1PIN=(0x70000000)|((addrh)<<19);
     
    FIO1PIN=0x70000000;                       
    FIO1MASK = 0x00000000;       

}
/*********************************************************************************************************
** 函数名称 :FLSWRH(unsigned char CMD)
** 函数功能 :页写,连续写256字节 
**********************************************************************************************************/

uint8 FlsStatus()
{
    uint8 temp;
	PINSEL3 = 0x00000005;		                         // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                                // 屏蔽对网口的操作
    FIO1DIR=0xF807FFFF;     

    FLSCMD(0x70);

    FIO1PIN=0x38000000;     
    FIO1PIN=0x30000000; 
    FIO1PIN=0x20000000;                              
    temp=(FIO1PIN&0x07F80000)>>19;  
   
    FIO1PIN=0x3FF80000;     
    return temp;  
           

}
/*********************************************************************************************************
** 函数名称 :FLSWR(unsigned char CMD)
** 函数功能 :页写,连续写64字节 
**********************************************************************************************************/

/*void FLSWR(void)
{
	
   	unsigned int i,j;//
	
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作 
    FLSCMD(0x00);
    FLSCMD(0x80);
    FLSADD(addr[2],addr[1],addr[0]); 
    
    FIO1PIN=0x30000000;  
    //j = ((times2%16) - 1)*512;
    j = (times2%16)*512;
    //j = 0;
    i = 0;
    do
    {  
        FIO1PIN=(0x10000000)|FIO1PIN;
        //FIO1PIN=(0x10000000)|FIO1PIN;
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[j+i])<<19));
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[j+i])<<19));
        FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[j+i])<<19)); 
        FIO1PIN=(0x30000000)|FIO1PIN; 
        i++; 
         
    }while(i<512);
    
    FLSCMD(0x10);    
   
    while(!(FIO0PIN&0x00800000));  
   
    FLSCMD(0xff);
    
    
    //j += 512 ;
    
    //addr[0] += 64;
    //if(addr[0]==0)
    //{
	    addr[1]++;
	    if(addr[1] ==0)
	    {
	    addr[2]++;
	    }
   // }
    
    FIO1PIN=0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       

}*/
/*void FLSWR(void)
{
	
   	unsigned int i;//,j
	
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作 
    FLSCMD(0x00);
    FLSCMD(0x80);
    FLSADD(addr[2],addr[1],addr[0]); 
    
    FIO1PIN=0x30000000;  
    //j = ((times2%16) - 1)*512;
    //j = (times2%16)*512;
    //j = 0;
    i = 0;
    do
    {  
        FIO1PIN=(0x10000000)|FIO1PIN;
        //FIO1PIN=(0x10000000)|FIO1PIN;
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
        FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[i])<<19)); 
        FIO1PIN=(0x30000000)|FIO1PIN; 
        i++; 
         
    }while(i<512);
    
    FLSCMD(0x10);    
   
    while(!(FIO0PIN&0x00800000));  
   
    FLSCMD(0xff);
    
    
    //j += 512 ;
    
    //addr[0] += 64;
    //if(addr[0]==0)
    //{
	    addr[1]++;
	    if(addr[1] ==0)
	    {
	    addr[2]++;
	    }
   // }
    
    FIO1PIN=0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       

}*/
/*void FLSWR(void)
{
	
   	unsigned int i;//,j
	
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作 
    if(addr0<=255)
       FLSCMD(0x00);
    else
       FLSCMD(0x01);
    FLSCMD(0x80);
    FLSADD(addr[2],addr[1],addr0%256); 
    
    FIO1PIN=0x30000000;  
    //j = ((times2%16) - 1)*512;
    //j = (times2%16)*512;
    //j = 0;
    i = 0;
    do
    {  
        FIO1PIN=(0x10000000)|FIO1PIN;
        //FIO1PIN=(0x10000000)|FIO1PIN;
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
        FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[i])<<19)); 
        FIO1PIN=(0x30000000)|FIO1PIN; 
        i++; 
         
    }while(i<64);
    
    FLSCMD(0x10);    
   
    while(!(FIO0PIN&0x00800000));  
   
    FLSCMD(0xff);
    
    
    //j += 512 ;
    
    addr0 += 64;
    if(addr0==512)
    {
        addr0 = 0;
	    addr[1]++;
	    if(addr[1] ==0)
	    {
	    addr[2]++;
	    }
    }
    
    FIO1PIN=0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       

}*/
void FLSWR(uint16 len,uint8 n)
{
	
   	unsigned int i,j;//
	
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作 
    if(addr0<=255)
       FLSCMD(0x00);
    else
       FLSCMD(0x01);
    FLSCMD(0x80);
    FLSADD(addr[2],addr[1],addr0%256); 
    
    FIO1PIN=0x30000000;  
    //j = ((times2%16) - 1)*512;
    //j = (times2%16)*512;
    //j = 0;
    j = 512*n;
    i = 0;
    do
    {  
        FIO1PIN=(0x10000000)|FIO1PIN;
        //FIO1PIN=(0x10000000)|FIO1PIN;
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i+j])<<19));
        FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i+j])<<19));
        FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[i+j])<<19)); 
        FIO1PIN=(0x30000000)|FIO1PIN; 
        i++; 
         
    }while(i<len);
    
    FLSCMD(0x10);    
   
    while(!(FIO0PIN&0x00800000));  
   
    FLSCMD(0xff);
    
    
    //j += 512 ;
    
    addr0 += len;
    if(addr0==512)
    {
        addr0 = 0;
	    addr[1]++;
	    if(addr[1] ==0)
	    {
	    addr[2]++;
	    }
    }
    
    FIO1PIN=0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       

}
void FLSWR1(INT8U addrhs,INT8U addrls,INT8U addrld)
{
	
   	unsigned int i,j;
   	
	j = addrld*512;
	addr[2] = addrhs;
	addr[1] = addrls;
	
	
	PINSEL3 = 0x00000005;		            // 设置P1 16~31管脚	
    FIO1MASK= 0x0007FFFF;                   // 屏蔽对网口的操作
    FIO1DIR = 0xFFFFFFFF;                      // 定义为输出
    
	PINSEL1 = 0x00000000;		            // 设置P0 16~31管脚		
    FIO0MASK= 0xFF7FFFFF;                   // 屏蔽对特殊管脚的操作 
    FLSCMD(0x00);
    FLSCMD(0x80);
    FLSADD(addr[2],addr[1],addr[0]); 
    
    FIO1PIN=0x30000000;  
    //j = ((times2%16) - 1)*512;
    //j = (times2%16)*512;
    
    i=0;
    do
    {  
        FIO1PIN=(0x10000000)|FIO1PIN;
        //FIO1PIN=(0x10000000)|FIO1PIN;
        FIO1PIN=((0x10000000)|((0x000000FF &p[j+i])<<19));
        FIO1PIN=((0x10000000)|((0x000000FF &p[j+i])<<19));
        FIO1PIN=((0x30000000)|((0x000000FF &p[j+i])<<19)); 
        FIO1PIN=(0x30000000)|FIO1PIN; 
        i++; 
         
    }while(i<512);
    
    FLSCMD(0x10);    
   
    while(!(FIO0PIN&0x00800000));  
   
    FLSCMD(0xff);
    
    //addr[0] += 64;
    //if(addr[0]==0)
    //{
	    //addr[1]++;
	    //if(addr[1] ==0)
	   // {
	   // addr[2]++;
	   // }
   // }
    
    FIO1PIN = 0x08000000;
    FIO1MASK = 0x00000000;       
    FIO0MASK = 0x00000000;       

}

/*********************************************************************************************************
** 函数名称 :FLSRDP(unsigned int blockadd)
** 函数功能 :页读,连续读64字节 
**********************************************************************************************************/

void FLSRDP(void)
{
   /* int i;
    for( i = 0;i<512;i++)
    {
    Bulk_Task.dataBuffer[i]=i;
    
    }*/
   	unsigned int i;
	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]);
    

⌨️ 快捷键说明

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