51单片机eeprom 操作eeprom读那一本书好一点,谢谢

经验分享——EEPROM读写及数据管理 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
经验分享——EEPROM读写及数据管理
13:50:13  
11988&查看
本帖最后由 wscf123 于
23:35 编辑
经常有人在QQ群讨论有关E2PROM操作、保护、失效等一些问题,今天闲来没事,简单概括总结一下咯。(才疏学浅,路过的英雄记得补刀) 1)有关 芯片内部自带的E2PROM
有的资深的工程师可能不是很愿意用MCU自带的E2PROM,大概是这些家伙上过什么当、受过骗还是什么的。简单说一下优缺点吧:
(1)片内集成的感觉挺便宜的,和MCU一起卖的,对成本要求严格的,写次数很少的场合一般会考虑,至少能省个2、3毛钱吧;(2)缺点的话,可能擦写次数、稳定性没有外挂的专用芯片厉害;
2)有关常用的外挂E2PROM
如果是学生或者刚从学生时代走来的人们,大概也就知道ATMEL 24C0X系列吧,就好像我毕业的时候以为世界只有51和AVR,开个玩笑!工程师主要考察E2PROM的参数无非就是擦写次数、功耗、稳定性、价格,其中10万次擦写次数和 100万次擦写次数正在较量,至于从工程师的角度考虑 擦写次数自然是没有上限最好,太低的擦写次数会让程序员死很多脑细胞。 3)有关E2PROM的数据管理
(1)操作注意事项:分页操作需要有5ms延迟等待时间才可以(以类AT24C04的产品为例),也就是模块化程序设计中,在写数据之前、写数据完毕后、度数据之前、读数据之后都需要考虑加5ms的延时时间。本来IIC的读写速率就不是很高,外加这些延迟一定会势必影响系统设计的实时性,但也不得不从读写性能的角度出发。
(2)上拉电阻的选择:出于稳定性考虑,WP、SDA、SCL引脚都会设置上拉电阻,常用的电阻值为 4.7K 、10K电阻,个人比较推荐4.7K。
(3)硬件IIC与软件模拟IIC的比较:对MCU资源不是很敏感的应用,都会考虑软件模拟的方式,毕竟这个移植起来真的很方便,只有第一做软件部分的时序、保护性设计作为足够好,后面拿过来修改时钟就可以直接,确实方便。
(4)默认参数的写入:设置新E2PROM的时间戳标志,每次系统启动时检查这个时间戳和MCU自身存储的时间戳是否一致,不一致则初始化整个E2PROM为默认参数;当然软件程序的升级,这个时间戳表示也有必要做更改。
(5)数据容错和管理:把数据以有意义的数据块作分类管理,在数据的块的头、位加固定标识和CS/CRC校验 模式,格式如 &&数据块开始字&&数据长度数据校验结束0xA5LengthByte0---ByteNCS/CRC0x5A
实际用于产品中,可以挑选这个格式内容里面的部分内容使用,比如去掉结束符等。个人之所以建立写入开始字、结束字,原因是方便最好读出来的数据做数据格式检查,确认写入、读出的数据可靠性最高。& &为增强实际的可靠性,在需要写入的时候,可以在写入后,再读出来进行数据的比对,确认写入是否正确;或者在需要读出的时候,读两次、或者多次,检查每次的数据是否一致。& &对于出现异常的数据,最好有容错机制,可以回到默认状态值,不至于系统此时因为某个参数改变的崩溃。
(6)实际底层操作是否需要关闭主程序的中断:一般按照上述(5)操作,有多次冗余操作设计,可以不关闭主程序中断。而且,IIC为等待型操作,一般不会因为系统延迟导致时钟脉宽拉长,影响字节写入、读出。
(7)E2PROM擦写次数的延长: 如果现在手上的E2PROM的擦鞋次数是10万次,项目要求为100万次,且E2PROM内有很多空闲字节的没有使用。
可以这样操作,将数据整理好,以数据块的方式存储,一组数据分10个块地址存储,每次写完后转移到下一块写,即10次写操作中每个物理的数据存储地址只操作了1次。 注意此时的写块数据的指针不能单独存、操作,不然这个字节的操作频率高,也就受到10万次的限制,这个关键的链子在10万次的时候掉了,其他字节也就挂了。这个表征操作哪个块的指针或者说标示符,当然也需要是移动的,至于具体怎么实现,就是见仁见智的事了。
17:52:14  
楼主,分享快乐
22:22:32  
楼主,分享快乐
20:16:05  
谢谢分享。。。。。
12:33:20  
谢谢分享。。。。。
09:15:09  
这么好的帖子,自己顶一下
16:30:32  
感谢分享~~~~~~~~~~
23:35:04  
的确很好,多谢分享
00:15:51  
顶一下,不错,
21:54:02  
xiexie louzhu fenxiang
22:30:03  
讲得好!多谢楼主提点
11:31:52  
新手&&来着不拒 所以都看
09:59:54  
就要这样的经验分享,都是无价啊
15:18:37  
那个5ms延时不是很明白& & 有没有哪位再补充下& & 谢谢!
17:04:31  
那个5ms延时不是很明白& & 有没有哪位再补充下& & 谢谢!
看数据手册,跨页写需要延时5ms
12:27:03  
看数据手册,跨页写需要延时5ms
ok&&明白了&&谢谢LZ
10:27:11  
谢谢& &经验分享——EEPROM读写及数据管理
除了亲人欢聚的喜悦
让人头痛的就是来自亲朋好友的过度关怀
“做什么工作啊?”
“工资多少啊?”
“有没有女朋友?”
“什么时候结婚?”
“买房了吗?”
面对让人崩溃的问题,如何自救呢?快来支支招吧!
春节回家,除了见到亲人,儿时的玩伴
那一顿一顿的美食
带了家乡独有的味道
光是想想,都就能让人,垂涎三尺。
快拿起你手中的相机,拍下美食
一起分享你的幸福,还有机会中大奖喔
Powered by51单片机内部EEPROM读写测试程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机内部EEPROM读写测试程序
上传于||文档简介
&&51单片机内部EEPROM读写测试程序
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢51单片机EEPROM的应用 - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
51单片机EEPROM的应用
18:46:34  
之前发帖子问怎样实现断电后改动的数据不丢失
得知51单片机可以通过EEPROM实现
百度文库搜得资料,要20财富
18:47:47  
没发上,再发一下
18:47 上传
点击文件名下载附件
下载积分: 积分 -1 分
14.34 KB, 下载次数: 449, 下载积分: 积分 -1 分
高级工程师
19:02:22  
21:58:44  
lstcspring 发表于
助理工程师
23:05:41  
助理工程师
00:14:13  
16:19:14  
16:21:30  
EB太伤了……
16:22:54  
EB太伤了……
21:13:57  
先顶起,下来看看怎么样
21:51:55  
顶顶顶顶顶顶顶顶顶顶
23:03:03  
谢谢分享谢谢分享反复学习
15:49:14  
{:12:}{:12:}
19:02:51  
感谢分享,正想要的东西
23:59:01  
{:1:}{:1:}
19:26:02  
STC还有EEPROM啊,没发现饿。
23:40:16  
bbbromm 发表于
STC还有EEPROM啊,没发现饿。
感觉不算是真正的eeprom,算是isp/iap吧
21:27:23  
机械菜鸟 发表于
没发上,再发一下
hjjjjjjjjjjjjjjjjjj
23:57:36  
谢谢咯。。。感谢分享。
助理工程师
00:31:00  
谢谢咯。。。感谢分享。
除了亲人欢聚的喜悦
让人头痛的就是来自亲朋好友的过度关怀
“做什么工作啊?”
“工资多少啊?”
“有没有女朋友?”
“什么时候结婚?”
“买房了吗?”
面对让人崩溃的问题,如何自救呢?快来支支招吧!
春节回家,除了见到亲人,儿时的玩伴
那一顿一顿的美食
带了家乡独有的味道
光是想想,都就能让人,垂涎三尺。
快拿起你手中的相机,拍下美食
一起分享你的幸福,还有机会中大奖喔
Powered by51单片机学习笔记:连续读写STC89C52RC内部EEPROM存储器 - 嘎子的博客 - ITeye技术网站
博客分类:
STC单片机的内部EEPROM是用DATAFLASH模拟出来的,不是真正的EEPROM存储器,不能用普通的方法来操作下面是一些注意点:1.字节写之前要先将这个字节所在扇区的其它有效数据读取到RAM暂存(这步不是必须的)2.暂存完之后再对整个扇区(512字节)进行擦除操作,擦拭完后,整个扇区每个地址中数据都变成0xFF3.将欲写入的N个字节数据,用字节写函数写入EEPROM4.将暂存到RAM的其它有用的EEPROM值再用字节写函数写回EEPROM5.STC用FLASH模拟出来的EEPROM的字节写功能只能将1变成0,而不能将0变成1,
只有扇区擦除后数据才是全1,
例如:在地址0x21f0处第1次写,第2次写111010,读出结果是这2个值的相与10010
所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先执行扇区擦除,变为0xff,
对于单个字节的写入,我们可以先检查该地址处的数据是否为0xff,是的话就不用擦除扇区了
----------------------------------------------------------------------STC89C52单片机内部EEPROM 的读写过程 1
配置ISP_CONTR寄存器,使能第7位ISPEN,让ISP_IAP功能生效,并配置低3位的等待时间2
写指令: 读/写/擦除扇区 这3个命令3
赋值: ISP_ADDRH和ISP_ADDRL的地址值4
关闭总中断EA,因为下面要写的2个触发指令必须是连续操作的,不能被中断5
执行公用的
ISP_IAP 触发指令,触发后读写操作才能进行6
打开中断 EA, 关闭ISP_IAP功能:清相关寄存器
#include "my51.h"
/******************定义命令字节******************/
#define read_cmd
//字节读数据命令
#define wirte_cmd
//字节编程数据命令
#define erase_cmd
//扇区擦除数据命令
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/*定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数******************/
//#define enable_waitTime 0x80 //系统工作时钟&30MHz 时,对IAP_CONTR 寄存器设置此值
//#define enable_waitTime 0x81 //系统工作时钟&24MHz 时,对IAP_CONTR 寄存器设置此值
//#define enable_waitTime 0x82
//系统工作时钟&20MHz 时,对IAP_CONTR 寄存器设置此值
#define enable_waitTime 0x83 //系统工作时钟&12MHz 时,对IAP_CONTR 寄存器设置此值
//#define enable_waitTime 0x84 //系统工作时钟&6MHz 时,对IAP_CONTR 寄存器设置此值
void ISP_IAP_disable(void)
//关闭ISP_IAP
//恢复中断
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
void ISP_IAP_trigger()
//下面的2条指令必须连续执行,故关中断
ISP_TRIG = 0x46;
//送触发命令字0x46
ISP_TRIG = 0xB9;
//送触发命令字0xB9
void ISP_IAP_readData(u16 beginAddr, u8* pBuf, u16 dataSize) //读取数据
ISP_DATA=0;
//清零,不清也可以
ISP_CMD = read_
//指令:读取
ISP_CONTR = enable_waitT
//开启ISP_IAP,并送等待时间
while(dataSize--)
//循环读取
ISP_ADDRH = (u8)(beginAddr && 8);
//送地址高字节
ISP_ADDRL = (u8)(beginAddr & 0x00ff); //送地址低字节
ISP_IAP_trigger();
beginAddr++;
*pBuf++ = ISP_DATA;
//将数据保存到接收缓冲区
ISP_IAP_disable();
//关闭ISP_IAP功能
void ISP_IAP_writeData(u16 beginAddr,u8* pDat,u16 dataSize) //写数据
ISP_CONTR = enable_waitT
//开启ISP_IAP,并送等待时间
ISP_CMD = wirte_
//送字节编程命令字
while(dataSize--)
ISP_ADDRH = (u8)(beginAddr && 8);
//送地址高字节
ISP_ADDRL = (u8)(beginAddr & 0x00ff);
//送地址低字节
ISP_DATA = *pDat++;
beginAddr++;
ISP_IAP_trigger();
ISP_IAP_disable();
void ISP_IAP_sectorErase(u16 sectorAddr)
//扇区擦除
ISP_CONTR = enable_waitT
//开启ISP_IAP;并送等待时间
ISP_CMD = erase_
//送扇区擦除命令字
ISP_ADDRH = (u8)(sectorAddr && 8);
//送地址高字节
ISP_ADDRL = (u8)(sectorAddr & 0X00FF);
//送地址低字节
ISP_IAP_trigger();
ISP_IAP_disable();
//关闭ISP_IAP功能
void main()
u8 buf[3]={0};
//接收数据缓冲区
u8 dat[5]={b(111010),b(1001),b(1),b(1011),b(1110)};//我写成二进制是为观察led灯
ISP_IAP_sectorErase(0x2000);
//扇区擦除,一块512字节
ISP_IAP_writeData(0x21f0,dat,sizeof(dat));
//写EEPROM
ISP_IAP_readData(0x21f0,buf,sizeof(buf));
P1=buf[2];//在地址0x21f0处第1次写,第2次写111010,读出结果是这2个值的相与10010
while(1); //所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先擦除为0xff
#ifndef _MY51_H
#define _MY51_H
#include &reg52.h&
//#include &math.h&
#include &intrins.h&
#include &stdio.h&
#include "mytype.h"
/*************二进制输入宏****************************/
#ifndef _LongToBin_
#define _LongToBin_
#define LongToBin(n) \
((n && 21) & 0x80) | \
((n && 18) & 0x40) | \
((n && 15) & 0x20) | \
((n && 12) & 0x10) | \
& 0x08) | \
& 0x04) | \
& 0x02) | \
((n ) & 0x01)
LongToBin(0x##n##l)
/*************单个数据位的置位宏*********************/
#define high 1
#define low
#define led P1
//灯总线控制
sbit led0=P1^0;
//8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //led锁存的状态,0锁定 ,1不锁定
sbit beep=P2^3;
void delayms(u16 ms);
//void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
xouou_53320
浏览: 281154 次
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
不过改了iconv.exe路径也不能用。。。。单片机EEPROM读写程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机EEPROM读写程序
上传于||文档简介
&&单片机EEPROM读写程序
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 单片机和eeprom加密 的文章

 

随机推荐