重构为初始化传入读写延时函数的接口

This commit is contained in:
2026-02-27 16:31:10 +08:00
parent 44399a1e5d
commit 47f95b9caa
4 changed files with 114 additions and 120 deletions

View File

@@ -1,18 +1,47 @@
#include "Int_EEPROM24xx.h"
/* 直接透传到用户提供的总线读回调。 */
IntEEPROM_Result_t Int_EEPROM24xx_Read(const IntEEPROM24xx_t *dev, uint32_t mem_addr, uint8_t *buf, uint16_t len)
static IntEEPROM24xx_Config_t g_cfg;
static IntEEPROM_I2CRead_t g_read_fn;
static IntEEPROM_I2CWrite_t g_write_fn;
static IntEEPROM_DelayMs_t g_delay_fn;
static uint8_t g_inited;
IntEEPROM_Result_t Int_EEPROM24xx_Init(const IntEEPROM24xx_Config_t *cfg,
IntEEPROM_I2CRead_t read_fn,
IntEEPROM_I2CWrite_t write_fn,
IntEEPROM_DelayMs_t delay_fn)
{
if (dev == NULL || buf == NULL || len == 0u || dev->bus_read == NULL)
if (cfg == NULL || read_fn == 0 || write_fn == 0)
{
return INT_EEPROM_ERR_ARG;
}
return dev->bus_read(dev->ctx, dev->dev_addr, mem_addr, dev->mem_addr_size, buf, len, dev->timeout_ms);
if (cfg->page_size == 0u || (cfg->mem_addr_size != 1u && cfg->mem_addr_size != 2u))
{
return INT_EEPROM_ERR_ARG;
}
g_cfg = *cfg;
g_read_fn = read_fn;
g_write_fn = write_fn;
g_delay_fn = delay_fn;
g_inited = 1u;
return INT_EEPROM_OK;
}
/* 直接透传到用户提供的总线读回调。 */
IntEEPROM_Result_t Int_EEPROM24xx_Read(uint32_t mem_addr, uint8_t *buf, uint16_t len)
{
if (g_inited == 0u || buf == 0 || len == 0u)
{
return INT_EEPROM_ERR_ARG;
}
return g_read_fn(g_cfg.dev_addr, mem_addr, g_cfg.mem_addr_size, buf, len, g_cfg.timeout_ms);
}
/* 按页拆分写入,避免跨页写导致 EEPROM 数据回卷或写失败。 */
IntEEPROM_Result_t Int_EEPROM24xx_Write(const IntEEPROM24xx_t *dev, uint32_t mem_addr, const uint8_t *buf, uint16_t len)
IntEEPROM_Result_t Int_EEPROM24xx_Write(uint32_t mem_addr, const uint8_t *buf, uint16_t len)
{
uint16_t written = 0;
uint16_t chunk;
@@ -21,7 +50,7 @@ IntEEPROM_Result_t Int_EEPROM24xx_Write(const IntEEPROM24xx_t *dev, uint32_t mem
uint16_t room;
IntEEPROM_Result_t st;
if (dev == NULL || buf == NULL || len == 0u || dev->page_size == 0u || dev->bus_write == NULL)
if (g_inited == 0u || buf == 0 || len == 0u)
{
return INT_EEPROM_ERR_ARG;
}
@@ -30,27 +59,26 @@ IntEEPROM_Result_t Int_EEPROM24xx_Write(const IntEEPROM24xx_t *dev, uint32_t mem
{
/* 计算当前页内偏移和本次最多可写长度。 */
cur_addr = mem_addr + written;
page_off = (uint16_t)(cur_addr % dev->page_size);
room = (uint16_t)(dev->page_size - page_off);
page_off = (uint16_t)(cur_addr % g_cfg.page_size);
room = (uint16_t)(g_cfg.page_size - page_off);
chunk = (uint16_t)(((len - written) < room) ? (len - written) : room);
/* 实际总线写由平台适配层完成。 */
st = dev->bus_write(dev->ctx,
dev->dev_addr,
cur_addr,
dev->mem_addr_size,
(const uint8_t *)(buf + written),
chunk,
dev->timeout_ms);
st = g_write_fn(g_cfg.dev_addr,
cur_addr,
g_cfg.mem_addr_size,
(const uint8_t *)(buf + written),
chunk,
g_cfg.timeout_ms);
if (st != INT_EEPROM_OK)
{
return st;
}
if (dev->delay_ms != NULL && dev->write_cycle_ms > 0u)
if (g_delay_fn != 0 && g_cfg.write_cycle_ms > 0u)
{
/* EEPROM 页写后通常需要写周期时间。 */
dev->delay_ms(dev->ctx, dev->write_cycle_ms);
g_delay_fn(g_cfg.write_cycle_ms);
}
written = (uint16_t)(written + chunk);
}

View File

@@ -2,7 +2,6 @@
#define INT_EEPROM24XX_H
#include <stdint.h>
#include <stddef.h>
typedef int32_t IntEEPROM_Result_t;
@@ -10,51 +9,38 @@ typedef int32_t IntEEPROM_Result_t;
#define INT_EEPROM_ERR_ARG -1
#define INT_EEPROM_ERR_IO -2
/* 底层总线读回调:
* ctx : 用户上下文(可传 I2C 句柄、驱动实例等)
* dev_addr : 器件地址(格式由你的平台驱动决定)
* mem_addr : EEPROM 内存地址
* mem_addr_size : 地址字节数1 或 2
* timeout_ms : 访问超时(毫秒)
*/
typedef IntEEPROM_Result_t (*IntEEPROM_BusRead_t)(void *ctx,
uint16_t dev_addr,
uint32_t mem_addr,
uint8_t mem_addr_size,
uint8_t *buf,
uint16_t len,
uint32_t timeout_ms);
/* 底层总线写回调,参数含义同读回调 */
typedef IntEEPROM_Result_t (*IntEEPROM_BusWrite_t)(void *ctx,
uint16_t dev_addr,
typedef IntEEPROM_Result_t (*IntEEPROM_I2CRead_t)(uint16_t dev_addr,
uint32_t mem_addr,
uint8_t mem_addr_size,
const uint8_t *buf,
uint8_t *buf,
uint16_t len,
uint32_t timeout_ms);
typedef void (*IntEEPROM_DelayMs_t)(void *ctx, uint32_t delay_ms);
typedef IntEEPROM_Result_t (*IntEEPROM_I2CWrite_t)(uint16_t dev_addr,
uint32_t mem_addr,
uint8_t mem_addr_size,
const uint8_t *buf,
uint16_t len,
uint32_t timeout_ms);
typedef void (*IntEEPROM_DelayMs_t)(uint32_t delay_ms);
typedef struct
{
void *ctx; /* 用户上下文 */
uint16_t dev_addr; /* 器件地址 */
uint16_t page_size; /* 页大小(字节) */
uint8_t mem_addr_size; /* 地址字节数1 或 2 */
uint32_t write_cycle_ms; /* 每次页写后等待时间ms */
uint32_t timeout_ms; /* 总线访问超时ms */
IntEEPROM_BusRead_t bus_read;
IntEEPROM_BusWrite_t bus_write;
IntEEPROM_DelayMs_t delay_ms;
} IntEEPROM24xx_t;
uint16_t dev_addr;
uint16_t page_size;
uint8_t mem_addr_size; /* 1 or 2 */
uint32_t write_cycle_ms;
uint32_t timeout_ms;
} IntEEPROM24xx_Config_t;
/* 读取 EEPROM。
* 返回 INT_EEPROM_OK 表示成功。
*/
IntEEPROM_Result_t Int_EEPROM24xx_Read(const IntEEPROM24xx_t *dev, uint32_t mem_addr, uint8_t *buf, uint16_t len);
/* 初始化模块:用户传入 I2C 读、写和毫秒延时函数后,即可直接调用读写 API。 */
IntEEPROM_Result_t Int_EEPROM24xx_Init(const IntEEPROM24xx_Config_t *cfg,
IntEEPROM_I2CRead_t read_fn,
IntEEPROM_I2CWrite_t write_fn,
IntEEPROM_DelayMs_t delay_fn);
/* 写入 EEPROM内部会自动按页拆分写入。 */
IntEEPROM_Result_t Int_EEPROM24xx_Write(const IntEEPROM24xx_t *dev, uint32_t mem_addr, const uint8_t *buf, uint16_t len);
IntEEPROM_Result_t Int_EEPROM24xx_Read(uint32_t mem_addr, uint8_t *buf, uint16_t len);
IntEEPROM_Result_t Int_EEPROM24xx_Write(uint32_t mem_addr, const uint8_t *buf, uint16_t len);
#endif