需要自己实现读、写、延时这三个函数

This commit is contained in:
2026-02-27 15:51:32 +08:00
parent faeda84509
commit dbd7ec92ca
4 changed files with 264 additions and 2 deletions

59
module/Int_EEPROM24xx.c Normal file
View 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;
}