EEPROM 与铁电存储器:字节擦写与非易失性的博弈
说到非易失性存储,大家第一反应肯定是 Flash。但在我做嵌入式系统的这些年里,有两个“小众”选手其实非常值得关注——EEPROM 和 FRAM。它们各有各的脾气,用好了是神器,用不好就是坑。
EEPROM 的好处是能按字节擦写,不像 Flash 那样必须整页擦除。但代价呢?慢。FRAM 呢?它既非易失,又能像 SRAM 一样快写。听起来很完美?嗯,凡事都有代价。
EEPROM 的字节擦写特性
EEPROM 的全称是 Electrically Erasable Programmable Read-Only Memory。名字很长,但核心就一句话:可以按字节擦除和编程。
我刚开始用 EEPROM 时,总觉得它跟 Flash 差不多。后来踩了坑才明白——EEPROM 的擦写次数只有 10 万次左右,而且写一个字节要花 5~10 毫秒。你想想看,如果你在循环里频繁写 EEPROM,系统很快就废了。
EEPROM 关键参数速查
- 擦写粒度:字节(不是页)
- 典型擦写时间:5~10 ms/字节
- 擦写寿命:约 10 万次
- 数据保持:约 100 年(25°C)
- 读速度:接近随机访问(ns 级)
EEPROM 的写入过程其实挺有意思。它内部有一个电荷泵,把电压升到 12~15V,然后通过隧穿效应把电子注入浮栅。这个过程很慢,因为电荷泵的驱动能力有限。我曾在项目中用 EEPROM 存系统配置参数,每次上电读一次,掉电前写一次。这样用,10 万次寿命够用几十年。
但如果你用它做数据采集日志……那就不太妙了。我曾经见过一个同事,每秒写一次 EEPROM,结果设备运行不到三天就挂了。嗯,这就是没算寿命账的后果。
FRAM 的非易失性与高速写入
FRAM(铁电存储器)是我个人非常喜欢的一种存储技术。它利用铁电晶体的极化方向来存储数据,而不是电荷。这意味着什么呢?
- 写入速度极快:写一个字节只需要几十纳秒,跟 SRAM 差不多
- 几乎无限寿命:10^12 次擦写,也就是 1 万亿次
- 非易失性:掉电不丢数据
- 低功耗:写入功耗远低于 EEPROM 和 Flash
我记得第一次用 FRAM 时,简直不敢相信它的写入速度。我写了一个循环,连续写 100 万个字节,结果瞬间完成。换成 EEPROM,同样的操作要等好几个小时。
我的经验:FRAM 特别适合做数据采集、黑匣子记录、实时参数存储这类场景。比如工业现场的故障记录,要求掉电前把最后一批数据存下来。FRAM 不需要等待擦除,直接写就行,时间窗口完全够用。
但 FRAM 也不是没有缺点。它的容量通常比较小,主流产品在 64Kb 到 4Mb 之间。而且价格比 EEPROM 贵不少。另外,FRAM 的读操作是破坏性的——读一次就会改变极化状态,所以读完后必须立即回写。不过这个回写由芯片内部自动完成,用户不需要操心。
EEPROM vs FRAM:怎么选?
我整理了一个对比表,方便你快速决策:
| 特性 | EEPROM | FRAM |
|---|---|---|
| 写入速度 | 5~10 ms/字节 | ~50 ns/字节 |
| 擦写寿命 | 10 万次 | 10^12 次 |
| 写入功耗 | 较高(电荷泵) | 极低 |
| 容量范围 | 1Kb ~ 1Mb | 64Kb ~ 4Mb |
| 成本 | 低 | 较高 |
| 典型应用 | 配置参数、校准数据 | 数据采集、实时记录 |
选型时我一般这么判断:如果数据写入频率很低(比如一天几次),用 EEPROM 完全够。如果写入频繁(比如每秒几十次),或者要求掉电瞬间保存数据,那就上 FRAM。
读写时序实战:别让时序坑了你
不管是 EEPROM 还是 FRAM,读写时序都是必须搞清楚的。我见过太多人因为时序没配好,导致数据读出来全是 0xFF。
EEPROM 的典型 I²C 写入时序是这样的:
// EEPROM 页写入示例(I²C)
// 假设地址 0x50,写入 8 个字节到偏移 0x00
START
发送 0xA0 // 器件地址 + 写
等待 ACK
发送 0x00 // 高字节地址
等待 ACK
发送 0x00 // 低字节地址
等待 ACK
发送 data[0] // 第一个数据字节
等待 ACK
...
发送 data[7] // 第八个数据字节
等待 ACK
STOP
// 关键:必须等待内部擦写完成(约 5ms)
// 可以用 ACK 轮询或延时
while(1) {
START
发送 0xA0
if (收到 ACK) break; // 器件就绪
STOP
delay(1);
}
FRAM 的时序就简单多了。它不需要等待内部擦写,写完立即可以读。但要注意:FRAM 的读操作会破坏数据,虽然芯片内部自动回写,但连续读同一个地址时,建议加一点间隔。
我曾经踩过的坑:在 FRAM 上做连续读测试时,发现读出来的数据偶尔会出错。后来查手册才发现,FRAM 的读周期最小需要 150ns。我用的 SPI 时钟太快了,导致回写来不及完成。把 SPI 时钟降到 10MHz 以下就解决了。
知识结构图:EEPROM 与 FRAM 的核心差异
下面这张图帮你理清两者的技术路线和适用场景:
避坑指南:我踩过的那些坑
最后分享几个实战中容易忽略的点:
- EEPROM 写保护:很多 EEPROM 有写保护引脚,不拉对就写不进去。我调试时经常忘了检查这个。
- FRAM 的读回写延迟:虽然芯片自动回写,但连续读同一个地址时,建议加 100ns 以上的间隔。
- EEPROM 的页边界:页写入不能跨页,否则数据会乱。我习惯在写入前先检查地址是否跨页。
- FRAM 的 SPI 模式:FRAM 通常支持 Mode 0 和 Mode 3,但有些型号只支持一种。手册一定要看仔细。
嗯,EEPROM 和 FRAM 就聊到这儿。这两种存储器各有各的脾气,选对了事半功倍,选错了……那就等着改板吧。