STM32项目选择合适的EEPROM-AT24C实例(附原理图)

项目需求分析

在我的嵌入式项目中,需要实现数据存储功能,具体要求如下:

  • 容量需求:支持10小时运行数据存储

  • 存储频率:每2分钟存储一次

  • 存储参数

    • 缸温、机油温度

    • 机油压力报警状态

    • 故障日志

    • 转速(重复项,可能需区分不同转速)

    • 运行时间

    • 燃油油量

    • 电瓶电压

容量计算

首先计算所需的存储容量:

text

每次存储数据量估算:
- 缸温:2字节
- 机油温度:2字节  
- 机油压力报警:1字节
- 故障日志:4字节
- 转速:2字节
- 运行时间:4字节
- 燃油油量:2字节
- 电瓶电压:2字节
总计:约19字节/次

10小时总数据量:
10小时 × 60分钟 ÷ 2分钟/次 × 19字节/次 = 5,700字节

考虑到数据头和预留空间,选择8KB (64Kbit) 的EEPROM M24C64足够满足需求。

EEPROM基础知识

什么是EEPROM?

EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种电可擦除可编程只读存储器,具有以下特点:

优点:

  • 非易失性:断电后数据不丢失

  • 可重复擦写:通常可擦写100万次以上

  • 字节级擦写:可以单独修改某个字节

  • 低功耗:适合电池供电设备

  • 接口简单:通常使用I2C或SPI接口

缺点:

  • 容量相对较小

  • 写入速度较慢(毫秒级)

  • 成本比FLASH高

  • 有写入次数限制

芯片选型:M24C64-WMN6TP

根据项目需求,我选择了ST品牌的M24C64:

  • 容量:64Kbit (8KB)

  • 接口:I2C兼容,支持400kHz

  • 电压:1.7V-5.5V宽电压范围,兼容STM32F103C8T6的3.3V

  • 封装:SOIC-8,易于焊接和布局

  • 耐久性:400万次写循环

  • 数据保存:40年

引脚功能详解

引脚名称功能说明连接方式
1A0器件地址选择位0接地(GND)
2A1器件地址选择位1接地(GND)
3A2器件地址选择位2接地(GND)
4VSS接系统地
5SDA串行数据线接STM32 PB11,加上拉电阻
6SCL串行时钟线接STM32 PB10,加上拉电阻
7WP写保护接地(使能写入)
8VCC电源接3.3V

电路设计要点

1. I2C上拉电阻选择

问题:10kΩ vs 4.7kΩ,哪个更合适?

分析

  • 规格书建议使用10kΩ或更小的上拉电阻

  • 4.7kΩ提供更强的上拉能力,总线上升时间更快

  • 在400kHz高速模式下,4.7kΩ性能更优

  • 电流消耗差异很小,可忽略不计

结论:选择4.7kΩ上拉电阻,确保在高速通信时的可靠性。

2. 写保护引脚设计

WP引脚有三种连接方式:

c

// 方案1:直接接地(推荐用于本项目)
- 优点:始终可写入,电路简单
- 缺点:无硬件写保护

// 方案2:接VCC
- 优点:防止意外写入
- 缺点:需要修改硬件才能写入

// 方案3:接MCU GPIO(灵活控制)
- 优点:可软件控制写保护
- 缺点:占用一个GPIO引脚

根据实际需求,我选择直接接地,因为:

  • 项目需要频繁写入数据

  • 已有软件层面的数据校验机制

  • 简化硬件设计

3. 去耦电容设计

在VCC和GND之间添加:

  • 100nF陶瓷电容:滤除高频噪声

  • 10μF电解电容:提供电源稳定性

完整电路设计

原理图设计

sql

STM32F103C8T6          M24C64
PB10 (I2C2_SCL) -------- SCL (6)
PB11 (I2C2_SDA) -------- SDA (5)
3.3V      -------------- VCC (8)
GND       -------------- VSS (4)
GND       -------------- A0 (1)
GND       -------------- A1 (2) 
GND       -------------- A2 (3)
GND       -------------- WP (7)


PCB布局建议

  1. 去耦电容尽量靠近EEPROM的VCC引脚

  2. I2C走线尽量短,避免平行高速信号线

  3. 保持完整的地平面

软件驱动实现

初始化代码

c

#include "stm32f1xx_hal.h"

#define EEPROM_I2C hi2c2
#define EEPROM_ADDRESS 0xA0  // 1010 000 + A2A1A0(000)

extern I2C_HandleTypeDef hi2c2;

void EEPROM_Init(void)
{
    // I2C初始化在main中已完成
}

数据写入函数

c

HAL_StatusTypeDef EEPROM_Write(uint16_t memAddress, uint8_t *data, uint16_t size)
{
    uint8_t address[2] = { (memAddress >> 8) & 0xFF, memAddress & 0xFF };
    
    return HAL_I2C_Mem_Write(&EEPROM_I2C, EEPROM_ADDRESS, 
                            memAddress, I2C_MEMADD_SIZE_16BIT,
                            data, size, 1000);
}

数据存储策略

c

typedef struct {
    int16_t cylinder_temp;     // 缸温
    int16_t oil_temp;          // 机油温度
    uint8_t oil_pressure_alarm;// 机油压力报警
    uint32_t fault_log;        // 故障日志
    uint16_t rpm;              // 转速
    uint32_t run_time;         // 运行时间
    uint16_t fuel_level;       // 燃油油量
    uint16_t battery_voltage;  // 电瓶电压
} SystemData_t;

void SaveSystemData(void)
{
    static uint16_t current_address = 0;
    SystemData_t data;
    
    // 采集数据
    data.cylinder_temp = ReadCylinderTemp();
    data.oil_temp = ReadOilTemp();
    // ... 其他数据采集
    
    // 写入EEPROM
    if(EEPROM_Write(current_address, (uint8_t*)&data, sizeof(data)) == HAL_OK)
    {
        current_address += sizeof(data);
        // 地址回卷处理
        if(current_address >= 8192 - sizeof(data))
            current_address = 0;
    }
}

实际应用考虑

1. 数据冗余设计

  • 采用循环存储,避免单一区域过度磨损

  • 添加CRC校验,确保数据完整性

  • 重要参数双备份存储

2. 未来迭代考虑

  • 预留额外I2C地址引脚,便于多设备扩展

  • PCB布局考虑更大容量EEPROM的兼容性

  • 软件设计支持多种EEPROM型号

3. 生产测试

  • 添加测试点,便于生产测试

  • 设计自检程序,验证存储功能

  • 考虑固件升级接口

总结

通过详细的需求分析和器件选型,M24C64完全满足项目的存储需求。合理的电路设计和软件策略确保了系统的可靠性和可扩展性。这种设计方案不仅适用于当前项目,也为未来的功能扩展留下了充足的空间。

在实际应用中,建议定期检查EEPROM的写入次数,并在接近寿命极限时通过软件提示维护,确保系统长期稳定运行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值