📄 jerry_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 + -