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

📄 39vf400.c.bak

📁 dsp tmslf2407a 汇编,c的原代码,包括i2c,scitimer,fir等的很多程序.
💻 BAK
字号:

#include "typedef.h"
#include "f2407regs_c.h" 
#include "global.h" 

extern uint cfgdata[128];
extern uchar pcdata[Len];    

void readOneCfg(uint loc);
uint  writeOneCfg(uint loc);
uint writeOneDefaultCfg(uint loc);
uint  writeAllCfg(void);
void readAllCfg(void);
uint Check_SST_39VF400A();
uint CFI_Query();
uint Erase_One_Sector (uint *Dst);
uint Erase_One_Block (uint *Dst);
uint Erase_Entire_Chip();
uint Program_One_Word (uint SrcWord, uint *Dst);
uint Program_One_Sector (uint *Src, uint *Dst);
uint Program_One_Block (uint *Src, uint *Dst);
uint Check_Toggle_Ready (uint  *Dst);
uint Check_Toggle_Ready (uint  *Dst);
void Check_Data_Polling (uint  *Dst, uint TrueData); 
void  Delay_150_Nano_Seconds();


#define FALSE                   0
#define TRUE                    1       

#define BaseAddr	0x8000

#define SECTOR_SIZE             2048    // Must be 2048 words for 39VF400A 
#define BLOCK_SIZE              32768   //Must be 32K words for 39VF400A  

#define SST_ID                  0x00BF  // SST Manufacturer's ID code   
#define SST_39VF400A            0x2780  // SST39VF400A device code same device code as SST39VF400                                          

 
/* 1 :success,	0: failed */ 

void  Delay_150_Nano_Seconds()
{
	
}

uint Check_SST_39VF400A()              // same device code as SST39VF400 
{
	uint *Temp;
    uint *Temp1;
    uint SST_id1;        
    uint SST_id2;
    uint  ReturnStatus;       
       
    cs_flash_0;
    Temp1 = (uint *)(BaseAddr+0x5555); //address 5555h                         
    *Temp1= 0xAA;         			// write 0xAAAA        
                       
    Temp1 = (uint *)(BaseAddr+0x2AAA); //address 2AAAh         		 
    *Temp1= 0x55;                 // write 0x5555         
          
    Temp1 = (uint *)(BaseAddr+0x5555); //address 5555h            		
    *Temp1= 0x90;                 // write 0x9090          
        
    Delay_150_Nano_Seconds();       //delay Tida 
         		        
    Temp  = (uint *)(BaseAddr+0x0000); //address 0000h                        		 
    SST_id1  =  *Temp;              // get first ID word                           
    Temp1 = (uint *)(BaseAddr+0x0001); //address 0001h                      		 
    SST_id2  =  *Temp1;             // get second ID word         
                
    if ( ((SST_id1&0xff) == SST_ID) && (SST_id2 ==SST_39VF400A))ReturnStatus = TRUE;
    else  ReturnStatus = FALSE;         
         
    Temp1  = (uint *)(BaseAddr+0x5555); //address 5555h   
    *Temp1 = 0xAAAA;                 // 0xAAAA   
    Temp1  = (uint *)(BaseAddr+0x2AAA); //address 2AAAh   
    *Temp1 = 0x5555;                 //0x5555  
    Temp1  = (uint *)(BaseAddr+0x5555); //address 5555h   
    *Temp1 = 0xF0F0;                 //0xF0F0
       
    Delay_150_Nano_Seconds();        //delay Tida  
    cs_flash_1;       
    return(ReturnStatus);
}

#ifdef	PROMATIC
uint CFI_Query()
{
    uint *Temp1;  
        
    cs_flash_0; 
        
    Temp1 = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h    
    *Temp1= 0xAAAA;                 // write data 0xAAAA to the address   
    Temp1 = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh   
    *Temp1= 0x5555;                 // write data 0x5555 to the address  
    Temp1 = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h    
    *Temp1= 0x9898;                 // write data 0x9898 to the address   

    Delay_150_Nano_Seconds();       // insert delay time = Tida 

    Temp1  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h   
    *Temp1 = 0xAAAA;                 // write data 0xAAAA to the address  
    Temp1  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh   
    *Temp1 = 0x5555;                 // write data 0x5555 to the address  
    Temp1  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h   
    *Temp1 = 0xF0F0;                 // write data 0xF0F0 to the address  

    Delay_150_Nano_Seconds();        // insert delay time = Tida   
    cs_flash_1;
    return 1;       
}
#endif
/* 1 : success;	0:  failed */
uint Erase_One_Sector (uint *Dst)
{
    uint *Temp;
    uint flag = 1;
        
    cs_flash_0;        
        
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h                  
    *Temp = 0xAAAA;                 // write data 0xAAAA to the address 
        
    Temp  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh          
    *Temp = 0x5555;                 // write data 0x5555 to the address 
        
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h          
    *Temp = 0x8080;                 // write data 0x8080 to the address 
        
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h          
    *Temp = 0xAAAA;                 // write data 0xAAAA to the address 
        
    Temp  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh          
    *Temp = 0x5555;                 // write data 0x5555 to the address 
        
    Temp  = Dst;                  // set up starting address to be erased        
    *Temp = 0x3030;                 // write data 0x3030 to the address                
    flag = Check_Toggle_Ready(Temp); 		
    cs_flash_1;
	if(flag) return 1;
    else return 0;   	
}

#ifdef PROMATIC
/* 1 : success;	0:  failed */
uint Erase_One_Block (uint *Dst)
{
    uint *Temp;
    uint flag = 1; 
        
    cs_flash_0;
        
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h  
    *Temp = 0xAAAA;                 // write data 0xAAAA to the address 
    Temp  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh  
    *Temp = 0x5555;                 // write data 0x5555 to the address 
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h  
    *Temp = 0x8080;                 // write data 0x8080 to the address 
    Temp  = (uint *)(BaseAddr+0x5555); //set up address to be C000:5555h  
    *Temp = 0xAAAA;                 // write data 0xAAAA to the address 
    Temp  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh  
    *Temp = 0x5555;                 // write data 0x5555 to the address 

	Temp  = Dst;                  // set up starting address to be erased 
    *Temp = 0x5050;                 // write data 0x5050 to the address 
    
	flag = Check_Toggle_Ready(Temp);   
	cs_flash_1;
    if(flag) return 1;
    else return 0;           
}
#endif  

#ifdef PROMATIC
/* 1 : success;	0:  failed */
uint Erase_Entire_Chip()
{
    uint *Temp;
    uint flag = 1;    
        
    cs_flash_0;

    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h  
    *Temp = 0xAAAA;                 // write data 0xAAAA to the address 
    Temp  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh  
    *Temp = 0x5555;                 // write data 0x5555 to the address 
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h  
    *Temp = 0x8080;                 // write data 0x8080 to the address 
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h  
    *Temp = 0xAAAA;                 // write data 0xAAAA to the address 
    Temp  = (uint *)(BaseAddr+0x2AAA); // set up address to be C000:2AAAh  
    *Temp = 0x5555;                 // write data 0x5555 to the address 
    Temp  = (uint *)(BaseAddr+0x5555); // set up address to be C000:5555h  
    *Temp = 0x1010;                 // write data 0x1010 to the address 
    
	flag = Check_Toggle_Ready(Temp);
	
	cs_flash_1;
    if(flag) return 1;
    else return 0;             
}
#endif 
/* 1 : success;	0:  failed */
uint Program_One_Word (uint SrcWord, uint *Dst)
{
	uint *Temp;
    uint *DestBuf;
	uint flag = 1;
         
    cs_flash_0; 
    DestBuf = Dst;         
    Temp =  (uint *)(BaseAddr+0x5555); // address 555h        
    *Temp = 0xAAAA;                 // 0xAAAA         
        
    Temp =  (uint *)(BaseAddr+0x2AAA); //address 2AAAh                
    *Temp = 0x5555;                 //0x5555             
        
    Temp =  (uint *)(BaseAddr+0x5555); //address 5555h               
    *Temp = 0xA0A0;                 //0xA0A0              
        
    *DestBuf = SrcWord;            
         
	cs_flash_1;       
    flag = Check_Toggle_Ready(DestBuf);    // wait for TOGGLE bit to get ready         		
  	
    if(flag) return 1;
    else 	 return 0; 	
}  

#ifdef PROMATIC
uint Program_One_Sector (uint *Src, uint *Dst)
{
    uint *Temp;
    uint *SourceBuf;
    uint *DestBuf;
    int Index;
    uint flag = 1;

	SourceBuf = Src;
    DestBuf = Dst;

    Erase_One_Sector(Dst);          // erase the sector first
	
    for (Index = 0; Index < SECTOR_SIZE; Index++)	//2048
    {
    	cs_flash_0;
        Temp =  (uint *)(BaseAddr+0x5555);	// set up address to be C000:555h                     
        *Temp = 0xAAAA;			// write data 0xAAAA to the address
                    
        Temp =  (uint *)(BaseAddr+0x2AAA);	// set up address to be C000:2AAAh                      
        *Temp = 0x5555;			// write data 0x5555 to the address 
                   
        Temp =  (uint *)(BaseAddr+0x5555);	// set up address to be C000:5555h                     
        *Temp = 0xA0A0;			// write data 0xA0A0 to the address  
                   
        Temp = DestBuf;			// save the original Destination address               
        *DestBuf++ = *SourceBuf++;	// transfer data from source to destination
             
        cs_flash_1;
             
        flag = Check_Toggle_Ready(Temp);
        if(flag == 0) return 0;     // failed                 
	}
    return 1;			// success
}
#endif 

#ifdef PROMATIC
uint Program_One_Block (uint *Src, uint *Dst)
{
    uint *Temp;
    uint *SourceBuf;
    uint *DestBuf;
    int Index;
    uint flag = 1;

    SourceBuf = Src;
    DestBuf = Dst;

    Erase_One_Block(Dst);          // erase the sector first 

    for (Index = 0; Index < BLOCK_SIZE; Index++)	//32768
    {
    	cs_flash_0;
        Temp =  (uint *)(BaseAddr+0x5555);	// set up address to be C000:555h             
        *Temp = 0xAAAA;			// write data 0xAAAA to the address 
            
        Temp =  (uint *)(BaseAddr+0x2AAA);	// set up address to be C000:2AAAh             
        *Temp = 0x5555;			// write data 0x5555 to the address 
           
        Temp =  (uint *)(BaseAddr+0x5555);	// set up address to be C000:5555h            
        *Temp = 0xA0A0;			// write data 0xA0A0 to the address
             
        Temp = DestBuf;			// save the original Destination address             
        *DestBuf++ = *SourceBuf++;	// transfer data from source to destination
		cs_flash_1;
            
        flag = Check_Toggle_Ready(Temp);// wait for TOGGLE bit to get ready 
        if(flag == 0) return 0;     	// failed  
	}
    return 1;				// success
}  
#endif
 

uint Check_Toggle_Ready (uint  *Dst)
{	
    uchar Loop = TRUE;
    uint PreData;
    uint CurrData;
    unsigned long TimeOut = 0;
        
	cs_flash_0;
    PreData = *Dst;
    PreData = PreData & 0x4040;
    while (Loop)
    {
		CurrData = *Dst;
        CurrData = CurrData & 0x4040;
        if (PreData == CurrData)
        	Loop = FALSE;   /* ready to exit the while loop */
		PreData = CurrData;
        TimeOut++;
        if(TimeOut >= 0x07FFFFFF)
        {
        	cs_flash_1;
            return 0;	// failed
		}
	}
    cs_flash_1;
    return 1;	// success
}   

#ifdef PROMATIC 
void Check_Data_Polling (uint  *Dst, uint TrueData)
{
    uchar Loop = TRUE;
    uint CurrData;
    unsigned long TimeOut = 0;

    TrueData = TrueData &  0x8080;
    while ((TimeOut< 0x07FFFFFF) && (Loop))
    {
    	cs_flash_0;  
        feedWatchDog();
        CurrData = *Dst;
        CurrData = CurrData & 0x8080;
        if (TrueData == CurrData)
        {
        	cs_flash_1;
            Loop = FALSE;   /* ready to exit the while loop  */
		}
        TimeOut++;
	}
    cs_flash_1;
}  
#endif
/////////////////////////////////////////////////////

void readOneCfg(uint loc)
{
	uint *temp;
	uint i;
	uint addr = 0x8000;	 
	cs_flash_0; 
	for(i=0;i<8;i++)
	{
		temp =  (uint *)(addr+loc*8+i);
		cfgdata[loc*8+i] = *temp; 	
	} 
	cs_flash_1;
}

/* 1: success,	0: failed*/
uint writeOneDefaultCfg(uint loc)
{
	uint *temp;
	uint i;
	uint flag; 
	uint addr = 0x8000;	
    
    cs_flash_0;
	for(i=0;i<112;i++)
	{
		cfgdata[i] = *( (uint *)(0x8000+i) );		
	}	//将flash中数据cfg0~cfg13全部读出 
	cs_flash_1;
	
	if(loc == 1)		para1def();
	else if(loc == 2)	para2def();
	else if(loc == 3)	para3def();
	else if(loc == 5)	para5def();
	else if(loc == 8)	para8def();
	else if(loc == 10)	para10def();
	else if(loc == 11)	para11def();
	else if(loc == 12)	para12def();
	else if(loc == 13)	para13def();	//将要缺省配置的数据写进缓存
	
	flag = Erase_One_Sector((uint*)0x8000);
	if(flag == 0) return flag;	//擦除一块2k字
	
	addr = 0x8000;
	for(i=0;i<112;i++)
	{		
		flag = Program_One_Word (cfgdata[i], (uint *)addr);
		if(flag == 0) return flag;
		addr++;
	}	//对224字节编程	
	return 1;
}


/* 1: success,	0: failed*/
uint  writeOneCfg(uint loc)
{
	uint *temp;
	uint i;
	uint flag; 
	uint addr = 0x8000;	
    
    cs_flash_0;
	for(i=0;i<112;i++)
	{
		cfgdata[i] = *( (uint *)(0x8000+i) );	
	}	//将flash中数据cfg0~cfg13全部读出 
	cs_flash_1;
	
	for(i=0;i<7;i++)cfgdata[loc*8+i] = 0;//先将要配置的数据清0
	for(i=0;i<14;i++)
	{		
		if(i%2==0)cfgdata[loc*8+i/2] |= pcdata[4+i]<<8;		
		else	cfgdata[loc*8+i/2] |= pcdata[4+i];
	}	//将要改写的数据写入cfgdata
	flag = Erase_One_Sector((uint*)0x8000);
	if(flag == 0) return flag;	//擦除一块2k字
	
	addr = 0x8000;
	for(i=0;i<112;i++)
	{		
		flag = Program_One_Word (cfgdata[i], (uint *)addr);
		if(flag == 0) return flag;
		addr++;
	}	//对224字节编程	
	return 1;
}
/* 1: success,	0: failed*/
uint  writeAllCfg( )
{
	uint i;
	uint flag; 
	uint addr = 0x8000;	

	flag = Erase_One_Sector((uint*)0x8000);
	if(flag == 0) return flag;	//擦除一块2k字	
	
	addr = 0x8000;
	for(i=0;i<112;i++)
	{		
		flag = Program_One_Word (cfgdata[i], (uint *)addr);
		if(flag == 0) return flag;
		addr++;
	}	//对224字节编程		
	return 1;
}
void readAllCfg(void)
{
	uint i;
	cs_flash_0;
	for(i=0;i<112;i++)
	{
		cfgdata[i] =  *( (uint*)(0x8000+i) );
	}	
	cs_flash_1;
}

⌨️ 快捷键说明

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