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

📄 isp.c

📁 基于PDIUSBD12芯片的USB开发板固件程序
💻 C
字号:
#ifdef __C51__
#include <reg51.h> /* special function register declarations */#endif
#include "ISP.h"
#include "MAINLOOP.H"
#include <intrins.h>

unsigned char OutBuf[4],InBuf[4];
sbit RST=P1^4;
sbit MISO=P1^5;
sbit MOSI=P1^0;
sbit SCK=P1^1;
sbit LE=P3^2;
sbit OE=P3^1;

void Delay(int time)//Delay(1)延时54us,time每加1则16us
{
	int n;
	for(n=0;n<=time;n++)//延时
	{}
}

void Nop()
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();

}

void SetSck(BOOL bLogic)
{
	if(bLogic)
		SCK=1;
	else
		SCK=0;
	LE=0;
	Nop();
	LE=1;
}

void SetRst(BOOL bLogic)
{
	
	if(bLogic)
		RST=1;
	else
		RST=0;
	LE=0;
	Nop();
	LE=1;
}

void SetMosi(BOOL bLogic)
{
		
	if(bLogic)
		MOSI=1;
	else
		MOSI=0;
	LE=0;
	Nop();
	LE=1;
}

BOOL GetMiso()//得到MISO引脚的电平
{
	LE=0;
	Nop();
	LE=1;
	return MISO;
}


void SckBytes(BYTE nBytes)//通过下载线与器件通信
{
	BYTE n;
	for(n=0;n<nBytes;n++)
	{	
		SetSck(0);
		SetMosi((OutBuf[n] & 0x80));//SCK为低电平时,发送一位
		SetSck(1);
		if(GetMiso())//SCK为搞电平时,接收一位
		{
		
			InBuf[n]=InBuf[n] | 0x80;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0x7f;
		}
		SetSck(0);
		SetMosi((OutBuf[n] & 0x40));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x40;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xbf;
		}
		SetSck(0);
		SetMosi((OutBuf[n] & 0x20));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x20;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xdf;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x10));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x10;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xef;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x08));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x08;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xf7;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x04));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x04;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xfb;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x02));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x02;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xfd;
		}
		SetSck(0);

		SetMosi((OutBuf[n] & 0x01));
		SetSck(1);
		if(GetMiso())
		{
		
			InBuf[n]=InBuf[n] | 0x01;
		}
		else
		{	
			InBuf[n]=InBuf[n] & 0xfe;
		}
		SetSck(0);
	}
}



void PreparePro()//编程前的准备工作
{
	SetRst(0);//RST置低电平
	SetMosi(0);//MOSI置低电平
	SetSck(0);//SCK置低电平
	Delay(10);
	SetRst(1);
	OE=0;
	LE=1;
	Delay(1000);
	OutBuf[0]=0xac;
	OutBuf[1]=0x53;
    SckBytes(4);
}

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

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

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

unsigned char Read(int nAddr)//读一个单元
{
	OutBuf[0]=0x20;//根据器件手册上规定的命令协议
	OutBuf[1]=nAddr/256;//高地址
	OutBuf[2]=nAddr%256;//低地址
	OutBuf[3]=0x00;
	SckBytes(4);//向器件发编程命令
	return InBuf[3];
}

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

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

⌨️ 快捷键说明

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