📄 cpueeprom.c
字号:
#include <intrins.h>
#include "CPUeeprom.H"
#include "OS_CFG.H"
#include "NewType.h"
//stc89c58 eeprom数据
//stc89c58 eeprom共有58个扇区,每个扇区512字节,
//第一扇区起始地址为0x8000,结束地址为0x81ff,最后扇区起始地址为0xf200,结束地址为0xf3ff。
//根据姚工提示:
//擦写eeprom期间,串口硬件仍会工作,但只能收到最后一个数,看门狗也在工作,如果设的太短,会复位
//读写eeprom CPU等待时间按晶振频率设置,与6T或12T无关,
//14.7456M晶体写eeprom CPU等待时间按20M有些长,按10M有些短,还是按20M设吧
//读写擦除的触发指令后一般加1个NOP,只是习惯,不是必须
//可是试试读等待时间按最短处理
sfr isp_wdt = 0xe1;
sfr isp_data = 0xe2;
sfr isp_addrh = 0xe3;
sfr isp_addrl = 0xe4;
sfr isp_cmd = 0xe5;
sfr isp_trig = 0xe6;
sfr isp_contr = 0xe7;
//写入Eeprom
//注意写入前应擦出相应的扇区
//功能:将若干个字节的数据写入Eeprom。
// pc_DataBuf 指向数据缓冲区的指针。
// RomAddress 指向Eeprom内部地址。
// ByteNumber 要写入的字节数
bit WriteEeprom(unsigned char *pc_DataBuf,unsigned int RomAddress,
unsigned char ByteNumber)
{
for(;ByteNumber!=0;ByteNumber--) {
EA=0; // 关中断
isp_data=*pc_DataBuf;
isp_addrh = RomAddress/256;
isp_addrl = RomAddress%256;
isp_contr = 0x81;
isp_cmd = 2;
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
pc_DataBuf++;
RomAddress++;
EA = 1; // 开中断
}
isp_contr = 0;
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; // 开中断
return 1;
}
//读Eeprom
//功能:从Eeprom读出若干个字节。
// pc_DataBuf 指向数据缓冲区的指针。
// RomAddress 指向Eeprom内部地址。
// ByteNumber 需要读出的字节数。
bit ReadEeprom(unsigned char *pc_DataBuf,unsigned int RomAddress,
unsigned char ByteNumber)
{
// EA=0; // 关中断
for(;ByteNumber!=0;ByteNumber--)
{
EA=0; // 关中断
isp_addrh = RomAddress/256;
isp_addrl = RomAddress%256;
//isp_contr = 0x81; // 1000,0001 按20M设置等待时间
isp_contr = 0x83; // 1000,0001 按5M设置等待时间
isp_cmd = 1;
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
*pc_DataBuf = isp_data;
pc_DataBuf++;
RomAddress++;
EA = 1; // 开中断
}
isp_contr = 0;
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; // 开中断
return 1;
}
//块擦除
//StarAddress和ByteNumber必须是512的整数倍
bit eraser_eeprom(unsigned int StarAddress,unsigned int ByteNumber)
{
unsigned char i,sector_number;
//计算要擦除的扇区数
if (ByteNumber%512==0) sector_number=ByteNumber/512;
else sector_number=ByteNumber/512+1;
//开始擦除扇区
EA = 0; // 关中断
isp_addrh = ((unsigned char)(StarAddress/256)) & 0xfe;
isp_addrl = 0;
for (i=0;i<sector_number;i++) {
isp_contr = 0x81;
isp_cmd = 3;
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
isp_addrh +=2; //扇区首址+512字节
}
isp_contr = 0;
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; // 开中断
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -