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

📄 flash.c

📁 29w160dt bsp源程序
💻 C
字号:

#include "myfile.h"

uchar far rg_Flash1_addr  _at_ 0x800000;
uchar far rg_Flash1_aaa   _at_ 0x800aaa;
uchar far rg_Flash1_555   _at_ 0x800555; 
uchar far rg_Flash2_addr  _at_ 0x800000;
uchar far rg_Flash2_aaa   _at_ 0xa00aaa;
uchar far rg_Flash2_555   _at_ 0xa00555; 

uchar FlashProgram(ulong addr,uchar cshu);
uchar FlashErase(ulong addr);
uchar FlashBlockErase(ulong addr);
uchar FlashEraseChip(ulong addr);
void FlashReadGroup(ulong cl_AddrStar,uchar *pcl_DataStar,uchar cl_Len);
uchar FlashProgramGroup(ulong cl_AddrStar,uchar *pcl_DataStar,uchar cl_Len);

extern void delay(uchar shu);
//////////////////////////////////////////////////////// 
//返回值  =0  ---操作正确
//       !=0 ---操作失败
///////////////////////////////////////////////////////
uchar FlashProgram(ulong addr,uchar cshu)
{
	uchar cl_Buffer1;
	uchar cl_Return;
	uchar far *prl_Flash1;
	uchar far *prl_Flash2;
	uint  cl_Count;
    //初始化返回值//
	cl_Return = 0x55;
	prl_Flash1 = &rg_Flash1_addr;
	prl_Flash2 = &rg_Flash1_addr;
	cl_Buffer1 = P4;
	cl_Buffer1 &= 0x4;
	if(cl_Buffer1 != 0)
	{
		if(addr < 200000)
		{
		    prl_Flash1 = &rg_Flash1_aaa;
			*prl_Flash1 = 0xaa;
			prl_Flash1 = &rg_Flash1_555;
			*prl_Flash1 = 0x55;
			prl_Flash1 = &rg_Flash1_aaa;
			*prl_Flash1 = 0xa0;
			prl_Flash1 = &rg_Flash1_addr;
			prl_Flash1 += addr;
			*prl_Flash1 = cshu;
		
			cl_Count = 0x0;
	        do
			{
				cl_Buffer1 = P4;
				cl_Buffer1 &= 0x4;
			}while ((cl_Buffer1 == 0) && (cl_Count < 65535)); 
			
			if(cl_Count > 65534)
			{
				cl_Buffer1 = *prl_Flash1;
				cl_Buffer1 &= 0x20;
				if(cl_Buffer1 != 0)
				{
					cl_Return = 0x55;
				}
				else
				{
					cl_Return = 0x0;
				}
			}
			else
			{
				cl_Return = 0x0;
			}
		}
		else
		{
			prl_Flash2 = &rg_Flash2_aaa;
			*prl_Flash2 = 0xaa;
			prl_Flash2 = &rg_Flash2_555;
			*prl_Flash2 = 0x55;
			prl_Flash2 = &rg_Flash2_aaa;
			*prl_Flash2 = 0xa0;
			prl_Flash2 = &rg_Flash2_addr;
			prl_Flash2 += addr;
			*prl_Flash2 = cshu;
		
			cl_Count = 0x0;
	        do
			{
				cl_Buffer1 = P4;
				cl_Buffer1 &= 0x4;
			}while ((cl_Buffer1 == 0) && (cl_Count < 65535)); 
			
			if(cl_Count > 65534)
			{
				cl_Buffer1 = *prl_Flash2;
				cl_Buffer1 &= 0x20;
				if(cl_Buffer1 != 0)
				{
					cl_Return = 0x55;
				}
				else
				{
					cl_Return = 0x0;
				}
			}
			else
			{
				cl_Return = 0x0;
			}
		}   
	}
	
	return(cl_Return);
}
//////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////
uchar FlashEraseChip(ulong addr)
{
	uchar cl_Buffer1;
	uchar cl_Return;

	uchar far *prl_Flash1;
	uchar far *prl_Flash2;
	prl_Flash1 = &rg_Flash1_addr;
	prl_Flash2 = &rg_Flash1_addr;
	cl_Buffer1 = P4;
	cl_Buffer1 &= 0x4;
	
	//返回值预置为无效值//
	cl_Return = 0x55;
	
	if(cl_Buffer1 != 0)
	{
		if(addr > 0x200000)
		{
		 	prl_Flash1 = &rg_Flash1_aaa;
		 	*prl_Flash1 = 0xaa;
		 	prl_Flash1 = &rg_Flash1_555;
		 	*prl_Flash1 = 0x55;
		 	prl_Flash1 = &rg_Flash1_aaa;
		 	*prl_Flash1 = 0x80;
		 	*prl_Flash1 = 0xaa;
		 	prl_Flash1 = &rg_Flash1_555;
		 	*prl_Flash1 = 0x55;
		 	prl_Flash1 = &rg_Flash1_aaa;
		 	*prl_Flash1 = 0x10;
	
			delay(100);
	
			//judg erase over
			do
			{
				cl_Buffer1 = P4;
				cl_Buffer1 &= 0x4;
			}while (cl_Buffer1 == 0); 
		}
		else
		{
			prl_Flash2 = &rg_Flash2_aaa;
		 	*prl_Flash2 = 0xaa;
		 	prl_Flash2 = &rg_Flash2_555;
		 	*prl_Flash2 = 0x55;
		 	prl_Flash2 = &rg_Flash2_aaa;
		 	*prl_Flash2 = 0x80;
		 	*prl_Flash2 = 0xaa;
		 	prl_Flash2 = &rg_Flash2_555;
		 	*prl_Flash2 = 0x55;
		 	prl_Flash2 = &rg_Flash2_aaa;
		 	*prl_Flash2 = 0x10;
	
			delay(100);
	
			//judg erase over
			do
			{
				cl_Buffer1 = P4;
				cl_Buffer1 &= 0x4;
			}while (cl_Buffer1 == 0); 
		}
	}
	
	return(cl_Return);
}
///////////////////////////////////////////////////////
//
//
///////////////////////////////////////////////////////
uchar FlashBlockErase(ulong addr)
{
	uchar cl_Buffer1;
	uchar cl_Return;
	uchar far *prl_Flash1;
	uchar far *prl_Flash2;
	prl_Flash1 = &rg_Flash1_addr;
	prl_Flash2 = &rg_Flash2_addr;
	cl_Buffer1 = P4;
	cl_Buffer1 &= 0x4;
	
	//返回值预置为无效值//
	cl_Return = 0x55;
	
	if(cl_Buffer1 != 0)
	{
		if(addr > 0x200000)
		{
		 	prl_Flash1 = &rg_Flash1_aaa;
		 	*prl_Flash1 = 0xaa;
		 	prl_Flash1 = &rg_Flash1_555;
		 	*prl_Flash1 = 0x55;
		 	prl_Flash1 = &rg_Flash1_aaa;
		 	*prl_Flash1 = 0x80;
		 	*prl_Flash1 = 0xaa;
		 	prl_Flash1 = &rg_Flash1_555;
		 	*prl_Flash1 = 0x55;
		 	prl_Flash1 = &rg_Flash1_addr;
		 	prl_Flash1 += addr;
		 	*prl_Flash1 = 0x30;
		 	
		 	delay(1);
	
	        //judg erase over
			do
			{
				cl_Buffer1 = P4;
				cl_Buffer1 &= 0x4;
			}while (cl_Buffer1 == 0); 
		}
		else
		{
		 	prl_Flash2 = &rg_Flash2_aaa;
		 	*prl_Flash2 = 0xaa;
		 	prl_Flash1 = &rg_Flash2_555;
		 	*prl_Flash2 = 0x55;
		 	prl_Flash2 = &rg_Flash2_aaa;
		 	*prl_Flash2 = 0x80;
		 	*prl_Flash2 = 0xaa;
		 	prl_Flash2 = &rg_Flash1_555;
		 	*prl_Flash2 = 0x55;
		 	prl_Flash2 = &rg_Flash2_addr;
		 	prl_Flash2 += addr;
		 	*prl_Flash2 = 0x30;
		 	
		 	delay(1);
	
	        //judg erase over
			do
			{
				cl_Buffer1 = P4;
				cl_Buffer1 &= 0x4;
			}while (cl_Buffer1 == 0); 
		}			
	}
		
	return(cl_Return);
}

///////////////////////////////////////////////////////		 	
//返回值  =0  ---操作正确
//       !=0 ---操作失败
///////////////////////////////////////////////////////	
/*
uchar ProgramJudgFlash1(uchar cshu)
{
	uchar far *prl_Flash1;
	uchar cl_Status1;
	uchar cl_Status2;
	uchar cl_Return;
	prl_Flash1 = &rg_Flash1_addr;
	do
	{
		delay(1);
		cl_Status1 = *prl_Flash1;
		cl_Status2 = cl_Status1;
		
		//DQ7 poll  bit
		cl_Status1 &= 0x80;  
		
		cshu &= 0x80;
		//DQ5 error bit    
		cl_Status2 &= 0x20;	
			
		if(cl_Status1 == cshu)
		{
			cl_Return = 0;
		}
		else if(cl_Status2 != 0)
		{
			
			cl_Status1 = *prl_Flash1;
			cl_Status1 &= 0x80;
			if(cl_Status1 == cshu)
			{
				cl_Return = 0;
			}
			else
			{
				cl_Return = 0x55;
			}
			
			//reset error
			*prl_Flash1 = 0xf0;
		}
	//判断是否写完("cl_Status" flash的状态寄存器)	
	} while((cl_Status1 != cshu) && (cl_Status2 == 0));
	return(cl_Return);
}
*/
//////////////////////////////////////////////////////////
//返回值  =0  ---操作正确
//       !=0 ---操作失败
/////////////////////////////////////////////////////////
/*
uchar ProgramJudgFlash2(uchar cshu)
{
	uchar far *prl_Flash2;
	uchar cl_Status1;
	uchar cl_Status2;
	uchar cl_Return;
	prl_Flash2 = &rg_Flash1_addr;
	do
	{
		cl_Status1 = *prl_Flash2;
		cl_Status2 = cl_Status1;
		
		//DQ7 poll  bit
		cl_Status1 &= 0x80;  
		cshu &= 0x80;
		//DQ5 error bit    
		cl_Status2 &= 0x20;	
			
		if(cl_Status1 == cshu)
		{
			cl_Return = 0;
		}
		else if(cl_Status2 != 0)
		{
			cl_Status1 = *prl_Flash2;
			cl_Status1 &= 0x80;
			if(cl_Status1 == cshu)
			{
				cl_Return = 0;
			}
			else
			{
				cl_Return = 0x55;
			}
			
			//reset error
			*prl_Flash2 = 0xf0;
		}
	//判断是否写完("cl_Status" flash的状态寄存器)	
	} while((cl_Status1 != cshu) && (cl_Status2 == 0));

	return(cl_Return);
}
*/
////////////////////////////////////////////////////////////////
//
//
///////////////////////////////////////////////////////////////

void FlashReadGroup(ulong cl_AddrStar,uchar *pcl_DataStar,uchar cl_Len)
{
	uchar i;
	uchar cl_Buffer1;
	uchar far *prl_Flash1;
	uchar far *prl_Flash2;
	
	prl_Flash1 = &rg_Flash1_addr;
	prl_Flash2 = &rg_Flash2_addr;
	
	cl_Buffer1 = P4;
	cl_Buffer1 &= 0x4;
	
	if(cl_Buffer1 != 0)
	{
		 if(cl_AddrStar < 0x1fffff)
		 {
		 	// reset read mode
		    *prl_Flash1 = 0xf0;

			prl_Flash1 += cl_AddrStar;
			for(i = 0;i < cl_Len;i ++)
			{ 
		 		*pcl_DataStar = *prl_Flash1;
				prl_Flash1 ++;
				pcl_DataStar ++;
			}
		 
		 }
		 else
		 {
		 	// reset read mode
		    *prl_Flash2 = 0xf0;

			prl_Flash2 += cl_AddrStar;
			for(i = 0;i < cl_Len;i ++)
			{ 
		 		*pcl_DataStar = *prl_Flash2;
				prl_Flash2 ++;
				pcl_DataStar ++;
			}
		 
		 }
	}	
}

/////////////////////////////////////////////////////////////////////////
//
//
////////////////////////////////////////////////////////////////////////	

uchar FlashProgramGroup(ulong cl_AddrStar,uchar *pcl_DataStar,uchar cl_Len)
{
	uchar i;
	uchar cl_Buffer;
	for(i = 0;i < cl_Len;i ++)
	{
		cl_Buffer =	FlashProgram(cl_AddrStar,*pcl_DataStar);		 
		pcl_DataStar ++;
		cl_AddrStar ++;
		
	}
	
	return (cl_Buffer);
}

⌨️ 快捷键说明

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