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:
+38
-10
@@ -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 ¤t_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 ¤t_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
|
||||
|
||||
Reference in New Issue
Block a user