更新README:补充适用范围与移植说明
This commit is contained in:
116
README.md
116
README.md
@@ -1,32 +1,69 @@
|
||||
# Driver_M24Cxx(可移植 EEPROM 驱动)
|
||||
# EEPROM24xx 通用驱动模块说明
|
||||
|
||||
这是一个面向 M24Cxx / AT24Cxx 系列 EEPROM 的可移植驱动模块。
|
||||
本 README 对当前 EEPROM 模块代码做统一说明,包含:适用范围、文件职责、移植步骤。
|
||||
|
||||
核心特性:
|
||||
## 1. 适用范围
|
||||
|
||||
- 不依赖特定 MCU/SDK(不绑定 STM32 HAL)
|
||||
- 支持页写自动拆分
|
||||
- 用户传入 I2C 读、I2C 写、毫秒延时三个函数后即可直接使用
|
||||
该模块适用于 I2C 接口的 24xx 系列 EEPROM(如 M24Cxx / AT24Cxx),并支持:
|
||||
|
||||
## 目录结构
|
||||
- 1 字节或 2 字节存储地址(`mem_addr_size = 1/2`)
|
||||
- 页写自动拆分(避免跨页写导致写入异常)
|
||||
- 平台无关移植(通过用户传入读/写/延时函数)
|
||||
|
||||
- `module/Int_EEPROM24xx.h`:驱动接口
|
||||
- `module/Int_EEPROM24xx.c`:驱动实现
|
||||
- `examples/adapter_template.c`:移植模板
|
||||
不适用于:
|
||||
|
||||
## 使用步骤
|
||||
- 非 I2C EEPROM
|
||||
- 需要 DMA/异步回调流程的复杂驱动(本模块为同步阻塞接口)
|
||||
|
||||
1. 将 `module/Int_EEPROM24xx.h/.c` 加入你的工程。
|
||||
2. 在你的平台实现三个函数:
|
||||
- `your_i2c_read(...)`
|
||||
- `your_i2c_write(...)`
|
||||
- `your_delay_ms(...)`
|
||||
3. 调用 `Int_EEPROM24xx_Init(...)` 完成初始化。
|
||||
4. 直接调用 `Int_EEPROM24xx_Read/Write` 进行访问。
|
||||
## 2. 文件说明
|
||||
|
||||
## 示例
|
||||
### `interface/Int_EEPROM24xx.h`
|
||||
|
||||
对外头文件,定义:
|
||||
|
||||
- 返回码:
|
||||
- `INT_EEPROM_OK`
|
||||
- `INT_EEPROM_ERR_ARG`
|
||||
- `INT_EEPROM_ERR_IO`
|
||||
- 用户需提供的函数指针类型:
|
||||
- `IntEEPROM_I2CRead_t`
|
||||
- `IntEEPROM_I2CWrite_t`
|
||||
- `IntEEPROM_DelayMs_t`
|
||||
- 配置结构体 `IntEEPROM24xx_Config_t`
|
||||
- 对外 API:
|
||||
- `Int_EEPROM24xx_Init()`
|
||||
- `Int_EEPROM24xx_Read()`
|
||||
- `Int_EEPROM24xx_Write()`
|
||||
|
||||
### `interface/Int_EEPROM24xx.c`
|
||||
|
||||
核心实现文件,主要逻辑:
|
||||
|
||||
- `Init`:校验参数、保存配置和用户回调
|
||||
- `Read`:参数检查后调用用户读函数
|
||||
- `Write`:按页拆分写入 + 每页写后延时(写周期等待)
|
||||
|
||||
## 3. API 使用流程
|
||||
|
||||
```c
|
||||
// 1) 实现底层 3 个函数
|
||||
static IntEEPROM_Result_t my_i2c_read(uint16_t dev_addr,
|
||||
uint32_t mem_addr,
|
||||
uint8_t mem_addr_size,
|
||||
uint8_t *buf,
|
||||
uint16_t len,
|
||||
uint32_t timeout_ms);
|
||||
|
||||
static IntEEPROM_Result_t my_i2c_write(uint16_t dev_addr,
|
||||
uint32_t mem_addr,
|
||||
uint8_t mem_addr_size,
|
||||
const uint8_t *buf,
|
||||
uint16_t len,
|
||||
uint32_t timeout_ms);
|
||||
|
||||
static void my_delay_ms(uint32_t ms);
|
||||
|
||||
// 2) 填写配置并初始化
|
||||
IntEEPROM24xx_Config_t cfg = {
|
||||
.dev_addr = (0x50u << 1),
|
||||
.page_size = 8u,
|
||||
@@ -35,22 +72,41 @@ IntEEPROM24xx_Config_t cfg = {
|
||||
.timeout_ms = 100u,
|
||||
};
|
||||
|
||||
Int_EEPROM24xx_Init(&cfg, your_i2c_read, your_i2c_write, your_delay_ms);
|
||||
Int_EEPROM24xx_Init(&cfg, my_i2c_read, my_i2c_write, my_delay_ms);
|
||||
|
||||
// 3) 读写
|
||||
Int_EEPROM24xx_Write(0x00, tx_buf, tx_len);
|
||||
Int_EEPROM24xx_Read(0x00, rx_buf, rx_len);
|
||||
```
|
||||
|
||||
## 参数说明
|
||||
## 4. 如何移植到新 MCU
|
||||
|
||||
- `dev_addr`:设备地址(7bit 或左移后地址,取决于底层驱动规范)
|
||||
- `page_size`:页大小(必须与芯片手册一致)
|
||||
- `mem_addr_size`:地址字节数(1 或 2)
|
||||
- `write_cycle_ms`:每次页写后的写周期等待
|
||||
- `timeout_ms`:底层总线访问超时
|
||||
只需要做 4 步:
|
||||
|
||||
## 注意事项
|
||||
1. 拷贝 `Int_EEPROM24xx.h/.c` 到你的工程。
|
||||
2. 用目标平台 SDK 实现 3 个函数(读、写、毫秒延时)。
|
||||
3. 按芯片手册填写配置参数:
|
||||
- `dev_addr`
|
||||
- `page_size`
|
||||
- `mem_addr_size`
|
||||
- `write_cycle_ms`
|
||||
4. 调用 `Int_EEPROM24xx_Init` 一次后,即可直接调用读写函数。
|
||||
|
||||
- 驱动内部会自动按页拆分写入,避免跨页写异常。
|
||||
- 若你的器件使用 2 字节地址,请设置 `mem_addr_size = 2`。
|
||||
- 若写后立即读失败,请适当增大 `write_cycle_ms`。
|
||||
## 5. 关键参数建议
|
||||
|
||||
- `page_size`:必须与 EEPROM 手册一致。
|
||||
- `mem_addr_size`:
|
||||
- 小容量常见 1
|
||||
- 大容量常见 2
|
||||
- `write_cycle_ms`:建议按 datasheet,通常 5~10ms。
|
||||
- `dev_addr`:根据你的 I2C 驱动要求使用 7bit 地址或左移地址。
|
||||
|
||||
## 6. 常见问题排查
|
||||
|
||||
- 写后读不一致:优先检查 `write_cycle_ms` 是否太小。
|
||||
- 连续写入中间数据错位:优先检查 `page_size` 是否配置错误。
|
||||
- 初始化失败:检查回调函数是否传空、`mem_addr_size` 是否为 1/2。
|
||||
|
||||
## 7. 当前工程中的使用点
|
||||
|
||||
本项目在 `interface/W5500/Int_NetCfg.c` 中调用该模块,用于网络参数 EEPROM 持久化。
|
||||
|
||||
Reference in New Issue
Block a user