📄 hvprog.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 + -