// At89s51Isp.cpp: implementation of the CAt89s51Isp class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "EPro.h"
#include "At89s51Isp.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAt89s51Isp::CAt89s51Isp()
{
	m_pParlPro=NULL;//该类所支持的FID
	FID=0x02;
}

CAt89s51Isp::~CAt89s51Isp()
{

}

void CAt89s51Isp::InitIsPro(CParallelPro* pParlPro)
{
	TRACE("CAt89s51Isp::InitIsPro\n");
	CIsPro::InitIsPro(pParlPro);//得到并口编程器对象的指针
}

void CAt89s51Isp::PreparePro()//编程前的准备工作
{
	m_pParlPro->SetRst(0);//RST置低电平
	m_pParlPro->SetMosi(0);//MOSI置低电平
	m_pParlPro->SetSck(0);//SCK置低电平
	Sleep(10);
	m_pParlPro->SetRst(1);
	Sleep(10);
	m_pParlPro->OutBuf[0]=0xac;
	m_pParlPro->OutBuf[1]=0x53;
	m_pParlPro->SckBytes(4);
}

void CAt89s51Isp::ProOver()//编程结束后的工作
{
	m_pParlPro->SetRst(0);//RST置低电平,这样单片机就开始运行了
	m_pParlPro->SetMosi(1);
	m_pParlPro->SetSck(1);
}

void CAt89s51Isp::ReadSign(BYTE* pBuf)//读特征字
{
	m_pParlPro->OutBuf[0]=0x28;//根据器件手册上规定的命令协议
	m_pParlPro->OutBuf[1]=0x00;
	m_pParlPro->OutBuf[2]=0x00;
	m_pParlPro->OutBuf[3]=0x00;
	m_pParlPro->SckBytes(4);//向器件发编程命令
	pBuf[0]=m_pParlPro->InBuf[3];//第1个特征字
	m_pParlPro->OutBuf[1]=0x01;
	m_pParlPro->SckBytes(4);
	pBuf[1]=m_pParlPro->InBuf[3];//第2个特征字
	m_pParlPro->OutBuf[1]=0x02;
	m_pParlPro->SckBytes(4);
	pBuf[2]=m_pParlPro->InBuf[3];//第3个特征字

}

void CAt89s51Isp::Erase()//擦除器件
{
	m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
	m_pParlPro->OutBuf[1]=0x80;
	m_pParlPro->SckBytes(4);//向器件发编程命令
	Sleep(500);				//擦除器件要500ms
}

BOOL CAt89s51Isp::Write(BYTE Data,int nAddr)//写一个单元
{
	int nTimeOut=0;
	m_pParlPro->OutBuf[0]=0x40;//根据器件手册上规定的命令协议
	m_pParlPro->OutBuf[1]=((BYTE*)&nAddr)[1];//高地址
	m_pParlPro->OutBuf[2]=((BYTE*)&nAddr)[0];//低地址
	m_pParlPro->OutBuf[3]=Data;
	m_pParlPro->SckBytes(4);//向器件发编程命令
	while(Read(nAddr)!=Data)//效验：循环读，直到读出与写入相同的数
	{
		nTimeOut++;
		if(nTimeOut>=1000)//如果超时了，写入失败
			return FALSE;
	}
	return TRUE;
}

BYTE CAt89s51Isp::Read(int nAddr)//读一个单元
{
	m_pParlPro->OutBuf[0]=0x20;//根据器件手册上规定的命令协议
	m_pParlPro->OutBuf[1]=((BYTE*)&nAddr)[1];//高地址
	m_pParlPro->OutBuf[2]=((BYTE*)&nAddr)[0];//低地址
	m_pParlPro->SckBytes(4);//向器件发编程命令
	return m_pParlPro->InBuf[3];
}

BOOL CAt89s51Isp::LockBit(int nBit)
{
	if(nBit>=1)//ComBuf[2]为锁定位
	{
		
		m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
		m_pParlPro->OutBuf[1]=0xe1;
		m_pParlPro->SckBytes(4);
		Sleep(1);
	}
	if(nBit>=2)
	{
		PreparePro();
		m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
		m_pParlPro->OutBuf[1]=0xe2;
		m_pParlPro->SckBytes(4);
		Sleep(1);
	}
	if(nBit==3)
	{
		PreparePro();
		m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
		m_pParlPro->OutBuf[1]=0xe3;
		m_pParlPro->SckBytes(4);
		Sleep(1);
	}
	return TRUE;
}

