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

📄 prg0.cpp

📁 单片机对FLASH芯片的烧写,源程序,原理图,PCB图
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	 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 + -