//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "windows.h"
#include "Unit1.h"
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include "PCOMM.H"
#include "drivers.h"
#include <vcl\registry.hpp> //for C++ Builder 3.0
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int Commport;
int baudrate;
FILE *fp_ReadFromFlash;//
bool Flag_Have_Handshake;
unsigned char Buf_ReadFromFlash[65536];
unsigned char Buf_WriteToFlash[65536];
unsigned int Size_WriteToFlash; //编程的字节数 为32的倍数
unsigned int Max_WriteToFlash; //Flash的容量
unsigned int Size_ReadFromFlash;//从FLASH读取的长度
bool Flag_Force_Break;//用户强制中断当前的操作
unsigned int Addr_WriteFlash;//芯片编程起始地址
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
AnsiString BaudRateStr;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AnsiString MyPAth=ExtractFilePath(Application->ExeName);
TIniFile *MyFile=new TIniFile(MyPAth+"TXR_ISP.INI");
if(MyFile->ReadInteger("Config","Left",-1)==-1)
Left=100;
else
Left= MyFile->ReadInteger("Config","Left",Left);
if(MyFile->ReadInteger("Config","Top",-1)==-1)
Top=100;
else
Top= MyFile->ReadInteger("Config","Top",Top);
if(MyFile->ReadInteger("Config","Width",-1)==-1)
Width=850;
else
Width= MyFile->ReadInteger("Config","Width",Width);
if(MyFile->ReadInteger("Config","Height",-1)==-1)
Height=540;
else
Height= MyFile->ReadInteger("Config","Height",Height);
if(MyFile->ReadString("Config","BaudRate",-1)==-1)
BaudRateStr="57600";
else
BaudRateStr= MyFile->ReadString("Config","BaudRate",BaudRateStr);
delete MyFile;
//Graphics::TBitmap *BkgndBitmap = new Graphics::TBitmap();
//BkgndBitmap->LoadFromFile("c:\\YourBmp.bmp");
//Form1->Brush->Bitmap=BkgndBitmap;
AnsiString Br;
Flag_Force_Break=0;
Init_Serial();
Size_WriteToFlash=0;
Edit_WriteFlash->Text="0";
Flag_Commport_OpenStatus=COMMPORT_CLOSE;
CB_CommPort->ItemIndex=0;
CB_BaudRate->ItemIndex=3;
Commport=CB_CommPort->ItemIndex+1;
Br=CB_BaudRate->Items->Strings[CB_BaudRate->ItemIndex];
if(Br=="9600")
baudrate=B9600;
else if(Br=="19200")
baudrate=B19200;
else if(Br=="38400")
baudrate=B38400;
else if(Br=="57600")
baudrate=B57600;
else if(Br=="115200")
baudrate=B115200;
Bt_BlankChk->Enabled=false;
Bt_Erase->Enabled=false;
Bt_Program->Enabled=false;
Bt_Read->Enabled=false;
Bt_ExitISP->Enabled=false;
Bt_Cmp->Enabled=false;
ComboBox_MCU->Enabled=true;
Bt_HandShake->Enabled=false;
Bt_Auto->Enabled=false;
if(Flag_Commport_OpenStatus==COMMPORT_CLOSE){
CB_CommPort->Enabled=true;
CB_BaudRate->Enabled=true;
}
else{
CB_CommPort->Enabled=false;
CB_BaudRate->Enabled=false;
}
if(ComboBox_MCU->Text=="W78E516B"||ComboBox_MCU->Text=="W77E516"||
ComboBox_MCU->Text=="SST89E516RD2")
Max_WriteToFlash=65536;
else if(ComboBox_MCU->Text=="SST89E58RD2")
Max_WriteToFlash=32768;
Size_ReadFromFlash=0;
CB_ProgramSize->Text=IntToStr(Max_WriteToFlash);
CB_ProgramSize->Items->Add(IntToStr(Max_WriteToFlash));
Flag_Have_Handshake=false;
Flag_EnterISP=false;
}
#include "tapi.h"
//---------------------------------------------------------------------------
void __fastcall TForm1::Bt_CommOpenClick(TObject *Sender)
{
unsigned char GetKey[100];
BT_Stop->Visible=false;
if(Flag_Commport_OpenStatus==COMMPORT_OPEN){//现在打开-->关闭
Flag_Commport_OpenStatus=COMMPORT_CLOSE;
sio_close(Commport);
Bt_BlankChk->Enabled=false;
Bt_BlankChk->Enabled=false;
Bt_Erase->Enabled=false;
Bt_Program->Enabled=false;
Bt_Read->Enabled=false;
Bt_ExitISP->Enabled=false;
CB_CommPort->Enabled=true;
CB_BaudRate->Enabled=true;
ComboBox_MCU->Enabled=true;
Bt_HandShake->Enabled=false;
Bt_Cmp->Enabled=false;
Bt_Auto->Enabled=false;
StatusBar->SimpleText="串口关闭!";
}
else{//现在关闭-->打开
if(sio_open(Commport)!=SIO_OK){
StatusBar->SimpleText="串口打开错误!";
Beep_Notice(false);
ShowMessage("串口打开错误!");
sio_close(Commport);
return;
}
if(sio_ioctl(Commport,baudrate,P_NONE|BIT_8|STOP_1)!=SIO_OK){
StatusBar->SimpleText="串口设置错误!";
Beep_Notice(false);
ShowMessage("串口设置错误!");
return;
}
StatusBar->SimpleText="串口打开!";
Flag_Commport_OpenStatus=COMMPORT_OPEN;
Bt_BlankChk->Enabled=true;
Bt_Erase->Enabled=true;
Bt_Program->Enabled=true;
Bt_Read->Enabled=true;
Bt_ExitISP->Enabled=true;
CB_CommPort->Enabled=false;
CB_BaudRate->Enabled=false;
ComboBox_MCU->Enabled=false;
Bt_HandShake->Enabled=true;
Bt_Cmp->Enabled=true;
Bt_Auto->Enabled=true;
sio_cnt_irq(Commport,SerialPort_Rx_Irq,1);
}
if(Flag_Commport_OpenStatus==0)
Bt_CommOpen->Caption="打开串口";
else
Bt_CommOpen->Caption="关闭串口";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CB_CommPortChange(TObject *Sender)
{
if(Flag_Commport_OpenStatus==COMMPORT_OPEN){
sio_close(Commport); //先关闭原来的串口
Flag_Commport_OpenStatus==COMMPORT_CLOSE;
}
Commport=(CB_CommPort->ItemIndex)+1;
if(Flag_Commport_OpenStatus==COMMPORT_CLOSE)
Bt_CommOpen->Caption="打开";
else
Bt_CommOpen->Caption="关闭";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Bt_ReadFileClick(TObject *Sender)
{
OpenDialog_ProgramFile->Execute();
}
unsigned char TForm1::HandShake(void)
{
unsigned char Frame_Send_To_MCU[100];
unsigned long TimeStart;
unsigned int Num_Frame_Rx;
Edit_Rx->Text="";
Edit_Tx->Text="";
ProgressBar->Position=ProgressBar->Min;
Label_Progress->Caption=IntToStr(ProgressBar->Position*100/ProgressBar->Max)+"%";
//写之前先清除原来缓冲区的数据
Flag_RevData=0;
Num_Frame_Rx_PC_Buf=0;
StatusBar->SimpleText="正在握手...";
TimeStart=GetTickCount();
for(;;){
if(Flag_Force_Break){
Flag_Force_Break=0;
return Status_Custom_Break;
}
if((GetTickCount()-TimeStart)>=WaitACKTime){//超时
return Status_TimeOver;
}
Edit_Time->Text=IntToStr((GetTickCount()- TimeStart));
Application->ProcessMessages();
sio_putch(Commport,'U');
if(Flag_RevData){
Flag_RevData=0;
Num_Frame_Rx_PC_Buf=0;
if(Frame_Rx_PC_Buf[0]=='U'){
return Status_Get_ACK;
}
else{
return Status_Command_ERROR;
}
}
Sleep(1);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Bt_HandShakeClick(TObject *Sender)
{
unsigned char Status;
if(sio_ioctl(Commport,baudrate,P_NONE|BIT_8|STOP_1)!=SIO_OK){
Beep_Notice(false);
ShowMessage("串口设置错误!");
return ;
}
BT_Stop->Visible=true;
Status=HandShake();
BT_Stop->Visible=false;
switch(Status){
case Status_Get_ACK:
StatusBar->SimpleText="MCU进入ISP模式成功!";
Flag_Have_Handshake=true;
break;
case Status_Custom_Break:
StatusBar->SimpleText="用户强制中断!";
Beep_Notice(false);
return;
default:
StatusBar->SimpleText="握手超时失败!返回值=";
StatusBar->SimpleText+= Status;
Beep_Notice(false);
return;
}
}
unsigned char TForm1::BlankChk(void)
{
unsigned char Frame_Send_To_MCU[100];
unsigned long TimeStart;
unsigned int Num_Frame_Rx;
Edit_Rx->Text="";
Edit_Tx->Text="";
ProgressBar->Position=ProgressBar->Min;
Label_Progress->Caption=IntToStr(ProgressBar->Position*100/ProgressBar->Max)+"%";
Frame_Send_To_MCU[0]=STX;
Frame_Send_To_MCU[1]=2;
Frame_Send_To_MCU[2]=BLANKCHK;
Frame_Send_To_MCU[3]=GetCrc(Frame_Send_To_MCU,3);
Frame_Send_To_MCU[4]=ET
评论0