新增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风格注释文档, 提高代码可读性和维护性。
75 lines
3.1 KiB
C++
75 lines
3.1 KiB
C++
/**
|
||
* @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 */
|