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

📄 ppgnewdlg.cpp

📁 烧录器的上位机控制程序代码,和下位机程序代码,包括USB通讯固件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		return;
	}
	if( !MyPinTest() )
	{
		MessageBox("IC放置位置不对,或没有放IC");
		return;
	}
	m_flag_rtx=1;
	m_cedit_status.SetWindowText("开始读出CONFIG>>>>>>>>>>>>>>>>>>>>>");
	m_ucSend1[0]= 0xa3;
	DWORD Result = WritePort1(m_ucSend1,1);
    ReadPort1(m_ucRec1,3);
	Buzzer_N(1);
	str_gtemp.Format("%.2X%.2X", m_ucRec1[1],m_ucRec1[2]);
	m_cedit_status.SetWindowText("CONFIG数据为:0X"+str_gtemp);
	Initial_subpro();
	m_flag_rtx=0;
	//==================================================


}

void CPPGNEWDlg::OnButtonLock() 
{
	// TODO: Add your control notification handler code here
	if(m_flag_rtx)
		return;
	if (Initial_subpro()!=0)
	{
		m_flag_rtx=0;
		m_cedit_status.SetWindowText("联机不成功!!!");
		AfxMessageBox("联机不成功!!!");
		return;
	}
	if( !MyPinTest() )
	{
		MessageBox("IC放置位置不对,或没有放IC");
		return;
	}
	m_flag_rtx=1;
	m_cedit_status.SetWindowText("开始写OTP加密位>>>>>>>>>>>>");

	m_ucSend1[0]= 0xab;
	WritePort1(m_ucSend1,1);
	Sleep(10);
	ReadPort1(m_ucRec1,2);
	if (m_ucRec1[1]==0x1)
	{
	   m_cedit_status.SetWindowText("OTP加密成功");
	}
	else
	{
		m_cedit_status.SetWindowText("OTP加密不成功");
	}
	
	Buzzer_N(1);
	m_flag_rtx=0;
	
}

void CPPGNEWDlg::OnButtonWv() 
{
	// TODO: Add your control notification handler code here
	if(m_flag_rtx)
		return;
	if (Initial_subpro()!=0)
	{
		m_flag_rtx=0;
		m_cedit_status.SetWindowText("联机不成功!!!");
		AfxMessageBox("联机不成功!!!");
		return;
	}
	if( !MyPinTest() )
	{
		MessageBox("IC放置位置不对,或没有放IC");
		return;
	}
	m_flag_rtx=1;
	m_cedit_status.SetWindowText("开始WRITE_VERIFY(FLASH->OTP)>>>>>>>>>>>>");
	m_bWriteVerify_f=1;
	m_progress.ShowWindow(SW_SHOW);

}

UINT CPPGNEWDlg::ThreadFun(LPVOID pParam)
{
	CPPGNEWDlg *pUsb = (CPPGNEWDlg *) pParam;
	
	while(1)
	{
		if (pUsb->m_bwriteotp)
		{
			pUsb->MyWriteVerifyOtp();
		}
		
		if (pUsb->m_breadotp)
		{
			pUsb->MyReadOtp();
		}

		if (pUsb->m_bnewflash)
		{
			pUsb->MyWriteFlash();
			
		}
		
		if (pUsb->m_breadflash)
		{
            pUsb->MyReadFlash();
		}

		if(pUsb->m_bblank)
		{
			pUsb->m_bblank = 0;
			pUsb->MyBlank();
		}

		if(pUsb->m_bbpv)
		{
		pUsb->MyBlankProVerify();
		}

		if(pUsb->m_bWriteVerify_f)
		{
		pUsb->MyWriteVerify_FLASH();
		}
		if(pUsb->m_bverify_f)
		{
		pUsb->MyVerify_FLASH();
		
		}

		if(pUsb->m_bverifyotp_file)
		{
			pUsb->m_bverifyotp_file = 0;
			pUsb->MyVerifyOtp();
		}
		Sleep(50);
	
	}
	return 1;
}

//下载FILE到FLASH
void CPPGNEWDlg::MyWriteFlash()
{
    CByteArray hexdata;
	String2Hex(str_hexcode, hexdata);
	m_ucSend1[0]= 0xa0;
	DWORD Result = WritePort1(m_ucSend1,1);	//PC->Usb, 
	for (int i=0;i<1024*RomSize*2/64;i++)
	{
		m_progress.SetPos(i*100/(RomSize*32));
		WritePort2(&hexdata[i*64],64);
		Sleep(20);		//???  延时是否够
	    DWORD Result = ReadPort1(m_ucRec1,1);   
	}

    m_ucSend1[0]= 0xad;
    m_ucSend1[1]= CONFIG/0x100;
    m_ucSend1[2]= CONFIG%0x100;
	m_ucSend1[3]= 0xa5;
	m_ucSend1[4]=m_ctype.GetCurSel();
	WritePort1(m_ucSend1,5);
	Sleep(50);
	//===========================发送型号和校验下载的内容
	ReadPort1(m_ucRec1,5);
	if((m_ucRec1[1]== CONFIG/0x100)&&(m_ucRec1[2]== CONFIG%0x100)&&(m_ucRec1[3]==CHECKSUM_F/256)&&(m_ucRec1[4]==CHECKSUM_F%256) )
	{
	Buzzer_N(1);
	Initial_subpro();
	m_bnewflash=0;
	m_flag_rtx=0;
	m_cedit_status.SetWindowText("FLASH更新完毕!!");
	return;
	}
	else
	{
	Buzzer_N(3);
	Initial_subpro();
	m_bnewflash=0;
	m_flag_rtx=0;
	m_cedit_status.SetWindowText("FLASH更新失败!!");
	return;
	}


}

void CPPGNEWDlg::MyReadFlash()
{

    for (int i=0;i<1024*2*RomSize/128;i++)
    {
		m_progress.SetPos(i*100/(16*RomSize));
		m_ucSend1[0]= 0xa5;
		DWORD Result = WritePort1(m_ucSend1,1);
		Sleep(10);	//???
		ReadPort2(&CheckBuf[i*128],128);	//???
		Sleep(10);
	}
	str_rxhex.Empty();
	for(int k=0;k<1024*2*RomSize;k++) //将数组转换为Cstring型变量
	{
		BYTE bt=*(char*)(CheckBuf+k); //字符型
		str_gtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放
		str_rxhex=str_rxhex+str_gtemp;
	}
	
	//"开始读出CONFIG>>>>>>>>>>>>>>>>>>>>>");
	m_ucSend1[0]= 0xac;
	DWORD Result = WritePort1(m_ucSend1,1);
    ReadPort1(m_ucRec1,5);
	str_gtemp.Format("%.2X%.2X", m_ucRec1[1],m_ucRec1[2]);
	str_rxhex=str_rxhex+str_gtemp;
	CString str_otp=_T("");
	if(m_ucRec1[3]!=0xa5)
		str_otp="FLASH还没有下载过程序";
	else
	{
		switch (m_ucRec1[4])
		{
		case 0x00:
			str_otp="FLASH选定的型号是:PM10P40(20PIN/16PIN封装片) ";
			break;
		case 0x01:
			str_otp="FLASH选定的型号是:PM10P40(8PIN封装片/20PIN窗口片) ";
			break;
		case 0x02:
			str_otp="FLASH选定的型号是:PM11P40";
			break;
		case 0x03:
			str_otp="FLASH选定的型号是:PM12P80";
			break;
		case 0x04:
			str_otp="FLASH选定的型号是:PM10P20 ";
			break;
		default:
			str_otp="FLASH选定的型号是:PM10P40 ";
			break;
		}
		
		
	}

	//-----------------------------------------
	CString str_temp="0000:| ";
				CString str_adr="";
				for(i=0; i<1024*RomSize*4; i=i+4)
				{
					str_temp=str_temp+str_rxhex.Mid(i, 4)+" | ";
					if(((i+4)%32==0)&&(i!=0)&&(i!=(1024*RomSize*4-4)))
					{
						str_adr.Format("%.4x", (i+4)/4);
						str_temp=str_temp+"\r\n"+str_adr+":| ";
					}
				}
				m_cedit_buf.SetWindowText(str_temp);
	//=================================	计算文件CHECKSUM值
				WORD byte_2=0x0000;
				WORD check_sum=0x0000;
				for(i=0; i<RomSize*1024; i++)
				{
					sscanf(str_rxhex.Mid(i*4, 4), "%X", &byte_2);
					check_sum=check_sum+byte_2;
				}
				str_temp.Format("%.4X", check_sum);
				m_cstatic_bufchksum.SetWindowText("缓存CHECKSUM: 0X"+str_temp);
				//=================================
				m_cstatic_bufconfig.SetWindowText("缓存CONFIG: 0X"+str_rxhex.Mid(4*1024*RomSize, 4));
				Buzzer_N(1);
				
				Initial_subpro();
				m_breadflash=0;
				m_flag_rtx=0; 
				m_cedit_status.SetWindowText("读FLASH完成  "+str_otp);
}

void CPPGNEWDlg::MyVerifyOtp() //verify(otp/file)
{
	for (int i=0;i<1024*2*RomSize/64;i++)
    {
		m_ucSend1[0]= 0xa1;
		DWORD Result = WritePort1(m_ucSend1,1);
		m_progress.SetPos(i*100/(RomSize*32));
		Sleep(10);
		ReadPort2(CheckBuf,64);
		for(int j=0; j<64; j=j+1)
		{
			str_gtemp=str_hexcode.Mid(128*i+2*j, 2);
			
			str_gtemp1.Format("%.2X", CheckBuf[j]);
			
			if(str_gtemp!=str_gtemp1)
			{
				Buzzer_N(3);
				
				Initial_subpro();
	
				m_bverifyotp_file=0;
				m_flag_rtx=0;
				str_gtemp.Format("%.4X", 32*i+j/2);
				m_cedit_status.SetWindowText("校验不对!!, 错误地址为:0X"+str_gtemp);	
				return;
			}
		}
		
		Sleep(10);
	}
	//=========================读CONFIG
	BYTE config_h, config_l;
	config_h=CONFIG/0x100;
	config_l=CONFIG%0X100;
	m_ucSend1[0]= 0xa3;
	DWORD Result = WritePort1(m_ucSend1,1);
    ReadPort1(m_ucRec1,3);
	if( ((m_ucRec1[1]&0xdf)!=(config_h&0xdf)) || (m_ucRec1[2]!=config_l) )
	{
		
		Buzzer_N(3);
		
		Initial_subpro();
		m_bverifyotp_file=0;
		m_flag_rtx=0;
		m_cedit_status.SetWindowText("OTP校验错误!,CONFIG不对");
		return;		
	}		
	
	
	m_cedit_status.SetWindowText("OTP校验通过!!");	
	Buzzer_N(1);
	m_bverifyotp_file=0;
	Initial_subpro();
	m_flag_rtx=0;

}



void CPPGNEWDlg::MyBlank()
{
	Sleep(10);
	BYTE config_h, config_l;
	config_h=CONFIG_BLANK/0x100;
	config_l=CONFIG_BLANK%0X100;
	m_ucSend1[0]= 0xa1;
	for (int i=0;i<1024*2*RomSize/64;i++)
    {
		DWORD Result = WritePort1(m_ucSend1,1);
		if(Result!=0)
		{
			MessageBox("通讯错误");
		}
		m_progress.SetPos(i*100/(RomSize*32));
	//	Sleep(10);
		Result=ReadPort2(CheckBuf,64);
		if(Result!=0)
		{
			MessageBox("通讯错误");
		}
		for(int j=0; j<64; j=j+2)
		{
			if((CheckBuf[j]!=0x3f)||(CheckBuf[j+1]!=0xff))
			{
				Buzzer_N(3);
				
				Initial_subpro();
				m_bblank =0;
				m_flag_rtx=0;
				str_gtemp.Format("%.4X", 32*i+j/2);
				m_cedit_status.SetWindowText("OTP不是空片!!,非空单元为:0X"+str_gtemp);	
				return;
			}	
		}
	//	Sleep(10);

	}

	//=========================读CONFIG
	m_ucSend1[0]= 0xa3;
	DWORD Result = WritePort1(m_ucSend1,1);
    ReadPort1(m_ucRec1,3);
	if( (m_ucRec1[1]!=config_h)||(m_ucRec1[2]!=config_l) )
	{
		Buzzer_N(3);
		
		Initial_subpro();
		m_bbpv=0;
		m_flag_rtx=0;
		m_cedit_status.SetWindowText("CONFIG非空或者IC型号选错!!");	
		return;
	}		
	Buzzer_N(1);
	m_cedit_status.SetWindowText("OTP是空片!!");	
	m_bblank =0;
	Initial_subpro();
	m_flag_rtx=0;
}






void CPPGNEWDlg::MyReadOtp()
{

	for (int i=0;i<1024*2*RomSize/64;i++)
    {
		m_progress.SetPos(i*100/(32*RomSize));
		m_ucSend1[0]= 0xa1;
		DWORD Result = WritePort1(m_ucSend1,1);
	//	Sleep(10);
		ReadPort2(&CheckBuf[i*64],64);
		Sleep(10);
	}
	str_rxhex.Empty();
	for(int k=0;k<1024*2*RomSize;k++) //将数组转换为Cstring型变量
	{
		BYTE bt=*(char*)(CheckBuf+k); //字符型
		str_gtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放
		str_rxhex=str_rxhex+str_gtemp;
	}
//	m_cedit_status.SetWindowText("开始读出CONFIG>>>>>>>>>>>>>>>>>>>>>");
	m_ucSend1[0]= 0xa3;
	DWORD Result = WritePort1(m_ucSend1,1);
    ReadPort1(m_ucRec1,3);
	str_gtemp.Format("%.2X%.2X", m_ucRec1[1],m_ucRec1[2]);
	str_rxhex=str_rxhex+str_gtemp;
	//------------------------------------------
	CString str_temp="0000:| ";
				CString str_adr="";
				for(i=0; i<1024*RomSize*4; i=i+4)
				{
					str_temp=str_temp+str_rxhex.Mid(i, 4)+" | ";
					if(((i+4)%32==0)&&(i!=0)&&(i!=(1024*RomSize*4-4)))
					{
						str_adr.Format("%.4x", (i+4)/4);
						str_temp=str_temp+"\r\n"+str_adr+":| ";
					}
				}
				m_cedit_buf.SetWindowText(str_temp);
	//=================================	计算文件CHECKSUM值
			WORD byte_2=0x0000;
			WORD check_sum=0x0000;
			for(i=0; i<1024*RomSize; i++)
			{
				sscanf(str_rxhex.Mid(i*4, 4), "%X", &byte_2);
				check_sum=check_sum+byte_2;
			}
			str_temp.Format("%.4X", check_sum);
			m_cstatic_bufchksum.SetWindowText("缓存CHECKSUM: 0X"+str_temp);
			//=================================
			m_cstatic_bufconfig.SetWindowText("缓存CONFIG: 0X"+str_rxhex.Mid(RomSize*1024*4, 4));	
			
	Buzzer_N(1);
	
	Initial_subpro();
	m_breadotp=0;
	m_flag_rtx=0; 
	m_cedit_status.SetWindowText("读取OTP->BUFFER完成");
}

void CPPGNEWDlg::MyWriteVerifyOtp()
{
    CByteArray hexdata;
	String2Hex(str_hexcode, hexdata);
	m_ucSend1[0]= 0xaa;
	DWORD Result = WritePort1(m_ucSend1,1);
	for (int i=0;i<1024*RomSize/64*2;i++)
	{
		m_progress.SetPos(i*100/(32*RomSize));
		WritePort2(&hexdata[i*64],64);
		Sleep(10);		//???
	    DWORD Result = ReadPort1(m_ucRec1,1);
       
	}
    m_ucSend1[0]= 0xa4;

⌨️ 快捷键说明

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