找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3407|回复: 3
收起左侧

单片机自带eeprom为什么写入了之后读取的时候数据不一样

[复制链接]
ID:890120 发表于 2021-4-3 17:07 | 显示全部楼层 |阅读模式
(H_%~HF%98[{QLKKKS38[RX.png
void EEPROM_delete(uint addr)
{       
// 打开 IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间
// 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
    ISP_CONTR = 0x81;  
    ISP_CMD   = 0x03;                  // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
    ISP_ADDRL = addr;         // ISP/IAP操作时的地址寄存器低八位,
    ISP_ADDRH = addr>>8;      // ISP/IAP操作时的地址寄存器高八位。
        EA =0;   
    ISP_TRIG = 0x46;          // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
    ISP_TRIG = 0xB9;          // 再写入B9h,ISP/IAP命令才会生效。
    _nop_();
        EA =1;
    ISP_off();                                          // 关闭ISP/IAP
}
/***************************************************************
函数:写一字节
入口:addr = 扇区单元地址 , dat = 待写入数据
***************************************************************/
void EEPROM_write(uint addr,uchar dat)
{
    ISP_CONTR = 0x81;                  
    ISP_CMD   = 0x02;              // 用户可以对"Data Flash/EEPROM区"进行字节编程
    ISP_ADDRL = addr;        
    ISP_ADDRH = addr>>8;      
    ISP_DATA  = dat;          // 数据进ISP_DATA
    EA = 0;
    ISP_TRIG = 0x46;         
    ISP_TRIG = 0xB9;         
    _nop_();
        EA =1;
    ISP_off();                                          // 关闭ISP/IAP
}
/***************************************************************
函数:读一字节
入口:addr = 扇区单元地址
出口:dat  = 读出的数据
***************************************************************/
uchar EEPROM_read(uint addr)
{   
    uchar dat;
       
        ISP_CONTR = 0x81;                  
    ISP_CMD   = 0x01;         // 用户可以对"Data Flash/EEPROM区"进行字节读
    ISP_ADDRL = addr;         
    ISP_ADDRH = addr>>8;      
    EA = 0;
    ISP_TRIG = 0x46;         
    ISP_TRIG = 0xB9;         
    _nop_();
    dat = ISP_DATA;                          // 取出数据
        ISP_off();                                          // 关闭ISP/IAP
        EA =1;                  
        return dat;
}
/***************************************************************
函数:关闭ISP/IAP操作
***************************************************************/
void ISP_off()
{
    ISP_CONTR = 0;            // 关闭IAP功能
    ISP_CMD   = 0;            // 待机模式,无ISP操作
    ISP_TRIG  = 0;            // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
        ISP_ADDRH = 0;
        ISP_ADDRL = 0;         
}
/**********************************************************************************************
STC89C52RC内部EEPROM详细地址表:
第一扇区               第二扇区                第三扇区                第四扇区
起始地址  结束地址     起始地址   结束地址     起始地址   结束地址     起始地址    结束地址
2000h     21FFh        2200h      23FFh        2400h      25FFh        2600h       27FFH

第五扇区               第六扇区                第七扇区                第八扇区
起始地址  结束地址     起始地址   结束地址     起始地址   结束地址     起始地址    结束地址
2800h     29FFh        2A00h      2BFFh        2C00h      2DFFh        2E00h        2FFFh
**********************************************************************************************/


回复

使用道具 举报

ID:625538 发表于 2021-4-3 17:20 | 显示全部楼层
可以检查一下写入的地址和读取的地址是不是一样
回复

使用道具 举报

ID:890120 发表于 2021-4-3 18:21 | 显示全部楼层
lml25680 发表于 2021-4-3 17:20
可以检查一下写入的地址和读取的地址是不是一样

写入和读取的地址是一样的
回复

使用道具 举报

ID:584814 发表于 2021-4-4 10:57 | 显示全部楼层
不外乎两种可能:程序错或硬件坏
一般程序是抄的错多在延时
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表