Files
DCU_APP/GD32E508_DCU_APP/comm/esc_eeprom.h
T

75 lines
3.1 KiB
C++
Raw Normal View History

2026-07-20 02:36:56 +08:00
/**
* @file esc_eeprom.h
* @brief 通过 LAN9252 HBI Indexed 间接访问烧录外部 AT24C32 EEPROM (ESI)。
*
* 硬件前提(必须满足,否则模块不可用):
* - LAN9252 A2 (Pin 29) 必须接到 GD32 EXMC A17 (PD12),以访问 HBI_DATA_0 寄存器。
* 注意:LAN9252 引脚顺序为 Pin25=A1, Pin26=A3, Pin27=A4, Pin28=CS, Pin29=A2。
* A2 是区分 IDX/DATA 寄存器的关键位(A2=0→IDX, A2=1→DATA),不接 A2 无法访问 DATA 寄存器。
* - A3/A4 可不接(仅访问 HBI_IDX_0/DATA_0 时不需要)。
* - LAN9252 处于 16-bit HBI Indexed Mode(CHIP_MODE 配置)。
*
* ESC EEPROM 寄存器映射(参见 LAN9252 DS00001909A 12.14.47~12.14.51):
* 0x0500 EEPROM Configuration (8-bit)
* 0x0501 EEPROM PDI Access State (8-bit)
* 0x0502 EEPROM Control/Status (16-bit)
* 0x0504 EEPROM Address (32-bit)
* 0x0508 EEPROM Data (32-bit, 低 16 位为读写数据)
*
* 调用约束:INIT-ONLY,仅允许在 EthercatSync::init() 使能 EXTI NVIC 之前调用。
*/
#ifndef COMM_ESC_EEPROM_H
#define COMM_ESC_EEPROM_H
#include <cstdint>
#include <cstddef>
class EscEeprom {
public:
/** @brief 初始化:获取 PDI 对 EEPROM 接口的控制权并验证总线。
* @return true 表示成功获取 EEPROM 控制权。 */
static bool init();
/** @brief 读取 EEPROM 一个 16-bit word。
* @param word_addr word 地址(0 ~ 2047,对应 AT24C32 的 4KB 空间)。
* @param out 输出读取到的 16-bit 数据。
* @return true 表示读取成功。 */
static bool readWord(uint16_t word_addr, uint16_t &out);
/** @brief 写入 EEPROM 一个 16-bit word。
* @param word_addr word 地址。
* @param data 要写入的 16-bit 数据。
* @return true 表示写入成功。 */
static bool writeWord(uint16_t word_addr, uint16_t data);
/** @brief 批量烧录 ESI 数据。
* @param data 数据缓冲区(按 byte 流给出,内部按 word 对齐处理)。
* @param len 数据长度(字节,应为 2 的倍数;奇数时末尾补 0xFF)。
* @return true 表示全部写入成功。 */
static bool writeEsi(const uint8_t *data, size_t len);
/** @brief 回读校验 ESI 数据。
* @param data 期望数据缓冲区。
* @param len 校验长度(字节)。
* @return true 表示回读数据与期望一致。 */
static bool verifyEsi(const uint8_t *data, size_t len);
/** @brief 触发 EEPROM 重新加载(写完 ESI 后调用,使 LAN9252 重新读取配置)。
* @return true 表示 Reload 命令已发出。 */
static bool reload();
/** @brief 查询 EEPROM 加载状态。
* @return true 表示 EEPROM 已加载且设备信息正常。 */
static bool isLoaded();
/** @brief AT24C32 容量(字节)。 */
static constexpr size_t EEPROM_SIZE_BYTES = 4096U;
/** @brief AT24C32 word 数。 */
static constexpr uint16_t EEPROM_WORD_COUNT = 2048U;
private:
static bool s_inited;
};
#endif /* COMM_ESC_EEPROM_H */