项目需求分析
在我的嵌入式项目中,需要实现数据存储功能,具体要求如下:
-
容量需求:支持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年
-


引脚功能详解
| 引脚 | 名称 | 功能说明 | 连接方式 |
|---|---|---|---|
| 1 | A0 | 器件地址选择位0 | 接地(GND) |
| 2 | A1 | 器件地址选择位1 | 接地(GND) |
| 3 | A2 | 器件地址选择位2 | 接地(GND) |
| 4 | VSS | 地 | 接系统地 |
| 5 | SDA | 串行数据线 | 接STM32 PB11,加上拉电阻 |
| 6 | SCL | 串行时钟线 | 接STM32 PB10,加上拉电阻 |
| 7 | WP | 写保护 | 接地(使能写入) |
| 8 | VCC | 电源 | 接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布局建议
-
去耦电容尽量靠近EEPROM的VCC引脚
-
I2C走线尽量短,避免平行高速信号线
-
保持完整的地平面
软件驱动实现
初始化代码
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的写入次数,并在接近寿命极限时通过软件提示维护,确保系统长期稳定运行。
1474

被折叠的 条评论
为什么被折叠?



