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

📄 flash.c

📁 FLASH操作程序SST39VF160(2MB)
💻 C
字号:
//**********************************************************************
//功能		: SST39VF160操作子程序
//作者		: lihj
//创建日期	: 2004-06-19
//版本		: V1.0
//修改记录	:
//***********************************************************************

//单位:1us
void delay_n_us(unsigned int n)
{
 	unsigned int i,j;
 	
 	for (j=0; j<n; j++) 
   	{
   		for (i=0; i<5; i++);
   	}
}


//单位:1ms
void delay_n_ms(unsigned int n)
{
 	unsigned int i,j;
 	for (j=0; j<n; j++) 
    {
     	for (i=0; i<5600; i++);
    }
}


// erase one sector(04K bytes)
void SectorErase(void *addr)
{
	unsigned int i;
 	volatile unsigned short *Temp1,*Temp2 ;
 	
 	i = (unsigned int)addr;
	Temp1 = (unsigned short *)(((0x5555)<<1) | (i & 0xffc00000));
	Temp2 = (unsigned short *)(((0x2aaa)<<1) | (i & 0xffc00000));	

	*Temp1 = 0xaa;
	*Temp2 = 0x55;
	*Temp1 = 0x80;			
	*Temp1 = 0xaa;			
	*Temp2 = 0x55;

	Temp1 = (unsigned short *)(addr);
	*Temp1 = 0x30;
        
    delay_n_ms(18);		//waiting for 18ms
}


// erase one block(64K bytes)
void BlockErase(void *addr)
{
	unsigned int i;
 	volatile unsigned short *Temp1,*Temp2 ;
 
	i = (unsigned int)addr;
	Temp1 = (unsigned short *)(((0x5555)<<1) | (i & 0xffc00000));
	Temp2 = (unsigned short *)(((0x2aaa)<<1) | (i & 0xffc00000)); 	

	*Temp1 = 0xaa;
	*Temp2 = 0x55;
	*Temp1 = 0x80;			
	*Temp1 = 0xaa;			
	*Temp2 = 0x55;

	Temp1 = (unsigned short *)(addr);
	*Temp1 = 0x50;
        
   	delay_n_ms(18);		//waiting for 18ms
}


// erase one chip  (02M bytes)
void ChipErase(void)		
{
	volatile unsigned short *Temp1,*Temp2 ;
 	 	
 	Temp1 = (unsigned short *)(((0x5555)<<1) | 0x1000000);
 	Temp2 = (unsigned short *)(((0x2aaa)<<1) | 0x1000000);
 	
 	*Temp1 = 0xaa;
	*Temp2 = 0x55;
	*Temp1 = 0x80;			
	*Temp1 = 0xaa;			
	*Temp2 = 0x55;
	*Temp1 = 0x10;
 	
 	delay_n_ms(70);		//waiting for 70ms
}


//write one word(2 bytes)
char WordProgram(void *addr, unsigned short inDat)	
{
	unsigned int i;
 	volatile unsigned short *Temp1,*Temp2 ;
 	
 	i = (unsigned int)addr;
	Temp1 = (unsigned short *)(((0x5555)<<1) | (i & 0xffc00000));
	Temp2 = (unsigned short *)(((0x2aaa)<<1) | (i & 0xffc00000));
	
	*Temp1 = 0xaa;
	*Temp2 = 0x55;			
	*Temp1 = 0xa0;
				
	*((unsigned short *)addr) = inDat;
					
	delay_n_us(15);       	// Waiting for 15 us
 	
 	if (*((unsigned short *)addr) == inDat) 
 	{
		return 0;   
	}
	else
    {
   		return 1;
	}
}


/****************************************************************************************/
/* Function Name	: WriteFlash							*/
/* Object            	: write flash			                        	*/
/* Input Parameters  	: <Des>	= the Destination Address   				*/
/*                   	: <Src>	= the Source Address          				*/
/*			: <Num>	= quantity of bytes that to be write  			*/
/* Output Parameters 	: 0 - right, 1 - wrong                                     	*/
/****************************************************************************************/
char WriteFlash(void *Des, void *Src, unsigned int Num)
{
	unsigned int 	i;
	unsigned short 	*DesAddr, *SrcAddr, *BaseAddr;
		
	i = (unsigned int)Src;
	SrcAddr = (unsigned short *)(i & 0xfffffffe);
	i = (unsigned int)Des;
	DesAddr = (unsigned short *)(i & 0xfffffffe);
	BaseAddr= (unsigned short *)(i & 0xfffff000);
	
	for (i=0; i<Num; i+=2)
	{
		if ((((unsigned int)DesAddr-(unsigned int)BaseAddr)&0XFFF)==0)	
		{
			SectorErase(DesAddr);
		}

		if (WordProgram(DesAddr++,*SrcAddr++))	
		{
			return 1;
		}
	}
	
	return 0;
}




⌨️ 快捷键说明

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