feat(can): 反馈报文刷新率逐帧可配置并持久化

STATUS/CONFIG 反馈帧各自独立按 period_ms(1ms 节拍分频,0=停发)发送,
默认 STATUS 1kHz、CONFIG 250Hz,可运行时修改:

- 0x0400 扩展格式(DLC=4):[选择器 u16][值 u16],选择器 0x0000=节点 ID
  (仅单播),0x0100/0x0101=对应帧刷新周期;回 5B ACK,广播只应用不应答
- 0x0401 扩展格式(DLC=2):查询选择器对应值,回 [sel][val](4B);
  DLC<=1 及 SET DLC 1~2 保持旧格式行为完全不变
- 刷新率经 FlashEEPROM 独立 u16 记录(虚拟地址 0x08/0x09)持久化,
  不并入 6 参数 CRC 组,避免老设备升级后整组参数回退默认值
- save_system_config 追加从 RAM 副本回写两条记录,页满 format()
  重建后配置不丢失;read() 增加保留字节校验防 CRC 头部字误匹配
- CANFD_all_Send 拆分为 send_status_frame/send_config_frame,
  初始化失败上报路径直调 STATUS 帧不受分频影响

GATE_DRIVER_DRV8323 0/1 两种板型均编译通过
This commit is contained in:
cbb
2026-09-12 19:00:06 +08:00
parent 0d3bd9cbc6
commit 40fea328b0
6 changed files with 283 additions and 49 deletions
+38 -10
View File
@@ -214,6 +214,13 @@ class CAN_transmiter {
u8 transmit_mailbox = CAN_NOMAILBOX; // 初始化为无 mailbox 状态
u8 transmit_data[64]; // CANFD 最大 64 字节
// 周期反馈帧独立刷新率(ms,0=停发)与 1ms 节拍分频计数器。
// init() 从 flashEEP 的 RAM 副本加载,SET 命令(0x0400 扩展格式)运行时修改
u16 status_period_ms = CANFD_TX_PERIOD_STATUS_DEFAULT_MS;
u16 status_period_counter = 0;
u16 config_period_ms = CANFD_TX_PERIOD_CONFIG_DEFAULT_MS;
u16 config_period_counter = 0;
// CAN 接收消息队列
can_receive_message_struct rx_message_buffer[CAN_RX_BUFFER_SIZE];
volatile uint8_t rx_buffer_head = 0;
@@ -224,6 +231,11 @@ class CAN_transmiter {
* @return void
*/
void update(); // 更新数据
/**
* @brief 打包并发送 CONFIG 反馈帧(0x0101,控制模式/目标设定回显)
* @return void
*/
void send_config_frame(); // CONFIG 反馈帧发送
/**
* @brief CAN_Receive 函数
* @return u8 返回值
@@ -289,6 +301,26 @@ class CAN_transmiter {
* @return void
*/
void handle_set_node_id_message(can_receive_message_struct &current_message);
/**
* @brief 处理 0x0400 扩展格式参数设置(DLC=4:[选择器 u16][值 u16]),
* 选择器 0x0000=节点 ID、反馈帧基础 ID=对应帧刷新周期(ms)
* @param[in,out] current_message 当前 CAN 消息
* @return void
*/
void handle_set_param_message(can_receive_message_struct &current_message);
/**
* @brief 校验并保存新节点 ID 到 Flash(不修改应答帧)
* @param[in] new_id 新节点 ID
* @return u8 1=成功,0=非法 ID 或 Flash 写入失败
*/
u8 apply_new_node_id(u16 new_id);
/**
* @brief 设置反馈帧刷新周期并持久化到 Flash
* @param[in] base_id 反馈帧基础 ID(CANFD_STATUS_ID/CANFD_CONFIG_ID)
* @param[in] period_ms 刷新周期 ms(0=停发)
* @return u8 1=成功,0=未知帧或 Flash 写入失败
*/
u8 set_tx_period(u16 base_id, u16 period_ms);
/**
* @brief 处理已经确认发给本节点的普通协议消息
* @param[in,out] current_message 当前 CAN 消息
@@ -350,6 +382,12 @@ class CAN_transmiter {
* @return void
*/
void communication_check(); // 通信检查
/**
* @brief 打包并发送 STATUS 反馈帧(0x0100,实时状态与错误位图)。
* 不做分频与静默检查,初始化失败上报路径直接调用
* @return u8 1=已提交发送,0=发送失败
*/
u8 send_status_frame(); // STATUS 反馈帧发送
/**
* @brief CAN_Sleep 函数
* @return u8 返回值
@@ -376,16 +414,6 @@ class CAN_transmiter {
* @return u8 返回值
*/
u8 CANFD_AsyncSend(u32 ID, u8 length, u8 *data); // CANFD 异步发送 (使用 DMA)
/**
* @brief CAN_all_Send 函数
* @return u8 返回值
*/
u8 CAN_all_Send(); // CAN 发送
/**
* @brief CANFD_all_Send 函数
* @return u8 返回值
*/
u8 CANFD_all_Send(); // CANFD 发送
/**
* @brief enter_silent_mode 函数
* @return void