68 lines
3.0 KiB
C
68 lines
3.0 KiB
C
|
|
#ifndef CHASSIS_CAN_MSG_H
|
|||
|
|
#define CHASSIS_CAN_MSG_H
|
|||
|
|
|
|||
|
|
#include <stdint.h>
|
|||
|
|
|
|||
|
|
/* 强制 1 字节对齐,完美匹配物理总线上的 8 字节数据帧 */
|
|||
|
|
#pragma pack(push, 1)
|
|||
|
|
|
|||
|
|
/* =========================================================
|
|||
|
|
* TX: 上位机 (H743) -> 底盘 (F407)
|
|||
|
|
* ========================================================= */
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 0x100 速度控制帧 (建议 20ms 发送周期) [cite: 608-612, 624]
|
|||
|
|
*/
|
|||
|
|
typedef struct {
|
|||
|
|
int16_t vx_x1000; // Byte 0-1: 线速度 m/s * 1000 (小端) [cite: 612]
|
|||
|
|
int16_t wz_x1000; // Byte 2-3: 角速度 rad/s * 1000 (小端) [cite: 612]
|
|||
|
|
uint8_t ctrl_flags; // Byte 4: 控制标志位 [cite: 612]
|
|||
|
|
uint8_t reserved; // Byte 5: 预留,固定填 0 [cite: 612]
|
|||
|
|
uint8_t rolling_counter; // Byte 6: 滚动计数器 (新counter相对上一帧差值必须在1..3之间) [cite: 612, 622]
|
|||
|
|
uint8_t crc8; // Byte 7: 对 Byte0~6 做的 CRC8-SAE J1850 [cite: 612]
|
|||
|
|
} CanMsg_CmdVel_0x100_t;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* =========================================================
|
|||
|
|
* RX: 底盘 (F407) -> 上位机 (H743)
|
|||
|
|
* ========================================================= */
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 0x181 底盘状态帧 (20ms 发送周期) [cite: 633-637]
|
|||
|
|
*/
|
|||
|
|
typedef struct {
|
|||
|
|
uint8_t system_state; // Byte 0: 0=BOOTING, 1=OPERATIONAL, 2=SAFE_FAULT [cite: 636, 665]
|
|||
|
|
uint8_t system_health; // Byte 1: 0=OK, 1=WARNING, 2=FAULT [cite: 636, 667]
|
|||
|
|
uint32_t diag_bits; // Byte 2-5: 诊断位图 (小端) [cite: 637, 669]
|
|||
|
|
uint8_t cmd_age_10ms; // Byte 6: 距最近一次合法 0x100 过去多少个 10ms [cite: 637]
|
|||
|
|
uint8_t status_counter; // Byte 7: 状态帧发送计数器 [cite: 637]
|
|||
|
|
} CanMsg_Status_0x181_t;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 0x200 里程增量帧 (约 60ms 轮询周期) [cite: 655-658]
|
|||
|
|
* @note 这是时间窗内的脉冲增量,上位机需自行累加积分以推算里程 [cite: 660-662]
|
|||
|
|
*/
|
|||
|
|
typedef struct {
|
|||
|
|
int16_t fl_delta_ticks; // Byte 0-1: 左前轮增量 [cite: 658]
|
|||
|
|
int16_t rl_delta_ticks; // Byte 2-3: 左后轮增量 [cite: 658]
|
|||
|
|
int16_t fr_delta_ticks; // Byte 4-5: 右前轮增量 [cite: 658]
|
|||
|
|
int16_t rr_delta_ticks; // Byte 6-7: 右后轮增量 [cite: 658]
|
|||
|
|
} CanMsg_OdomDelta_0x200_t;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 0x184 通信诊断帧 (100ms 发送周期) [cite: 651-653]
|
|||
|
|
*/
|
|||
|
|
typedef struct {
|
|||
|
|
uint8_t valid_cmd_total; // Byte 0: 合法命令累计 [cite: 653]
|
|||
|
|
uint8_t crc_error_total; // Byte 1: CRC 错误累计 [cite: 653]
|
|||
|
|
uint8_t counter_reject_total; // Byte 2: Counter 拒收累计 [cite: 653]
|
|||
|
|
uint8_t can_tx_drop_total; // Byte 3: CAN 发送丢帧累计 [cite: 653]
|
|||
|
|
uint8_t busoff_total; // Byte 4: Bus-Off 累计 [cite: 653]
|
|||
|
|
uint8_t rx_overrun_total; // Byte 5: FIFO overrun 累计 [cite: 653]
|
|||
|
|
uint8_t last_accepted_counter; // Byte 6: 最近一次接受的 counter [cite: 653]
|
|||
|
|
uint8_t err_nibbles; // Byte 7: 高4位=连续counter错,低4位=连续CRC错 [cite: 653]
|
|||
|
|
} CanMsg_CommDiag_0x184_t;
|
|||
|
|
|
|||
|
|
#pragma pack(pop)
|
|||
|
|
|
|||
|
|
#endif // CHASSIS_CAN_MSG_H
|