ISP/IAP EEPROM
http://www.51hei.com/bbs/dpj-40283-1.html
具体实现代码:
-----------------------------------------------------------------------------------------------------------------------
#include
#include
#define uchar unsigned char
#define uint unsigned int
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
#define RDCommand0X01 //定义ISP操作命令
#define PrgCommand 0X02
#define EraseCommand 0X03
#define error 1
#define OK 0
#define WaitTime0x01 //定义CPU的等待时间
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
sfrISP_DATA=0XE2; //寄存器声明
sfr ISP_ADDRH=0XE3;
sfr ISP_SDDRL=0XE4;
sfr ISP_CMD=0XE5;
sfr ISP_TRIG=0XE6;
sfr ISP_CONTR=0XE7;
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//打开ISP/IAP功能
void ISP_IAP_Enable(void)
{
EA=0; //关中断
ISP_CONTR=ISPCONTR &0X18; //00011000
ISP_CONTR=ISPCONTR | WaitTime; //写入硬件延时
ISP_CONTR=ISPCONTR |0X80; //ISPEN=1
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//关闭ISP/IAP功能
void ISP_IAP_Disable(void)
{
ISP_CONTR=ISP_CONTR &0X7F; //ISPEN=0
ISP_TRIG=0X00;
EA=1; //开中断
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//触发代码
void ISP_Trig(void)
{
ISP_IAP_Enable(); //打开ISP/IAP功能
ISP_TRIG=0X46; //触发ISP/IAP命令字节1
ISP_TRIG=0XB9; //触发ISP/IAP命令字节2
_nop_();
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//指定地址---字节读
uchar Byte_Read(uint byte_addr)
{
ISP_ADDRH=(uchar)(byte_addr>>8); //地址赋值
ISP_ADDRL=(uchar)(byte_addr&0X00FF);
ISP_CMD=ISP_CMD &0XF8; //清除低三位
ISP_CMD=ISP_CMD |RDCommand; //写入读命令
ISP_Trig(); //触发执行
ISP_IAP_Disable(); //关闭ISP/IAP功能
return(ISP_DATA); //返回读到的数据
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//指定地址---扇区擦除
void Sector_Erase(uint sector_addr)
{
uintSector_Addr;
Sector_Addr=sector_addr &0XFE00; //取扇区地址
ISP_ADDRH=(uchar)(Sector_Addr>>8);
ISP_ADDRL=0X00;
ISP_CMD=ISP_CMD &0XF8; //清空低三位
ISP_CMD=ISP_CMD |EraseCommand; //擦出命令3
ISP_Trig(); //触发执行
ISP_IAP_Disable(); //关闭ISP/IAP功能
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//指定地址---字节写
void Byte_Write(uint byte_addr,uchar original_data)
{
ISP_ADDRH=(uchar)(byte_addr>>8); //取地址
ISP_ADDRL=(uchar)(byte_addr & 0X00FF);
ISP_CMD=ISP_CMD &0XF8; //清除低三位
ISP_CMD=ISP_CMD |PrgCommand; //写命令2
ISP_DATA=original_data; //写入数据准备
ISP_Trig(); //触发执行
ISP_IAP_Disable(); //关闭ISP/IAP功能
}
-----------------------------------------------------------------------------------------------------------------------
最后对于代码的一些部分做一定的解释:
ISP_ADDRH= (uchar)(Sector_Addr>>8); //Sector_Addr右移8位,然后赋值给ISP_ADDRH
ISP_ADDRL= (uchar)(byte_addr & 0X00FF);//byte_addr与上0X00FF,赋值给ISP_ADDRL
次处:
dataFlash(EEPROM)的最小扇区的地址为:
2000H=0010 0000 0000 0000B ,
共计16为,而ISP_ADDRH共8位,
且为地址寄存器的高八位,右移8位,相当于舍去低8位,把地址寄存器的高8为赋予给ISP_ADDRH
对于寄存器地址,byte_addr与上0X00FF,取byte_addr的低8位,强制转换成uchar,然后赋值给ISP_ADDRL,且ISP_ADDRL为地址寄存器的低8位.
下载
P3.0是RXD;
P3.1 TXD