1. 项目概述
在嵌入式系统开发中,EEPROM(电可擦可编程只读存储器)是一种常用的非易失性存储器件,用于保存系统配置参数、运行日志等关键数据。AT24C256作为一款32KB容量的I2C接口EEPROM,因其体积小、接口简单、可靠性高等特点,被广泛应用于各类STM32项目中。
本文将详细介绍如何使用STM32 HAL库驱动AT24C256,实现完整的读写功能。不同于简单的代码展示,我会结合多年嵌入式开发经验,深入解析I2C通信协议细节、EEPROM特性以及实际工程中的注意事项,帮助开发者避开常见陷阱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件设计与连接
2.1 器件选型与特性
AT24C256是Microchip公司生产的256Kbit(32KB)串行EEPROM,主要特性包括:
- 工作电压:1.7V至5.5V宽电压范围
- 接口标准:I2C兼容,支持标准模式(100kHz)和快速模式(400kHz)
- 页写模式:64字节页写缓冲区
- 写周期时间:5ms(典型值)
- 数据保存:100年
- 耐久性:100万次擦写周期
2.2 硬件连接详解
正确的硬件连接是驱动成功的基础。以下是STM32与AT24C256的典型连接方式:
| STM32引脚 | 24C256引脚 | 连接说明 | 注意事项 |
|---|---|---|---|
| PB6(SCL) | SCL | I2C时钟线 | 必须接4.7kΩ上拉电阻 |
| PB7(SDA) | SDA | I2C数据线 | 必须接4.7kΩ上拉电阻 |
| 3.3V | VCC | 电源正极 | 确保电压在器件工作范围内 |
| GND | GND | 电源地 | 确保共地 |
| - | A0/A1/A2 | 地址引脚 | 接地时器件地址为0xA0 |
重要提示:I2C总线必须使用上拉电阻,阻值通常在4.7kΩ-10kΩ之间,具体取决于总线电容和通信速率。过大的电阻会导致上升沿过缓,通信失败;过小的电阻会增加功耗。
2.3 地址配置原理
AT24C256支持通过A0/A1/A2引脚配置器件地址,允许同一I2C总线上挂载最多8个器件。地址字节格式如下:
code复制1 0 1 0 A2 A1 A0 R/W
其中:
- 前四位固定为1010
- A2/A1/A0对应硬件引脚电平(0=GND,1=VCC)
- R/W位决定读(1)或写(0)操作
例如:
- 所有地址引脚接地时:0xA0(写), 0xA1(读)
- A0接VCC时:0xA2(写), 0xA3(读)
3. 软件驱动实现
3.1 工程配置准备
在使用HAL库前,需通过STM32CubeMX完成以下配置:
- 启用I2C外设(通常为I2C1)
- 配置时钟速度为400kHz(快速模式)
- 设置SCL/SDA引脚模式为开漏输出
- 生成工程代码
实测经验:在STM32F1系列中,I2C时钟必须小于等于APB1时钟的1/4。若使用72MHz系统时钟,APB1通常为36MHz,因此最大I2C时钟为9MHz,但实际应用中400kHz已足够。
3.2 驱动头文件设计
24c256.h头文件定义了器件参数和函数接口:
c复制#ifndef __24C256_H
#define __24C256_H
#include "stm32f1xx_hal.h"
/* 器件参数定义 */
#define EEPROM_ADDR 0xA0 // 默认地址(A0/A1/A2接地)
#define EEPROM_PAGE_SIZE 64 // 页大小(字节)
#define EEPROM_TOTAL_SIZE 32768 // 总容量(字节)
#define EEPROM_WRITE_DELAY 5 // 写入等待时间(ms)
/* I2C句柄声明(需与硬件匹配) */
extern I2C_HandleTypeDef hi2c1;
/* 函数声明 */
HAL_StatusTypeDef EEPROM_Init(void);
HAL_StatusTypeDef EEPROM_WriteByte(uint16_t addr, uint8_t data);
HAL_StatusTypeDef EEPROM_ReadByte(uint16_t addr, uint8_t *data);
HAL_Statu
