📄 prg0.cpp
字号:
Sum=0; //累加和
for(int i=0;i<(int)SBuf[1]-1;i++)Sum+=(int)SBuf[i+2]; //计算累加和
SBuf[SBuf[1]+1]=Sum;
SBuf[0]=FStartComm232; //0x88
r=WriteFile(HComm232,SBuf,Len,&Lenx,NULL);
if(!r || Len!=Lenx)return ERRCOMM;
}
else return ERRLEN;
//RX
// if(Receive232())return ERRCOMM;
//分析接收到的回答数据
// if(RBuff[0]!=CMD_OK)
// {
// return ERRCOMM;
// }
// if(CommType)
// if(Receive232())return ERRCOMM;
return COMMOK;
}
BOOL CPrg0::Receive232()
{
time_t stime, ctime;
BYTE Sum;
DWORD i,Lenx,Len;
BOOL r;
time( &stime ); //起始时间: 设置超时--1s
ErrByte=ErrCode0=ErrCode1=ErrSum=ErrNull=ErrTimeOut=0;
//Rst: //接收数据长度
ErrNull=1;
Re0:
r=ReadFile(HComm232,RBuf,1,&Lenx,NULL); //read the flag
if(r && Lenx)
{ if(RBuf[0]==FStartComm232)
{r=ReadFile(HComm232,RBuf,1,&Lenx,NULL); //read the len
if(r && Lenx)
{ Len=RBuf[0];
if(!RBuf[0] || Len>MAXLEN)return ERRCOMM;
}
else return ERRCOMM;
}
else goto Re0; //return ERRCOMM;
}
else return ERRCOMM;
//接收回答数据
ErrNull=0;
ErrTimeOut=1;
Sum=0; //累加和
for(i=0;i<Len;i++)
{
ReRD: r=ReadFile(HComm232,&RBuf[i],1,&Lenx,NULL);
if(!r || !Lenx)
{ time(&ctime); //当前时间
if(difftime(ctime,stime)>=1)return ERRCOMM;
else goto ReRD;
}
else if(i<(Len-1))Sum+=RBuf[i];
}
//检查累加和
ErrTimeOut=0;
len_rcv=(BYTE)Len;
if(Sum!=RBuf[Len-1]){ErrSum=1; return ERRCOMM;}
else return COMMOK;
}
void CPrg0::OnDspFile()
{
int i,j;
BYTE aa=0;
char DspString[100];
DspString[0]=13; DspString[1]=10;
m_Dsp=_T("");
for(i=0;i<MAXLINESINONEPAGE;i++)
{sprintf(&DspString[2],"%06X ",Cur_Ptr); //ADDR
m_Dsp+=_T(&DspString[2]);
Cur_Ptr+=MAXBYTESINONELINE;
for(j=0;j<MAXBYTESINONELINE;j++) //dsp w-file
{if((Cur_FilePtr+j)>=FileLen)sprintf(&DspString[2]," ");
else sprintf(&DspString[2],"%02X ",w[Cur_FilePtr+j]); //DATA
m_Dsp+=_T(&DspString[2]);
}
sprintf(&DspString[2]," ");
m_Dsp+=_T(&DspString[2]);
Cur_FilePtr+=MAXBYTESINONELINE;
for(j=0;j<MAXBYTESINONELINE;j++) //dsp r-data
{if((Cur_RDataPtr+j)>=RDataLen)sprintf(&DspString[2]," ");
else sprintf(&DspString[2],"%02X ",r[Cur_RDataPtr+j]); //DATA
m_Dsp+=_T(&DspString[2]);
}
Cur_RDataPtr+=MAXBYTESINONELINE;
if(i==(MAXLINESINONEPAGE-1))break;
DspString[2]='\0';
m_Dsp+=_T(DspString);
}
UpdateData(FALSE);
}
void CPrg0::OnNextpage()
{
OnDspFile();
if(Cur_Ptr>=MaxLen)B_NextPage=0;
if(Cur_Ptr>(MAXLINESINONEPAGE*MAXBYTESINONELINE))B_LastPage=1;
else B_LastPage=0;
DspButton();
}
void CPrg0::OnLastpage()
{
DWORD x;
x=(MAXLINESINONEPAGE*MAXBYTESINONELINE)*2;
if(Cur_Ptr>x){Cur_Ptr-=x; Cur_FilePtr-=x; Cur_RDataPtr-=x;}
else {Cur_Ptr=Cur_FilePtr=Cur_RDataPtr=0;}
OnDspFile();
// if(Cur_Ptr<0){Cur_Ptr=0; Cur_FilePtr=0; Cur_RDataPtr=0;}
if(Cur_Ptr<=(x/2))B_LastPage=0;
if(Cur_Ptr<MaxLen)B_NextPage=1;
DspButton();
}
void CPrg0::OnClearfilebuf()
{
Dsp_flag=0;
rfile_flag=wfile_flag=0;
Cur_FilePtr=Cur_RDataPtr=0;
MaxLen=Cur_Ptr=0;
FileLen=RDataLen=0;
m_Dsp=_T("");
B_NextPage=B_LastPage=B_BufClr=B_BufLocate=0;
m_DspState = _T("缓冲区数据已经清除");
// UpdateData(FALSE);
DspButton();
Dsp_flag=1;
}
void CPrg0::OnLocatebuf()
{
CFileAcess dlg;
dlg.flag=2;
tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
m_DspState = _T("选择显示缓冲区数据");
UpdateData(FALSE);
int r=dlg.DoModal();
if(r!=IDOK)return;
// if(dlg.FileLen>MaxLen)
// { char s[100];
// sprintf(s,"\n指定位置%d超出缓冲区长度%d!!\n",dlg.FileLen,MaxLen);
// AfxMessageBox(s);
// return;
// }
if(dlg.FileLen>=MaxLen)
{if(MaxLen>(MAXLINESINONEPAGE*MAXBYTESINONELINE))
{Cur_Ptr=MaxLen-MAXLINESINONEPAGE*MAXBYTESINONELINE;
Cur_FilePtr=Cur_Ptr; Cur_RDataPtr=Cur_Ptr;
}
else {Cur_Ptr=Cur_FilePtr=Cur_RDataPtr=0;}
}
else {Cur_Ptr=dlg.FileLen; Cur_FilePtr=Cur_RDataPtr=Cur_Ptr;}//
m_DspState = _T("请选择操作类型");
// UpdateData(FALSE);
OnNextpage();
// Dsp_flag=1;
}
void CPrg0::OnVerify()
{
tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
if(!rfile_flag)
{AfxMessageBox("缓冲区中没有数据!\n\n请先选择读取 FLASH 数据操作。");
return;
// OnRead();
// if(!rfile_flag)return;
}
else if(!wfile_flag)
{AfxMessageBox("缓冲区中没有文件数据!\n\n请先选择打开文件操作,装载文件数据。");
return;
}
m_DspState = _T("正在进行校验...");
B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=B_BufClr=0;
DspButton();
for(int i=0;i<(int)__min(FileLen,RDataLen);i++)
{if(w[i]!=r[i])
{char ss[100];
sprintf(ss,"校验错:\n\n地址:%06x\n 缓冲区数据:%02x\n 数据:%02x\n",i,w[i],r[i]);
AfxMessageBox(ss);
break;
}
}
AfxMessageBox("校验完毕。");
m_DspState = _T("请选择操作类型");
Stopx(0);
// Dsp_flag=1;
}
void CPrg0::OnStopx()
{
tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
if(in_erase || in_prgF || in_readF)
{ tmp=m_DspState;
m_DspState = _T("终止当前操作?");
UpdateData(FALSE);
if(DspHint()!=IDOK)
{m_DspState = tmp;
UpdateData(FALSE);
return;
}
Stopx(1);
}
else //reset the flash IC
{ if(Comm_Test(1))return;
if(!PrepareComm(CMD_RSTFLASH))m_DspState = _T("正在执行FLASH芯片复位操作...");
else {DspErrMessage("发送指令时出错!"); return;}
b_Stop->EnableWindow(FALSE);
UpdateData(FALSE);
int cnt=0,r;
Cur_progressPtr=10;
Rcvx: if((r=Rcv0())==CMD_CHIP_ID)
{m_DspState = _T("FLASH芯片已经复位。");
ID_MCH=RBuf[1];
ID_MCL=RBuf[2];
ID_DCH=RBuf[3];
ID_DCL=RBuf[4];
m_Progr.SetPos(100);
DspID(1);
}
else if(r==CMD_OK)goto Rcvx;
else
{if(cnt<10 && !r)
{cnt++;
m_Progr.SetPos(Cur_progressPtr);
Cur_progressPtr+=9;
UpdateData(FALSE);
Sleep(30);
goto Rcvx;
}
m_DspState = _T("执行FLASH芯片复位操作时出错!");
ErrCode1=RBuf[1];
ErrCode0=RBuf[2]; // in_erase=in_prgF=in_readF=0;
DspErrRcv();
}
b_Stop->EnableWindow(TRUE);
UpdateData(FALSE);
Dsp_flag=1; Dsp_Cnt=0;
}
}
void CPrg0::DspID(int flag) //flag: 0--clear
{
char s[100];
if(flag)
sprintf(s," FLASH: 29LV160T 厂商代码: %X%X 器件ID: %X%X",ID_MCH,ID_MCL,ID_DCH,ID_DCL);
else
strcpy(s, " FLASH: 29LV160T 厂商代码: 器件ID: ");
m_DspDeviceInf = _T(s);
UpdateData(FALSE);
}
void CPrg0::DspButton()
{
b_FOpen->EnableWindow(B_FOpen);
b_FSave->EnableWindow(B_FSave);
b_BufClr->EnableWindow(B_BufClr);
b_BufLocate->EnableWindow(B_BufLocate);
b_CommTest->EnableWindow(B_CommTest);
b_RFlash->EnableWindow(B_RFlash);
b_WFlash->EnableWindow(B_WFlash);
b_EFlash->EnableWindow(B_EFlash);
b_Verify->EnableWindow(B_Verify);
b_NextPage->EnableWindow(B_NextPage);
b_LastPage->EnableWindow(B_LastPage);
if(B_Stop)b_Stop->SetWindowText("终 止"); //EnableWindow(B_Stop);
else b_Stop->SetWindowText("芯片复位");
UpdateData(FALSE);
}
int CPrg0::DspHint()
{ char s[100];
if(in_erase)
{sprintf(s,"\n正在执行FLASH擦除操作!\n\n是否终止该操作?");
}
if(in_prgF)
{sprintf(s,"\n正在执行FLASH编程操作!\n\n是否终止该操作?");
}
if(in_readF)
{sprintf(s,"\n正在执行读FLASH操作!\n\n是否终止该操作?");
}
return AfxMessageBox(s,MB_OKCANCEL);
}
int CPrg0::Comm_Test(int flag) //return : 0--normal
{
int r;
if(!(r=PrepareComm(CMD_OK)))
{if(Rcv0()!=CMD_OK)r=1;
else r=0;
}
else r=1;
if(flag && r)DspErrMessage("通讯初始化错误!");
return r;
}
int CPrg0::Rcv0()
{
int cnt=0,r;
reRcv:
r=Receive232();
if(r){ cnt++; //err
Sleep(50);
if(cnt<10)goto reRcv;
}
else return RBuf[0];
return 0;
}
void CPrg0::DspErrMessage(char *s)
{ if(strlen(s))AfxMessageBox(s);
m_DspState=tmp;
UpdateData(FALSE);
}
void CPrg0::DspErrRcv()
{
char s[500];
BYTE f=0;
strcpy(s,"收到如下错误信息: \n\n");
if(ErrCode1 & 0x01){strcat(s,"芯片擦除时校验错;\n"); f=1;}
if(ErrCode1 & 0x02){strcat(s,"指令错误;\n"); f=1;}
if(ErrCode1 & 0x04){strcat(s,"编程过程中发生数据长度错误(长度=0);\n"); f=1;}
if(ErrCode0 & 0x01){strcat(s,"芯片没有准备好;\n"); f=1;}
if(ErrCode0 & 0x02){strcat(s,"指令中读/写字节长度(个数)错误;\n"); f=1;}
if(ErrCode0 & 0x04){strcat(s,"读芯片ID错误;\n"); f=1;}
if(ErrCode0 & 0x08){strcat(s,"接收过程中奇偶校验错;\n"); f=1;}
if(ErrCode0 & 0x10){strcat(s,"累加和错;\n"); f=1;}
if(ErrCode0 & 0x20){strcat(s,"指令中地址错:超出范围(0--0FFFFF);\n"); f=1;}
if(ErrCode0 & 0x40){strcat(s,"状态错误:如--在执行读FLASH指令过程中收到擦除指令;\n"); f=1;}
if(ErrCode0 & 0x80){strcat(s,"超时错误;\n"); f=1;}
strcat(s,"\n操作将终止!");
if(!f){strcpy(s,"没有收到任何信息: \n\n 请检查编程器状态是否正确。\n");}
AfxMessageBox(s);
}
void CPrg0::Stopx(int flag)
{
PurgeComm(HComm232,PURGE_TXCLEAR | PURGE_RXCLEAR);
if(flag)
{
m_DspState = tmp + _T(" 操作已经终止");
Cur_progressPtr=0;
m_Progr.SetPos(0);
PrepareComm(CMD_RSTFLASH);
}
else m_DspState = tmp + _T(" 操作已经完成。");
comm_OK=0;
in_x=0; // UpdateData(FALSE);
B_FOpen=B_RFlash=B_WFlash=B_EFlash=B_CommTest=1;
if(wfile_flag)B_BufClr=B_BufLocate=1;
else B_BufClr=B_BufLocate=0;
if(wfile_flag && rfile_flag){B_Verify=1;}
else {B_Verify=0;}
if(rfile_flag)B_FSave=1;
in_erase=in_prgF=in_readF=B_Stop=0;
DspButton();
Dsp_flag=1; Dsp_Cnt=0;
}
void CPrg0::Rcv()
{
BYTE fUpdate=0,ttt=0;
ST: if(!Receive232())
{if(RBuf[0]==CMD_ERR)
{ErrCode1=RBuf[1];
ErrCode0=RBuf[2];
in_erase=in_prgF=in_readF=in_x=0;
DspErrRcv();
// tmp=m_DspState;
Stopx(1);
return;
}
else if(RBuf[0]==CMD_OK)
{TmOut=TmConst;
if(!in_x)
{//in_x=1;
Cur_progressPtr=1;// if(in_erase || in_prgF || in_readF)
fUpdate=1;
}
else {if(in_prgF)
if(!TX_PrgData())fUpdate=1;
}
}
else if(RBuf[0]==CMD_ERR_PRG)
{in_x=in_prgF=0;
DspPrgErr();
// tmp=m_DspState;
Stopx(1);
}
else if(RBuf[0]==CMD_CHIP_ID)
{ID_MCH=RBuf[1]; ID_MCL=RBuf[2]; ID_DCH=RBuf[3]; ID_DCL=RBuf[4];
DspID(1); fUpdate=1; in_x=1;
if(in_prgF){TmOut=TmConst; TX_PrgData();}
else if(in_erase){TmConst=TmOut=300;}
// m_DspDeviceInfoCtl.UpdateData(FALSE);
ttt=0xff;
// UpdateData(FALSE);
// else if(in_erase){m_Progr.SetPos(100); Stopx(0);}
}
else if(RBuf[0]==CMD_SECT_ERASE)
{if(in_erase){m_Progr.SetPos(100); Stopx(0);}
}
else if(RBuf[0]==CMD_CHIP_ERASE)
{if(in_erase){m_Progr.SetPos(100); Stopx(0);}
}
else if(RBuf[0]==CMD_READ)
{TmOut=TmConst;
if(in_x && in_readF)if(!SaveFlashData())fUpdate=1;
}
else if(RBuf[0]==CMD_END) //if(in_erase || in_prgF || in_readF)Rcv();
{if(in_prgF || in_readF)
{//tmp=m_DspState;
if(in_readF)
{rfile_flag=1; B_NextPage=1;
Cur_RDataPtr=0; Cur_Ptr=0;
RDataLen=DataLenx;
MaxLen=__max(FileLen,RDataLen);
OnDspFile();
}
if(DataLen>DataLenx)
{Stopx(1);
char ss[100];
sprintf(ss,"操作过程中发生错误!\n\n 读取数据长度--%d : \n实际读取数据长度--%d",DataLen,DataLenx);
AfxMessageBox(ss);
}
else Stopx(0);
}
return;
}
}
else if(in_erase)
{//fUpdate=1;
DataLenx+=1000;
if(DataLenx>=(DataLen*0.98))DataLenx-=1000;
Cur_progressPtr=(int)(DataLenx*100/DataLen);
if(Cur_progressPtr>1)fUpdate=1;
ttt=0xff;
}
if(fUpdate)
{ m_Progr.SetPos(Cur_progressPtr);
m_Progr.UpdateData(FALSE);
}
fUpdate=0;
ttt++;
if(!ttt)
{ UpdateData(FALSE);
ct=time(NULL);
char sx[100];
int m,s;
m=(ct-st)/60;
s=ct-st-m*60;
sprintf(sx,"%d分%02d秒",m,s);
m_DspState=tmp+_T(sx);
// m_DspDeviceInfoCtl.UpdateData(FALSE);
m_DspStCtl.UpdateData(FALSE);
return;
}
if(in_prgF || in_readF)goto ST;
}
int CPrg0::TX_PrgData() //发送编程数据
{
int len=(int)__min(MAXLEN-2,DataLen-DataLenx);
// SBuf[1]=(BYTE)(len+2); //len
// int len=(int)__min(30,DataLen-DataLenx);
SBuf[1]=(BYTE)(len+2); //len
SBuf[2]=CMD_PROGX; //command
for(int i=0;i<len;i++)
{SBuf[i+3]=w[BufAddr+DataLenx];
DataLenx++;
}
if(!PrepareComm(CMD_PROGX))Cur_progressPtr=(int)(DataLenx*100/DataLen);
else {in_prgF=0; tmp=m_DspState; DspErrMessage("发送数据时出错!"); Stopx(1); return 1;}
return 0;
}
void CPrg0::DspPrgErr()
{
BYTE *x;//,y;
DWORD w;
char s[500];
x=(BYTE*)&w;
x[2]=RBuf[1];
x[1]=RBuf[2];
x[0]=RBuf[3];
// y=RBuf[4];
sprintf(s,"FLASH编程错误:\n\n FLASH地址:0X%06X \n 编程数据:0X%02X%02X \n FLASH数据:0X%02X%02X\n",(FlashAddr*2+DataLen-w-RBuf[4]),RBuf[5],RBuf[6]);
AfxMessageBox(s);
}
int CPrg0::SaveFlashData()
{
if(len_rcv>MAXLEN || !len_rcv)return 1;
for(int i=0;i<len_rcv-2;i++)
{r[BufAddr+DataLenx]=RBuf[i+1];
DataLenx++;
}
Cur_progressPtr=(int)(DataLenx*100/DataLen);
// RDataLen=DataLenx;
// OnDspFile();
// Cur_Ptr=RDataLen;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -