guowenxue
4 days ago d42fb887237e30d5026e006a3774d6b0a215b829
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**********************************************************************
*   Copyright: (C)2024 LingYun IoT System Studio
*      Author: GuoWenxue<guowenxue@gmail.com>
* Description: I2C EEPROM device driver for ISKBoard
*
*   ChangeLog:
*        Version    Date       Author            Description
*        V1.0.0  2024.08.29    GuoWenxue      Release initial version
***********************************************************************/
#ifndef __EEPROM_H__
#define __EEPROM_H__
 
#include "i2c_bitbang.h"
 
#define EEPROM_INFO(_name, _cap, _page, _addr_bytes) \
        .name        = _name,       \
        .capacity    = _cap,        \
        .page_size   = _page,       \
        .addr_bytes  = _addr_bytes, \
        .n_pages     = (_cap)/(_page)
 
typedef struct eeprom_info
{
    const char     *name;         /* 芯片型号名称,如 "AT24C256" */
    uint32_t        capacity;     /* 总容量 (Bytes) */
    uint32_t        page_size;    /* 单页大小 (Bytes) */
    uint8_t         addr_bytes;   /* 片内寻址字节数:1 或 2 */
    uint32_t        n_pages;      /* 总页数 */
} eeprom_info_t;
 
/* 设备运行时上下文结构体 */
typedef struct eeprom_dev
{
    i2c_bus_t            *bus;       /* 绑定的 I2C 总线 */
    uint8_t               dev_addr;  /* 基础 I2C 从机地址 (通常为 0x50) */
    const eeprom_info_t  *info;      /* 指向匹配成功的规格信息,直接替代原 switch-case */
} eeprom_dev_t;
 
/* 导出 API */
 
/**
 * @brief  初始化 EEPROM 设备结构体对象
 * @note   该函数仅做内部参数映射与规格配置(如页大小、芯片容量)。
 * @param  eeprom:   指向 EEPROM 设备句柄的指针
 * @param  bus:      绑定的物理 I2C 总线对象指针
 * @param  dev_addr: EEPROM 的 7 位 I2C 从机基地址 (例如 AT24C256 常规为 0x50)
 * @param  chip_name: EEPROM 的芯片型号名称 (例如 "AT24C256")
 * @retval None
 */
int eeprom_init(eeprom_dev_t *eeprom, i2c_bus_t *bus, uint8_t dev_addr, const char *chip_name);
 
/**
 * @brief  从 EEPROM 的指定内部地址连续读取数据
 * @param  eeprom:   指向已初始化的 EEPROM 设备句柄的指针
 * @param  reg_addr: 芯片内部物理存储的 16 位起始地址 (0x0000 ~ 0x7FFF)
 * @param  buf:      存放接收数据的用户缓冲区指针
 * @param  len:      期望读取的数据字节数
 * @retval I2C_OK: 读取成功; I2C_ERROR: 总线或从机无应答; I2C_BUSY: 总线被占用
 */
i2c_status_t eeprom_read(eeprom_dev_t *eeprom, uint16_t reg_addr, uint8_t *buf, uint16_t len);
 
/**
 * @brief  向 EEPROM 的指定内部地址连续写入数据(含跨页切片处理)
 * @param  eeprom:   指向已初始化的 EEPROM 设备句柄的指针
 * @param  reg_addr: 芯片内部物理存储的 16 位起始地址 (0x0000 ~ 0x7FFF)
 * @param  buf:      存放待发送数据的源缓冲区指针
 * @param  len:      期望写入的数据字节数
 * @retval I2C_OK: 全部数据写入成功; I2C_ERROR: 期间发生物理通信故障
 */
i2c_status_t eeprom_write(eeprom_dev_t *eeprom, uint16_t reg_addr, uint8_t *buf, uint16_t len);
 
/**
 * @brief  EEPROM 测试函数
 * @param  bus: 绑定的物理 I2C 总线对象指针
 * @retval None
 */
int eeprom_test(i2c_bus_t *bus);
 
#endif /* __EEPROM_H__ */