单片机内部e2prom读写问题

如下程序:/*主函数*/voidmain(){while(1){Stc89c52rcE2prom_ByteWrite(0x2000,45);//写入成功Stc89c52r... 如下程序:

/*主函数*/
void main(){
while(1){
Stc89c52rcE2prom_ByteWrite(0x2000,45); //写入成功
Stc89c52rc_SectorErase(0x2000); //擦不掉
Stc89c52rcE2prom_ByteWrite(0x21ff,56); //写入成功

tem=Stc89c52rcE2prom_ByteRead(0x21ff); //读数是56

tem=Stc89c52rcE2prom_ByteRead(0x2000); //读数还是56

}
}
///////////////////////扇区数据擦除/////////////
void Stc89c52rc_SectorErase(uint sector_addr) {
uint iSectorAddr;
iSectorAddr = (sector_addr&0xfe00); //获取扇区的地址
ISP_ADDRH = (uchar)(iSectorAddr>>8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xF8; //清空低3位
ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3
ISP_trigger(); //触发执行
ISPIAP_DIS(); //关闭ISPIAP功能
}
展开
 我来答
硬件开发88
推荐于2018-04-15 · TA获得超过8675个赞
知道大有可为答主
回答量:1757
采纳率:84%
帮助的人:586万
展开全部
这样写不对的,主程序进入:先擦出扇区,在写入然后在读出来
while{
Stc89c52rc_SectorErase(0x2000); //擦不掉
Stc89c52rcE2prom_ByteWrite(0x2000,45); //写入成功

Stc89c52rcE2prom_ByteWrite(0x21ff,56); //写入成功

加个延时

tem=Stc89c52rcE2prom_ByteRead(0x21ff); //读数是56
num=Stc89c52rcE2prom_ByteRead(0x2000); //读数还是56
}
用两个变量来赋值,或者用数组赋值

看看我写的EEPROM擦除扇区,写入-读出
读数据
INT8U Read_Flash_Byte(INT16U addr)
{
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x01;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;

return IAP_DATA;
}
写入数据
void Write_Flash_Byte(INT8U byte, INT16U addr)
{
IAP_DATA = byte;
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x02;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
}
擦除扇区

void Erase_Flash_Sector(INT16U addr)
{
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x03;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
}
一万光年MEGn0
2013-10-27 · TA获得超过3712个赞
知道大有可为答主
回答量:4602
采纳率:67%
帮助的人:1067万
展开全部
芯片是STC89C52吗?
内部EEPROM地址要搞清楚,哪些是可写可以擦的,哪些不能擦写的。

写数据前,需要擦除。

另就是确定看你是不是真的写进去了。
追问
是STC89C52,写地址是0x2000,擦地址也是0x2000,另外读地址即便是0x21ff读出的数据也是我最后一次存的数据,为什么?
追答
刚开始没注意看你的擦除程序,你的擦除程序是有错误的。

给你看下我的擦除程序

void earse_one_sector_in51_ctr(uint eeprom_page_addr)
{

EA=0;
IAP_CONTR=0X83;
IAP_CMD =erase_cmd;//字节擦除命令,, IAP_CMD

IAP_ADDRH=eeprom_page_addr>>8;
IAP_ADDRL=eeprom_page_addr;

IAP_TRIG=0X5a;
IAP_TRIG=0Xa5;//
//delay_nus(2);
Nop();
Nop();
IAP_CONTR=0X00;
IAP_CMD =0X00;
IAP_TRIG=0X00;
IAP_ADDRH=0Xff;
IAP_ADDRL=0Xff;
EA=1;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式