Files
DCU_APP/GD32E508_DCU_APP/comm/esc_eeprom.h
T
cbb 934836618a feat(spi): 添加ADC反馈命令处理
新增SPI命令类型0xC4用于ADC调试反馈,实现在GD32上采集
温度/VDDA/VIN等模拟量数据的反馈功能,并支持主动推送和被动查询模式。

feat(spi): 扩展PING命令响应格式

修改PING命令响应格式,增加APP身份信息16字节载荷,包含版本号、
启动时间、功能开关位图等信息,用于主机获取从设备详细状态。

refactor(can_feedback): 优化CAN反馈推送逻辑

改进CAN反馈推送机制,跳过编译期关闭的通道,只遍历启用的通道,
确保推送效率并避免无效操作。

feat(comm): 添加EXMC总线初始化和诊断功能

添加了EXMC总线的初始化功能,包括GPIO配置、NOR/SRAM区域参数设置,
以及总线探活机制。实现了总线可见性检测,当检测到全0或全1的挂死状态时
会返回false并输出错误信息。同时添加了printf日志输出用于调试。

refactor(esc_lan9252): 重构ESC初始化返回值

将EscLan9252::init()方法的返回类型从void改为bool,
使其能够返回EXMC总线准备状态,便于上层进行状态检查。

docs(app_spi_cmd_ping): 添加代码注释文档

为SPI命令处理相关类和方法添加详细的Doxygen风格注释文档,
提高代码可读性和维护性。
2026-07-20 02:36:56 +08:00

75 lines
3.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @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 */