加载中...
存储编程经验
发表于:2010-06-02 | 分类: 硬件设计
字数统计: 4.1k | 阅读时长: 15分钟 | 阅读量:

EE编程经验: 内部EEPROM 如果单片机内部自带的EE,如果编译器自带有函数,那最好使用编译器自带的函数 //eeprom_write   eeprom_read 是PICC自带系统函数   具体用法参照HI-TECH PICC库函数 中EEPROM_READ、EEPROM_WRITE函数 对外部扩展的24C256: 模拟IIC或者采用IIC部件 单片机是主控部件,EEPROM是从属部件 MSSP,可用作SPI模式,或者I2C模式 调试方法: 写入再读取出来查看,或者view中查看EEPROM

增强可靠性操作注意

避免低电压时候对EEPROM操作,容易导致数据丢失 启用BOR 曾经就反复插拔上点导致设备内部数据错乱 在初始化时候加上延时可能有好转但是并未解决问题 后来见网上讨论的比较多,把掉电检测由2.7V改为4V,但是也并没有见起作用,后来发现掉电检测根本没有使能,始能后就好了 网上论坛里的一些帖子: EEPROM写入时,电压不能太低。但是AVR单片机可以在低电压下工作,这样如果采用阻容复位,当电压低于4。0V时,单片机还可以可靠的工作,可读写E2就不可靠了。所以最好加专用复位电路,如果内部有BOD,也可以。最好选择4.0V的。 我使用8515,电源通断几次后数据就被破坏,后来加了max706后就没有问题了 MAX706是一种使用方便的廉价微处理器监控电路,可提供下述4种功能: (1)加电、掉电及电压降低时输出复位信号。 (2)独立监视跟踪定时器输出。在1.6s内监视跟踪定时器输入端不被触发,监视跟踪定时器输出变为低电平有效。 (3)1.25V门限监测器,用于电源故障报警、低电压检测或+5V以外的电源监控 (4)TTL/CMOS兼容的防抖动、低电平有效的人工复位输入。 BODEN置位,5V系统BOD电压设为4.3V,3V系统BOD设为2.7V。 以前也遇到同样的问题,外接带电压检测的看门狗就好了(当年的AVR没有BOD),后来出了带BOD的AVR,就把看门狗给省了,没见有什么问题。 == 避免电压不稳操作: 电延时 电源监控 BOR 避免正写过程被中断: 电源也缓冲断电,电容 写的时候关中断 避免模拟总线时序规范: 有的速度太快,增加延时,增大上拉电阻减小速度 软件增强安全: 多个备份,校验,恢复,只是一种措施,也有可能备份地方全部是错误的 必要时,对写入数据后做一次读出校验

24C256跨页写

曾经写的量少,没有发声跨页写的情况,后来遇到了跨页写出错的情况才意识到此问题 写的时候,要计算一下当前地址当前偏移是否会跨页操作,如果产生跨页操作,则先操作此页上的偏移量,剩余的偏移量递增页再操作

24c256

24c256(转) 已有 440 次阅读 2009-04-19 19:22 24系列EEPROM的应用所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。 关于IIC总线 I2C总线:i2c总线是 Philips 公司首先推出的一种两线制串行传输总线。它由一根数据线(SDA)和一根时钟线(SDL)组成。i2c总线的数据传输过程如图3所示,基本过程为: 1、主机发出开始信号。 2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。 3、从机发出认可信号。 4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。  应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。 注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。 作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。下面总结一下其应用的一些要点。从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。 1.工作电压(VCC) 24CXX: 4.5V-5.5V 24CXX-W:2.5V-5.5V 24CXX-R: 1.8V-5.5V 2. 输入电平定义(VIH,VIL) VIH:0.7VCC-VCC+1 VIL:-0.45V-0.3VCC 二、硬件连接 1.上拉电阻RP的取值 由于I2C总线电容要满足小于400pf的条件。从以下波形可以看出,上拉电阻越大,总线的电容越小,可以实现的数据传输率就越大,可达400khz。 2.写保护脚 芯片写保护脚是高电平有效,即WP接高电平时禁止写入 3.地址脚 24C01/24C02 三个地址脚(E0,E1,E2)都有效,24C04只有E2,E1有效,24C08只有E2有效,24C16三个地址脚都无效,如下图所示,所谓地址脚无效是指不需要接入电路中(NC ,not connected),其对应的地址位要用来表示要操作的字节的高位地址。 24C32/24C64三个地址脚都有效; 24C128/24C256/24C512的地址脚E1和E0有效,其余为NC; 24C1024的地址脚E1有效,其余为NC。 三、寻址方式 1.器件地址 当总线上连接多个I2C器件时,需要对器件进行寻址。器件地址如下表所示,其中E2,E1,E0是指三个引脚的状态,取决于是接地还是接高电平,R/W为1则为读操作,为0则为写操作。A8,A9,A10,A16指的是所要操作的字节地址的高位,后面会提到。 芯片bit7bit6 bit5 bit4bit3 bit2 bit1 bit024C01/02/21 1010E2E1E0R/W24C041010E2E1A8R/W24C081010E2A9A8R/W24C161010A10A9A8R/W24C32/641010E2E1E0R/W24C128/256/51210100E1E0R/W24C102410100E1A16R/W 2.字节地址 在对芯片内的某一字节或一连续地址进行读写操作时,需要制定其地址或首字节的地址,不同芯片地址有不同的表示方式,如下表所示,其中有些芯片的地址位的高位存储在器件地址中。 芯片地址位数地址范围24C01bit7-bit00x00-0x7F24C02bit7-bit00x00-0xFF24C04A8,bit7-bit00x00-0x1FF24C08A9,A8,bit7-bit00x00-0x3FF24C16A10,A9,A8,bit7-bit00x00-0x7FF24C32bit15-bit8,bit7-bit00x00-0xFFF24C64bit15-bit8,bit7-bit00x00-0x1FFF24C128bit7-bit00x00-0x3FFF24C256bit7-bit00x00-0x7FFF24C512bit7-bit00x00-0xFFFF24C1024A16,bit15-bit8,bit7-bit00x00-0x1FFFF 四、读写时序 EEPROM一般在电路中做从器件,以下的发送和接收都是针对主器件说明的,开始和结束条件也是由主器件发出。 1、单字节写操作 START->发送器件地址->ack->发送字节地址->ack->发送数据->ack -> STOP 2、按“页”写操作,“页”是指高位地址一样一组数据,对于24C01/02/04/08/16,一页数据为16字节,一页指高四位地址一样的一组数据。对于24C32/24C64,一页数据为32字节,一页指高11位地址一样的一组数据。 START->发送器件地址->ack->发送页首地址->ack->发送数据->ack………-> 发送数据->ack -> STOP 3、随机单字节读操作 START->发送器件地址(写)->ack->发送字节地址->ack->START->发送器件地址(读)->ack->接收数据->noack->STOP 4、当前单字节读操作,“当前”指的是前面进行过读操作,但是没有STOP,芯片内部“指针”指的字节即为“当前”字节。 START->发送器件地址(读)->ack->接收数据->noack->STOP 5、随机连续字节读操作 START ->发送器件地址(写)->ack->发送字节首地址->ack->START->发送器件地址(读)-> ack->接收数据->ack->接收数据->ack………接收数据(最后字节) ->noack->STOP 6、当前连续字节读操作 START->发送器件地址(读)->ack->接收数据->ack->接收数据 ->ack……………接收数据(最后字节)->noack->STOP 关于页写的道理。 AT24Cxx系列的EEPROM为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的EEPROM页擦除,再把一整页RAM数据写入。所有写数据都发生在开始写地址时确定的页上。 如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是07F,1页就是80FF,类推,边界就是128字节的整数倍地址。页 RAM的地址范围为7位007F,写入时高端地址就是页号。发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0FF,808F。也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet上都有说明。就是从边界前写两个字节也要分两次写。页是绝对的,按整页大小排列,不是从开始写入的地址开始算。 读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。但一次性访问的数据长度也不要太大。所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。 关于页写的道理。 AT24Cxx系列的EEPROM为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的EEPROM页擦除,再把一整页RAM数据写入。所有写数据都发生在开始写地址时确定的页上。 如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是07F,1页就是80FF,类推,边界就是128字节的整数倍地址。页 RAM的地址范围为7位007F,写入时高端地址就是页号。发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0FF,808F。也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet上都有说明。就是从边界前写两个字节也要分两次写。页是绝对的,按整页大小排列,不是从开始写入的地址开始算。 读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。但一次性访问的数据长度也不要太大。所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。 24C256是具有I2C接口的512x64存储器,在数据的存储过程中除了遵循I2C协议必须的逻辑以外,一个最容易忽视并且最容易导致出错的问题就是存储地址问题。 24C256的数据容量是32768,即可以存储的有效字节数。所以它的地址是16位整型数,有效范围是0~32768,数据字节为单位存储,在16位地址其中有效数据只有15位,低6(0~5)位地址表示的容量是0~63,然后连续的9(6~14)位地址表示页码的范围是0~511,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。例如,地址是63(二进制码111111)表示的是第0页的最后一个存储空间,地址64(二进制码1,000000)表示第1页最开始的存储空间。在当前存储地址是63时如果该器件处于连续存储模式下,数据将出错。 原因是什么呢? 24C256支持数据的连续存储,最大的存贮数量是64即一页的内容,如果在地址选择上超过了这个限制,数据将会覆盖本页开始的位置重新存储,这就造成数据的错误,在使用上,虽然数据是分页存储的,但在形式上是连续数据,所以存储中不需要特意区分页地址和页内地址。 在连续存储中,尽管数据每次存储的数量小于64,数据也可能出错,例如每次存储数量为11,地址的变化是0,11,22,33,44,55,66……,看上去没有什么问题,地址是按照每次11递增的,然而存储的结果还是出错了,原因是什么呢?在地址55开始的空间无法提供连续11个页内存储空间,当地址增加到63以后数据又从该页0地址重新开始,从而导致数据储存的错误。有效的解决办法是如果使用连续存储模式,地址的安排上要使存储块的大小为64,32,16,8,4,2此外都不能使用连续地址存储。如果数据采集中的有效数据位小于64,比如每次采集的结果是30字节,在连续存储模式下要按照32为单位存储,不足的字节补零处理。

ref

ST官方给的I2C eeprom例程中while死等的语句比比皆是,本来I2C就做得复杂,还四处布满死等代码,很容易在使用中让系统死机。

上一篇:
霍尔元件
下一篇:
AVR开发实践
本文目录
本文目录