?? 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 + -