1. EEPROM基础概念:什么是EEPROM,EEPROM与Flash、RAM的区别,在制氧机中的应用场景

各位同学好,我是老张。今天咱们开始这门课的第一讲——EEPROM的基础概念。说实话,我做了十几年嵌入式开发,EEPROM这东西几乎每个项目都会用到,但真正把它吃透的人不多。你想想看,一个看似简单的存储芯片,为什么能在制氧机这种医疗设备里扮演关键角色?咱们今天就来聊聊这个。

1.1 什么是EEPROM?

EEPROM,全称是Electrically Erasable Programmable Read-Only Memory,中文叫“电可擦除可编程只读存储器”。名字挺长,但说白了就是:一种可以反复擦写、断电后数据不丢失的存储芯片

我习惯把它比作一个“电子记事本”。你可以在上面写东西(写入数据),也可以擦掉重写(擦除和编程),而且就算你把电源拔了,写上去的内容也不会消失(非易失性)。

EEPROM的典型特性包括:

  • 字节级擦写:可以单独修改一个字节,不需要整块擦除
  • 擦写次数有限:通常10万次到100万次,别指望无限写
  • 数据保持时间长:一般能保持10年以上
  • 读写速度较慢:比RAM慢得多,但够用

重要概念:EEPROM的“只读”是历史遗留的叫法。早期ROM确实只能读不能写,但EEPROM已经可以电擦写了。只是它不像RAM那样可以随意频繁写入,所以大家还是习惯叫它“只读存储器”。

1.2 EEPROM vs Flash vs RAM:它们到底有什么区别?

很多初学者容易把这三者搞混。我在带新人时经常说:记住三个关键词——速度、易失性、擦写方式。咱们直接看表格:

特性 EEPROM Flash RAM
断电后数据 保持(非易失) 保持(非易失) 丢失(易失)
擦写单位 字节 扇区/块(通常512字节以上) 字节(直接覆盖)
擦写次数 10万~100万次 1万~10万次 无限(理论)
读写速度 慢(ms级) 较快(us级读,ms级写) 极快(ns级)
典型容量 1Kb~512Kb 1Mb~64Gb 几KB~几十GB
成本(每bit) 中等
典型用途 参数存储、配置数据 程序代码、大容量数据 运行时变量、堆栈

为什么会这样?我简单解释一下:

  • RAM 就像你的工作台,东西放上去随手就能拿,但下班一关灯就全没了。
  • Flash 像一本笔记本,可以写很多内容,但想改其中一句话,得把整页撕掉重写。
  • EEPROM 像一张可擦写白板,想改哪个字就擦哪个字,但写起来比笔记本慢。

我在项目中遇到过一个问题:有同事用Flash来存设备的校准参数,结果每次修改一个参数都要先擦除整个扇区,再把所有参数重新写一遍。万一写的过程中断电了,整组参数全丢。后来换成EEPROM,字节级擦写,这个问题就解决了。

我的建议:如果你的数据量小(几KB以内),且需要频繁修改单个参数,用EEPROM。如果数据量大(比如存字库、固件),用Flash。如果只是运行时临时用,用RAM。

1.3 在制氧机中的应用场景

制氧机这种医疗设备,对数据可靠性的要求非常高。你想想看,如果病人正在吸氧,机器突然因为参数丢失而停机,那后果不堪设想。EEPROM在这里扮演了“黑匣子”的角色。

具体来说,制氧机里EEPROM主要存这几类数据:

  1. 设备参数:比如氧气浓度设定值、流量范围、报警阈值等。这些参数在出厂时校准好,用户不能随便改,但设备需要记住它们。
  2. 校准数据:每个传感器都有个体差异,比如氧浓度传感器、压力传感器。EEPROM里存着每个传感器的校准系数,保证测量精度。
  3. 运行日志:累计运行时间、故障记录、维护提醒。这些数据需要断电保存,方便售后排查问题。
  4. 用户偏好:比如上次设定的氧气流量、定时关机时间。虽然不关键,但用户体验很重要。

我记得有一次,某款制氧机在客户现场频繁报“传感器故障”。我们远程分析日志,发现是EEPROM里某个校准参数被意外改写了。后来查出来是代码里有个指针越界,写到了EEPROM的地址空间。从那以后,我要求所有项目必须做EEPROM的写保护校验。

注意:制氧机属于医疗设备,EEPROM中存储的参数直接关系到患者安全。设计时必须考虑:

  • 写操作要有校验机制(CRC或校验和)
  • 关键参数要有备份(至少存两份)
  • 掉电时要保证数据完整性(后面章节会详细讲)

1.4 一个简单的EEPROM读写示例

咱们用I2C接口的EEPROM(比如AT24C02)举个例子。这是最常用的型号,容量256字节,够存制氧机的基本参数了。

// 伪代码示例:向EEPROM写入一个字节
void EEPROM_WriteByte(uint16_t addr, uint8_t data) {
    I2C_Start();                    // 发送起始信号
    I2C_SendByte(0xA0);             // 设备地址+写操作
    I2C_WaitAck();                  // 等待应答
    I2C_SendByte(addr >> 8);       // 高字节地址
    I2C_WaitAck();
    I2C_SendByte(addr & 0xFF);     // 低字节地址
    I2C_WaitAck();
    I2C_SendByte(data);             // 发送数据
    I2C_WaitAck();
    I2C_Stop();                     // 发送停止信号
    delay_ms(5);                    // 等待写入完成(关键!)
}

// 从EEPROM读取一个字节
uint8_t EEPROM_ReadByte(uint16_t addr) {
    uint8_t data;
    I2C_Start();
    I2C_SendByte(0xA0);             // 设备地址+写操作(伪写入)
    I2C_WaitAck();
    I2C_SendByte(addr >> 8);
    I2C_WaitAck();
    I2C_SendByte(addr & 0xFF);
    I2C_WaitAck();
    I2C_Start();                    // 重新发送起始信号
    I2C_SendByte(0xA1);             // 设备地址+读操作
    I2C_WaitAck();
    data = I2C_ReadByte();          // 读取数据
    I2C_SendNack();                 // 发送非应答
    I2C_Stop();
    return data;
}

嗯,这里要注意:写EEPROM之后一定要加延时。AT24C02的写入时间典型值是5ms,有些型号更长。我见过有人不加延时,连续写两个字节,结果第二个字节没写进去,查了半天。

1.5 小结

这一章咱们讲了EEPROM是什么、和Flash/RAM的区别、以及在制氧机里的典型应用。说白了,EEPROM就是那个“默默记住一切”的小芯片。它不快、不大、也不便宜,但胜在可靠、灵活、掉电不丢数据。

下一章,我会详细讲EEPROM的硬件接口设计,包括I2C和SPI两种主流方式,以及我在实际项目中踩过的坑。咱们到时候见。

一句话总结:EEPROM是嵌入式系统中“参数存储”的黄金标准,尤其在医疗设备这种对可靠性要求极高的场景,它几乎是不可替代的。