EEPROM 那些事(简单记录)

前言

写此文的缘由是一次小组作业。博主负责查阅资料,因此顺水推舟,稍微整理了一下,放博客上以备不时之需。(毕竟之前也没接触过)

时间匆忙,故比较简略,详细内容后续有机会再补充吧。

前世今生 —— ROM 家族的发展

graph LR
A["ROM"] --> B["PROM"] --> C["EPROM"] --> D["EEPROM"]
  • ROM(Read Only Memory) —— 只读存储器

    在微机的发展初期,BIOS 都存放在 ROM 中。ROM 内部的资料是在 ROM 的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用,重新订做一份。

  • PROM(Programmable ROM) —— 可编程只读存储器

    由于 ROM 制造和升级的不便,后来人们发明了 PROM。最初从工厂中制作完成的 PROM 内部并没有资料,用户可以用专用的编程器将自己的资料写入,但是这种机会只有一次,一旦写入后也无法修改,若是出了错误,已写入的芯片只能报废。

  • EPROM(Erasable Programmable ROM) —— 可擦除可编程只读存储器 为了解决 PROM 只能写入一次的问题,EPROM 被创造出来。EPROM 芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路,紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。EPROM内资料的写入要用专用的编程器,并且往芯片中写内容时必须要加一定的编程电压。

  • EEPROM(Electrically Erasable Programmable ROM) —— 电可擦除可编程只读存储器 虽然上述的 EPROM 解决了传统 ROM 只能写入一次的问题,但要对其进行擦除仍然较为繁琐。试想,如果你需要修改某些数据,则需要你从设备中取出 EPROM,用紫外光照射 10 分钟甚至 30 分钟,整个过程是十分耗时的。 EEPROM 则解决了这个问题,它可以通过电子信号来进行擦除和写入。。。此外,EEPROM 擦除时的最小单位为 Byte,可以不进行全片擦除,这也使得其应用更加灵活。 EEPROM还具有独特的双电压特性,在日常使用中不涉及数据写入的场景下,可通过跳线设置电压,达到写保护的目的,防止 CIH 类病毒的修改。

EEPROM 工作原理

可以参考 https://mp.weixin.qq.com/s/oAKoaveeU5nT8iT4Md-xnA

写的很详细。

FLASH 与 EEPROM

那么,既然有了 EEPROM,为什么还有 Flash 呢?

FLASH 和 EEPROM 的最大区别是, FLASH 按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同。

FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器;EEPROM 则更多的用作非易失的数据存储器。

当然用FLASH做数据存储器也行,但其在读写操作上比 EEPROM麻烦的多,特别是在小数据量反复重写的场景下 Flash 就不太适合,所以在MCU中 Flash 结构适于不需频繁改写的程序存储器。

很多应用中,需要频繁的改写某些小量数据且需掉电非易失,传统结构的 EEPROM 在此则非常适合,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器。

EEPROM 在 MCU 中的使用方式

以 STM32 系列单片机为例,EEPROM 的读写在 IIC 协议下进行。

字节写入的通讯过程如下:

  • 主机产生起始信号和 EEPROM 地址,并且读写方向为写方向(0)。
  • 主机发送要写入数据的地址,EEPROM 收到后会将其存入缓存中,同时发送应答信号。
  • 主机发送8位数据至 EEPROM ,EEPROM 将数据存入缓存后,开始往非易失区写入数据。注意,这个过程需要一定时间,根据官方手册可知一次写入过程的最大时间为 5ms,此时 EEPROM 不会响应主机任何的请求,相当于 EEPROM 从 I2C 总线断开了。
  • 由于 EEPROM 的写入时间比 STM32 的运行速度要慢得多,因此 STM32 会误以为没有收到应答信号。应答轮询(ACKNOWLEDGE POLLING) 前来解决这个问题:STM32 再次发送一个起始信号和 EEPROM 地址,当 EEPROM 完成一次写入周期后,它会发送应答信号至主机。
  • 最后,主机发送停止信号,一次通讯过程完成。

随机读操作和之前写操作很类似,不过有一个地方不同:在读取数据之前,STM32 需要将准备读取的数据的地址写入到 EEPROM 的缓存区。接下来 STM32 还要发送一次起始信号和设备地址,选择读方向(1)。

另外,由于是读取不是写入,EEPROM的一次读取周期比写入周期快得多,不需要像写入操作那样应答轮询。

而顺序读不受页的限制,你想读多少就多少。与页写类似,不再赘述。

参考

文章内容基本上都来自于网络,以下是部分参考:

  1. STM32学习笔记(9)——(I2C续)读写EEPROM
  2. https://zhuanlan.zhihu.com/p/102148747
  3. https://baike.baidu.com/item/EEPROM/1690980