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

📄 jerry_isp.c

📁 自制的SyncMos的ISP下载源程序
💻 C
字号:
/*--------------------------------------------------------
WenISP服务程序: Wenmain.c
版    本:V1.00
编译工具:keil C51 7.20
所用 MCU:SyncMos's SM59264(PLCC)
作    者:文庆平
日    期:2005/02/24--->2005/03/30
版本来源:aclck100-->wenmain.c
---------------------------------------------------------*/
#pragma DEBUG CODE
#include <reg52.h>                
//#define V_T0 0xee00		 	//5ms  11.0592MHz 16位计数,mode1  
#define BUFSIZE 512
#define PAGESIZE 512
#define SIOTIMEOUT 65535	//123456 ge个循环
#define XBYTE ((unsigned char volatile code *) 0)

//以下为变量定义
sfr SCONF=0xbf;				//SM59264的寄存器	
sfr ISPFAH=0xf4;			//SM59264的寄存器	
sfr ISPFAL=0xf5;			//SM59264的寄存器	
sfr ISPFD=0xf6;				//SM59264的寄存器	
sfr ISPC=0xf7;				//SM59264的寄存器	
sfr P4=0xd8;				//SM59264的寄存器	?
sfr WDTKEY=0x97;			//SM59264的寄存器	
sfr WDTC=0x9f;				//SM59264的寄存器	
sfr	IICA=0xC1;

//sfr T2CON=0xc8;
sfr T2MOD=0xc9;
sfr DBANK=0x86;
sfr RCON=0x85;
sfr P1CON=0x9b;

union UnInt2Byte{
	unsigned int IntPart;
	unsigned char Byte[2];
};
bit BoolVerifyOk;
union UnInt2Byte data FrameLength;
union UnInt2Byte data AddrCount;

unsigned char data ReState,CheckSum,DriveID,ReData;
unsigned char xdata ReBuf[BUFSIZE+2];
unsigned int data FrameLengthCount;
unsigned int data SioTimeOut;

unsigned char code HeaderStr[]="<CST$>";
void serial(void);
void proisp(void);
void overwrite(void);
void SendBackByte(unsigned char);
void main(void) using 0
{	DriveID=0x0b;
	IICA=0x36;

   	SCONF=0x06;				//#0000 0110b;ISP enable of bit2     
	P1CON=0;
	TMOD=0x21;				//time0:mode1 时标 time1:mode2 baud
	SCON=0x50;	
	PCON=0x80;
	TH1=0xff;				//57600
	TR1=1;
	T2CON=0;
	T2MOD=0;
	TR0=0;
	TR2=0;
	RI=0;
	TI=0;

	EX0=0;
	ET0=0;
	EX1=0;
	ET1=0;
	ET2=0;
	ES=0;
	IE=0;
	EA=0;
	WDTKEY=0x1e;
	WDTKEY=0xe1;
	WDTC=0x20;
	WDTKEY=0xe1;
	WDTKEY=0x1e;


	P1=0xff;				//on sio_txd_en
	P3=0xff;
	P4=0x0f;
	SioTimeOut=0;
	ReState=0;

	ISPFD=0x55;
	ISPFD=0xaa;
	ISPFD=0x55;
	if(IICA!=0x36)
		DriveID=0x0a;
	for(;;)
    	{
	   
		if(RI)
			serial();
						//--------------超时错检查
		if(SioTimeOut)
			{
			SioTimeOut--;
			if(SioTimeOut==0)
				ReState=0;
			}
		}
}
/*************************************************/		
void serial(void) //--------------接收数据
{   

	RI=0;
    ReData=SBUF;	
	SioTimeOut=SIOTIMEOUT;
	switch(ReState)
		{
		case 0:				//"<CST$>"
		case 1:	
		case 2:	
		case 3:	
		case 4:	
		case 5:
				if(ReData==HeaderStr[ReState])
					ReState++;
				else
					 ReState=0;
	 		   	break;
		case 6:			// ID
				ReState++;
			    	break;
		case 7:
				FrameLength.Byte[0]=ReData;
				ReState++;
	    		break;
		case 8:	
				FrameLength.Byte[1]=ReData;
				ReState++;
				CheckSum=0;
				FrameLengthCount=0;
 		    	break;
		case 9:
				ReBuf[FrameLengthCount]=ReData;
				FrameLengthCount++;
				CheckSum=CheckSum+ReData;
				if(FrameLengthCount==FrameLength.IntPart)
					ReState++;
				break;
		case 10:ReState=0;
				if(ReData==CheckSum)
					proisp();
				else
				 	SendBackByte('E');
				break;
			}
}
void readid(void)
{		SendBackByte('Y');
		SendBackByte('<');
		SendBackByte('C');
		SendBackByte('S');
		SendBackByte('T');
		SendBackByte('$');
		SendBackByte('>');
		SendBackByte(DriveID);
}
void chip_erase(void)
{		ISPC=0x83; 			// fau0=1; ispf1 f0=11;
//		WaitForEnd();
		overwrite();
		SendBackByte('Y');
}
void chip_protect(void)
{	ISPC=0x81; 			// fau0=1; ispf1 f0=01;
//	WaitForEnd();
	SendBackByte('Y');
}
void chip_reset(void)
{		SendBackByte('Y');
		WDTKEY=0x1e;
		WDTKEY=0xe1;
		WDTC=0xa0;
		WDTKEY=0xe1;
		WDTKEY=0x1e;
		while(1);
}
void page_erase(void)
{		ISPFAH=ReBuf[1];	
		ISPFAL=ReBuf[2];
		ISPC=0x82;			// code flash fau0=0; ispf1 f0=10;
//		WaitForEnd();
		SendBackByte('Y');
}
void page_program(void)
{unsigned int i,addr;			
		AddrCount.IntPart=ReBuf[1]*PAGESIZE;
		ISPFAH=AddrCount.Byte[0];	
		ISPFAL=AddrCount.Byte[1];
		ISPC=0x82;					// code flash fau0=0; ispf1 f0=10;
	//	WaitForEnd();
		for(i=0;i<PAGESIZE;i++)					//页编程
			{
			ISPFAH=AddrCount.Byte[0];	
			ISPFAL=AddrCount.Byte[1];	
			ISPFD=ReBuf[i+2];
			AddrCount.IntPart++;
			ISPC=0x80;				// code flash fau0=0; ispf1 f0=00;
	//		WaitForEnd();		
			}
				//页校对
		BoolVerifyOk=1;
		AddrCount.IntPart=ReBuf[1]*PAGESIZE;
		for(i=0;i<PAGESIZE;i++)
			{
			addr=AddrCount.IntPart+i;
			if(ReBuf[i+2]!=XBYTE[addr])
				{
				BoolVerifyOk=0;
				overwrite();
				SendBackByte('V');		//校验错
				break;
				}
			}
		if(BoolVerifyOk)
			SendBackByte('Y');		//校验对
}
/*******************************************/
void proisp(void)
{	switch(ReBuf[0])
		{
		case 1:	readid();		//读芯片ID
				break;
		case 2:	chip_erase();	//芯片擦除	
				break;
		case 3:				//保护功能
				chip_protect();
				break;
		case 4:				//ISP mode --> User mode CPU复位 利用看门狗复位
				chip_reset();
				break;
		case 5:			//页擦除
				page_erase();
				break;
		case 6:			//页编程(页擦除,页编程,页校对)
				page_program();
				break;
		default: break;
		}	
}

void SendBackByte(unsigned char feedbyte)
{
	TI=0;
	SBUF=feedbyte;
	while(TI==0);
	TI=0;
}
/*void WaitForEnd()
{
	do{	}while(ISPC>0x7f);
		
}*/
void overwrite(void)
{	ISPFAH=0;
	ISPFAL=0;
	ISPFD=0x02;
	ISPC=0x80;			
//	WaitForEnd();
	ISPFAL=1;
	ISPFD=0xfc;
	ISPC=0x80;			
//	WaitForEnd();
	ISPFAL=2;
	ISPFD=0x00;
	ISPC=0x80;			
//	WaitForEnd();
}

⌨️ 快捷键说明

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