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

📄 hvprog.c

📁 AVR单片机DIY编程器!源代码及原理图都有!
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                
**                             小松工程(ilan2003)出品        
**                                 
** 文   件   名: Hvprog.c
** 最后修改日期: 2005-12-9 0:56
** 描        述: 编程时序函数
** 版	     本: V1.0
** 主  控  芯 片:M16  晶振频率:7.3728MHZ
** IDE:ICCAVR 6.31
**********************************************************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "eeprom_add.h"
#include "function.h"
#include "externPara.h"
#include "HVprog.h"

/**********************************************************************
functionName:void enterProgMode(void)
description:进入并行编程模式
**********************************************************************/
void enterProgMode(void)
{
	uint08 i;
	portInit();			//每次进入编程模式对引脚初始化
	LED_ON_3;
	CLR_XTAL;
	CLR_RESET;
	for(i=0;i<8;i++)
	{
		SET_XTAL;
		usDelay(1);
		CLR_XTAL;
		usDelay(1);
	}
	CLR_BS1;	
	CLR_XA0;
	CLR_XA1;
	CLR_PAGEL;
	usDelay(DELAY_PULSE);		//要求等待100ns
	SET_RESET;
	usDelay(DELAY_PULSE);		//要求等待100ns
}



/**********************************************************************
functionName:void exitProgMode(void)
description:退出并行编程模式
**********************************************************************/
void exitProgMode(void)
{	
	DDRA =0xEE;
	PORTA=0x0E;
	DDRB =0x00;
	PORTB=0xFF;
	DDRC =0x3D;
	PORTC=0x00;
	DDRD =0x12;
	PORTD=0xFF;
	LED_ON_1;
	LED_OFF_3;
}



/**********************************************************************
functionName:uints08 readFuseLock(uint08 chSle)
description:读取熔丝位和锁定位
chSle
0:返回熔丝低位
1:返回熔丝高位
2:返回锁定位
**********************************************************************/
uint08 readFuseLock(uint08 chSle)
{
	uint08 retVal;
	chSle &= 0x03;
	loadCMD(CMD_LOAD_RAED_FUSE);
	HVP_DATA_IN;
	switch(chSle)
	{
		case 0:
		{
			CLR_BS1;
			CLR_BS2;
			break;	
		}
		case 1:
		{
			SET_BS1;
			SET_BS2;
			break;				
		}
		case 2:
		{
			SET_BS1;
			CLR_BS2;
			break;			
		}
		default:
		{
			SET_BS1;
			CLR_BS2;
			break;
		}
	}
	CLR_OE;
	usDelay(DELAY_PULSE);
	retVal=HVP_DATA_RD;
	SET_OE;
	usDelay(DELAY_PULSE);
	HVP_DATA_OUT;		//设置为输出模式
	return(retVal);
}





/**********************************************************************
functionName:uint08 readIDByte(uint08 addId)
description:读取标识字节
地址 00
地址 01
地址 02
**********************************************************************/
uint08 readIDByte(uint08 addId)
{
	uint08 retVal;
	addId &= 0x03;
	loadCMD(CMD_LOAD_READ_ID);		//加载命令
	loadAddL(addId);			//加载地址低位字节  操作流水号:B
	retVal=readDataBus(0);			//读数据总线数据
	return(retVal);
}


/**********************************************************************
functionName:uint08 readOSCCAL(uint08 addId)
description:读取标定字节
**********************************************************************/
uint08 readOSCCAL(uint08 addId)
{
	uint08 retVal;
	loadCMD(CMD_LOAD_READ_ID);
	loadAddL(addId);		
	retVal=readDataBus(1);
	return(retVal);
}



/**********************************************************************
functionName:uint08 readEepromData(uint08 addHig,uint08 addLow)
description:读取EEPROM数据
**********************************************************************/
uint08 readEepromData(uint08 addHig,uint08 addLow)
{
	uint08 retVal;
	loadCMD(CMD_LOAD_READ_EEPROM);
	loadAddH(addHig);				//加载地址高位字节	
	loadAddL(addLow);				//加载地址低位字节			
	retVal=readDataBus(0);
	return(retVal);
}






/**********************************************************************
functionName:uint08 writeFuseByteLow(uint08 wrByte)
description:对熔丝位低位进行编程
**********************************************************************/
uint08 writeFuseLow(uint08 wrByte)
{
	uint08 retVal;
	loadCMD(CMD_LOAD_WRITE_FUSE);
	loadDataL(wrByte);
	
	CLR_BS1;
	CLR_BS2;
	usDelay(DELAY_PULSE);

	retVal=writeSection();
	return(retVal);
}


/**********************************************************************
functionName:uint08 writeFuseHig(uint08 wrByte)
description:对熔丝位低位进行编程
**********************************************************************/
uint08 writeFuseHig(uint08 wrByte)
{
	uint08 retVal;
	loadCMD(CMD_LOAD_WRITE_FUSE);
	loadDataL(wrByte);

	SET_BS1;
	CLR_BS2;
	usDelay(DELAY_PULSE);
	
	retVal=writeSection();
	return(retVal);
}



/**********************************************************************
functionName:uint08 writeLockByte(uint08 wrByte)
description:锁定位编程
**********************************************************************/
uint08 writeLockByte(uint08 wrByte)
{
	uint08 retVal;
	loadCMD(CMD_LOAD_WRITE_LOCK);
	loadDataL(wrByte);	
	retVal=writeSection();
	return(retVal);
}

/**********************************************************************
functionName:uint08 writeEep2Buf(uint08 wrByte)
description:加载EEPROM数据
**********************************************************************/
void writeEep(uint08 addLow,uint08 eepData)
{
	loadAddL(addLow);
	loadDataL(eepData);
	SET_PAGEL;		//锁存数据
	usDelay(DELAY_PULSE);
	CLR_PAGEL;
	usDelay(DELAY_PULSE);
}

/**********************************************************************
functionName:void writeEep2Page(void)
description:EEPROM页编程
**********************************************************************/
uint08 writeEep2Page(void)
{
	uint08 retVal;
	CLR_BS1;
	usDelay(DELAY_PULSE);
	retVal=writeSection();
	return(retVal);
}


/**********************************************************************
functionName:void flashDataLoad(uint08 addLow,uint08 dataHig,uint08 dataLow)
description:加载flash页数据
**********************************************************************/
void flashDataLoad(uint08 addLow,uint08 dataHig,uint08 dataLow)
{
	loadAddL(addLow);
	loadDataL(dataLow);
	loadDataH(dataHig);
	dataLatch();
}


/**********************************************************************
functionName:uint16 flashDataRead(uint08 addHig,uint08 addLow)
description:读取flash页数据
**********************************************************************/
uint16 flashDataRead(uint08 addHig,uint08 addLow)
{
	uint16 retVal;
	uint08 temp1,temp2;
	loadCMD(CMD_LOAD_READ_FLASH);
	loadAddH(addHig);
	loadAddL(addLow);
	
	HVP_DATA_IN;
	CLR_BS1;
	CLR_OE;
	usDelay(DELAY_PULSE);
	temp1=HVP_DATA_RD;
	SET_BS1;
	usDelay(DELAY_PULSE);
	temp2=HVP_DATA_RD;
	SET_OE;
	usDelay(DELAY_PULSE);
	HVP_DATA_OUT;		//设置为输出模式
	retVal=temp2;
	retVal<<=8;
	retVal|=temp1;
	return(retVal);
}

/**********************************************************************
functionName:uint16 flashDataRead2(uint16 addr)
description:读取flash页数据
**********************************************************************/
uint16 flashDataRead2(uint16 addr)
{
	uint16 retVal;
	uint08 temp1,temp2;
	loadCMD(CMD_LOAD_READ_FLASH);
	
	temp1 = (addr>>8)&0x00ff;
	temp2 = addr&0x00ff;
	
	loadAddH(temp1);
	loadAddL(temp2);
	
	HVP_DATA_IN;
	CLR_BS1;
	CLR_OE;
	usDelay(DELAY_PULSE);
	temp1=HVP_DATA_RD;
	SET_BS1;
	usDelay(DELAY_PULSE);
	temp2=HVP_DATA_RD;
	SET_OE;
	usDelay(DELAY_PULSE);
	HVP_DATA_OUT;		//设置为输出模式
	retVal=temp2;
	retVal<<=8;
	retVal|=temp1;
	return(retVal);
}



/**********************************************************************
functionName:void eraseChip(void)
description:擦除芯片
成功返回0xFF,失败返回0x00
**********************************************************************/
uint08 eraseChip(void)
{
	uint16 i = 0;
	uint08 retVal;
	loadCMD(CMD_LOAD_CHIP_ERASE);
	retVal=writeSection();
	return(retVal);
}




/**********************************************************************
functionName:void loadCMD(void)
description:启动命令加载,操作流水号:A
**********************************************************************/
void loadCMD(uint08 cmdCode)
{
	HVP_DATA_WR=0x00;
	HVP_DATA_OUT;
	SET_WR;
	SET_OE;
	CLR_BS2;
	CLR_PAGEL;
	CLR_XTAL;
	CLR_XA0;
	SET_XA1;
	CLR_BS1;
	usDelay(DELAY_PULSE);
	HVP_DATA_WR = cmdCode;
	usDelay(DELAY_PULSE);
	SET_XTAL;
	usDelay(DELAY_PULSE);
	CLR_XTAL;
	usDelay(DELAY_PULSE);
}

/**********************************************************************
functionName:void loadAddL(uint08 addLow)
description:加载地址低位字节  操作流水号:B
**********************************************************************/
void loadAddL(uint08 addLow)
{
	CLR_XA0;		
	CLR_XA1;
	CLR_BS1;
	HVP_DATA_WR = addLow;
	usDelay(DELAY_PULSE);
	SET_XTAL;
	usDelay(DELAY_PULSE);
	CLR_XTAL;
	usDelay(DELAY_PULSE);
}


/**********************************************************************
functionName:void loadDataL(uint08 dataLow)
description:加载数据低位字节  操作流水号:C
**********************************************************************/
void loadDataL(uint08 dataLow)
{
	CLR_XA1;		
	SET_XA0;
	HVP_DATA_WR = dataLow;
	usDelay(DELAY_PULSE);
	SET_XTAL;
	usDelay(DELAY_PULSE);
	CLR_XTAL;
	usDelay(DELAY_PULSE);
}


/**********************************************************************
functionName:void loadDataH(uint08 dataHig)
description:加载数据高位字节  操作流水号:D
**********************************************************************/
void loadDataH(uint08 dataHig)
{
	SET_BS1;
	CLR_XA1;		
	SET_XA0;
	HVP_DATA_WR = dataHig;
	usDelay(DELAY_PULSE);
	SET_XTAL;
	usDelay(DELAY_PULSE);
	CLR_XTAL;
	usDelay(DELAY_PULSE);
}


/**********************************************************************
functionName:void dataLatch(void)
description:锁存数据  操作流水号:E
**********************************************************************/
void dataLatch(void)
{
	SET_BS1;
	usDelay(DELAY_PULSE);
	SET_PAGEL;
	usDelay(DELAY_PULSE);
	CLR_PAGEL;
	usDelay(DELAY_PULSE);
}



/**********************************************************************
functionName:void loadAddH(uint08 addHig)
description:加载地址高位字节  操作流水号:G
**********************************************************************/
void loadAddH(uint08 addHig)
{
	CLR_XA0;		
	CLR_XA1;
	SET_BS1;
	HVP_DATA_WR = addHig;
	usDelay(DELAY_PULSE);
	SET_XTAL;
	usDelay(DELAY_PULSE);
	CLR_XTAL;
	usDelay(DELAY_PULSE);
}


/**********************************************************************
functionName:void pageProg(void)
description:编程一页数据  操作流水号:H
**********************************************************************/
uint08 pageProg(void)
{
	uint08 retVal;
	CLR_BS1;
	usDelay(DELAY_PULSE);
	retVal=writeSection();
	return(retVal);
}


/**********************************************************************
functionName:void pageProgEnd(void)
description:结束页编程  操作流水号:J
**********************************************************************/
void pageProgEnd(void)
{
	SET_XA1;
	CLR_XA0;
	HVP_DATA_WR = 0x00;
	usDelay(DELAY_PULSE);
	SET_XTAL;
	usDelay(DELAY_PULSE);
	CLR_XTAL;
	usDelay(DELAY_PULSE);
}


/**********************************************************************
functionName:uint08 readDataBus(uint08 hLsel)
description:	读数据总线数据
**********************************************************************/
uint08 readDataBus(uint08 hLsel)
{
	uint08 retVal;
	HVP_DATA_IN;
	if(hLsel)
	{
		SET_BS1;	
	}
	else
	{
		CLR_BS1;		
	}	
	CLR_OE;
	usDelay(DELAY_PULSE);
	retVal=HVP_DATA_RD;
	SET_OE;
	usDelay(DELAY_PULSE);
	HVP_DATA_OUT;		//设置为输出模式
	return(retVal);
}


/**********************************************************************
functionName:uint08 writeSection(void)
description:写数据时序  返回0xFF,表示成功,0x00,表示写失败
**********************************************************************/
uint08 writeSection(void)
{
	uint16 i;
	CLR_WR;
	usDelay(DELAY_PULSE);
	SET_WR;
	while(PINC&BIT(PIN_RDY))		//约25ms
	{
		i++;
		usDelay(8);
		if(i>1000)
		{
			return(0x00);
		}
		
	}
	i = 0;
	while(!(PINC&BIT(PIN_RDY)))		//约25ms
	{
		i++;
		usDelay(8);
		if(i>1000)
		{
			return(0x00);
		}
	}
	return(0xFF);
}

⌨️ 快捷键说明

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