需要自己实现读、写、延时这三个函数
This commit is contained in:
59
module/Int_EEPROM24xx.c
Normal file
59
module/Int_EEPROM24xx.c
Normal file
@@ -0,0 +1,59 @@
|
||||
#include "Int_EEPROM24xx.h"
|
||||
|
||||
/* 直接透传到用户提供的总线读回调。 */
|
||||
IntEEPROM_Result_t Int_EEPROM24xx_Read(const IntEEPROM24xx_t *dev, uint32_t mem_addr, uint8_t *buf, uint16_t len)
|
||||
{
|
||||
if (dev == NULL || buf == NULL || len == 0u || dev->bus_read == NULL)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
/* 按页拆分写入,避免跨页写导致 EEPROM 数据回卷或写失败。 */
|
||||
IntEEPROM_Result_t Int_EEPROM24xx_Write(const IntEEPROM24xx_t *dev, uint32_t mem_addr, const uint8_t *buf, uint16_t len)
|
||||
{
|
||||
uint16_t written = 0;
|
||||
uint16_t chunk;
|
||||
uint32_t cur_addr;
|
||||
uint16_t page_off;
|
||||
uint16_t room;
|
||||
IntEEPROM_Result_t st;
|
||||
|
||||
if (dev == NULL || buf == NULL || len == 0u || dev->page_size == 0u || dev->bus_write == NULL)
|
||||
{
|
||||
return INT_EEPROM_ERR_ARG;
|
||||
}
|
||||
|
||||
while (written < len)
|
||||
{
|
||||
/* 计算当前页内偏移和本次最多可写长度。 */
|
||||
cur_addr = mem_addr + written;
|
||||
page_off = (uint16_t)(cur_addr % dev->page_size);
|
||||
room = (uint16_t)(dev->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);
|
||||
if (st != INT_EEPROM_OK)
|
||||
{
|
||||
return st;
|
||||
}
|
||||
|
||||
if (dev->delay_ms != NULL && dev->write_cycle_ms > 0u)
|
||||
{
|
||||
/* EEPROM 页写后通常需要写周期时间。 */
|
||||
dev->delay_ms(dev->ctx, dev->write_cycle_ms);
|
||||
}
|
||||
written = (uint16_t)(written + chunk);
|
||||
}
|
||||
|
||||
return INT_EEPROM_OK;
|
||||
}
|
||||
60
module/Int_EEPROM24xx.h
Normal file
60
module/Int_EEPROM24xx.h
Normal file
@@ -0,0 +1,60 @@
|
||||
#ifndef INT_EEPROM24XX_H
|
||||
#define INT_EEPROM24XX_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
typedef int32_t IntEEPROM_Result_t;
|
||||
|
||||
#define INT_EEPROM_OK 0
|
||||
#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,
|
||||
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)(void *ctx, 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;
|
||||
|
||||
/* 读取 EEPROM。
|
||||
* 返回 INT_EEPROM_OK 表示成功。
|
||||
*/
|
||||
IntEEPROM_Result_t Int_EEPROM24xx_Read(const IntEEPROM24xx_t *dev, uint32_t mem_addr, uint8_t *buf, uint16_t len);
|
||||
|
||||
/* 写入 EEPROM(内部会自动按页拆分写入)。 */
|
||||
IntEEPROM_Result_t Int_EEPROM24xx_Write(const IntEEPROM24xx_t *dev, uint32_t mem_addr, const uint8_t *buf, uint16_t len);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user