#ifndef APPHAL_CAN_CONFIG_H_ #define APPHAL_CAN_CONFIG_H_ #include "cmsis_os2.h" // 大端转小端 #define INT32_BIG_TO_LITTLE(x) \ ((((x) & 0xFF000000) >> 24) | \ (((x) & 0x00FF0000) >> 8) | \ (((x) & 0x0000FF00) << 8) | \ (((x) & 0x000000FF) << 24)) // 小端转大端 #define INT32_LITTLE_TO_BIG(x) \ ((((x) & 0xFF000000) >> 24) | \ (((x) & 0x00FF0000) >> 8) | \ (((x) & 0x0000FF00) << 8) | \ (((x) & 0x000000FF) << 24)) #define SWAP_16(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF)) // 电机驱动板 can_frame_id 由 拨码器 1234 配置 【范围 0~15】 #define CAN_BASE_FRAME_ID 0x08 // CAN 响应帧ID = CAN_BASE_FRAME_ID + can_frame_id #define CAN_FRAME_RANGE 0x20 // ---- ---- CAN 接收【控制帧】 ID ---- ---- // #define CAN_X_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x01) // #define CAN_Y_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x02) // #define CAN_Z_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x03) #define CAN_X_MOTOR_FRAME_ID 0x09 #define CAN_Y_MOTOR_FRAME_ID 0x0A #define CAN_Z_MOTOR_FRAME_ID 0x0B // ---- ---- CAN 发送【主动上报】帧 ID ---- ---- #define UPLOAD_MOTOR_POS_ID (CAN_BASE_FRAME_ID + 0x04) // 电机驱动板 电机位置 + 电机 状态 上传帧 //#define UPLOAD_MOTOR_SPEED_ID (CAN_BASE_FRAME_ID + 0x02) // 电机驱动板 电机位置 + 电机 状态 上传帧 #define UPLOAD_MOTOR_SENSOR (CAN_BASE_FRAME_ID + 0x05) // 电机驱动板 电机位置 + 电机 状态 上传帧 // 主动推送事件 #define UPLOAD_EVENT_ID 0x10 // 定时推送状态 #define UPLOAD_STATUS_ID 0x11 // 基础功能码 #define CMD_FUN_CODE 0x5A #define UPLOAD_FUN_CODE 0xA0 // ==== ==== ==== ==== 线圈地址 ==== ==== ==== ==== #define MOTOR_ENABLE_ADDRESS 0x00 // 定义电机使能地址 #define STOP_ADDRESS 0x01 // 定义停止地址 #define RESET_POSITION_ADDRESS 0x02 // 定义重置位置地址 #define MOVE_HOME_ADDRESS 0x03 // 回 HOME #define CLEANING_VALVE_ADDRESS 0x21 // 清洗阀 #define NOZZLE_VALVE_ADDRESS 0x22 // 喷嘴阀 #define DEHUMIDIFICATION_VALVE_ADDRESS 0x23 // 除湿阀 #define LIGHTING_PANEL_ADDRESS 0x24 // 照明灯板 #define LASER_ADDRESS 0x25 // 激光 #define HIGH_VOLTAGE_PACK_POWER_ON_ADDRESS 0x26 // 高压包供电开启 #define PUMP_DRIVER_ADDRESS 0x27 // 注射泵驱动 #define THREE_VALVE_ADDRESS_VT 0x28 // 三通阀 VT #define THREE_VALVE_ADDRESS_POWER 0x29 // 三通阀 POWER #define MOVE_FINISHED_READ_ADDRESS 0x10 #define AT_ORIGIN_READ_ADDRESS 0x11 #define AT_LIMIT_READ_ADDRESS 0x12 #define E_STOP_READ_ADDRESS 0x60 #define PAUSE_READ_ADDRESS 0x61 #define THREE_WAY_VALVE_READ_ADDRESS 0x62 #define SYRINGE_PUMP_READ_ADDRESS 0x63 #define RT_POS_READ_ADDRESS 0x00 // 实时位置 #define RT_SPEED_READ_ADDRESS 0x02 // 实时速度 #define T_RH_READ_ADDRESS 0x60 // 湿度 + 温度 #define FLOW_READ_ADDRESS 0x62 // 流量计 // ==== ==== ==== ==== 寄存器地址 ==== ==== ==== ==== #define SPEED_ADDRESS 0x00 // 定义速度地址 #define TARGET_POSITION_ADDRESS 0x02 // 定义目标位置地址 #define I_RUN_ADDRESS 0x04 //电机运行电流地址 #define V_SPEED_ADDRESS 0x06 // 电机 速度模式 闭环控制 目标速度 #define V_TARGET_POSITION_ADDRESS 0x08 // 电机 速度模式 闭环控制 目标位置 #define SHIFT_TARGET_POSITION_ADDRESS 0x0A // 电机 位置模式 闭环控制 相对位置 #define HIGH_VOLTAGE_PACK_SET_ADDRESS 0x20 // 高压电包设置寄存器 #define PUMP_DRIVER_SPEED_ADDRESS 0x21 // 注射泵速度 ML #define LASER_POWER_ADDRESS 0x22 // 激光控制 // 主动推送事件 功能码 #define UPLOAD_FUN_CODE_MOTOR_X 0x5A #define UPLOAD_FUN_CODE_MOTOR_Y 0x5B #define UPLOAD_FUN_CODE_MOTOR_Z 0x5C // 定时推送状态 功能码 // [0] 功能码 enum UploadStatusCode { USC_MotorXPos = 0x1A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位 USC_MotorXSpeed = 0x1B, // [1-4] 速度 USC_MotorYPos = 0x3A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位 USC_MotorYSpeed = 0x3B, // [1-4] 速度 USC_MotorZPos = 0x5A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位 USC_MotorZSpeed = 0x5B, // [1-4] 速度 USC_Sensor_D_1 = 0x7A, // 数字量 [1] 急停 + [2] 暂停 + [3] 三通阀 + [4] 注射泵 USC_Sensor_A_1 = 0x8A, // 模拟量 [1-2] 流量计(大端) + [3-4] 湿度(大端) + [5-6] 温度(大端) }; #define UPLOAD_STUTUS_MOTOR_X_POS 0x0A #define UPLOAD_STUTUS_MOTOR_ 0x5B #define UPLOAD_FUN_CODE_MOTOR_Z 0x5C enum CAN_PDU_FunCode { CAN_PDU_READ_COILS = 0x01, CAN_PDU_READ_DISCRETE_INPUTS = 0x02, CAN_PDU_READ_HOLDING_REGISTERS = 0x03, CAN_PDU_WRITE_SINGLE_COIL = 0x05, CAN_PDU_WRITE_SINGLE_REGISTER = 0x06, CAN_PDU_WRITE_MULTIPLE_COILS = 0x0F, CAN_PDU_WRITE_MULTIPLE_REGISTERS = 0x10 }; enum CanPDUErrorCodes { CAN_PDU_OK = 0x00, CAN_PDU_ILLEGAL_FUNCTION = 0x01, CAN_PDU_ILLEGAL_DATA_ADDRESS = 0x02, CAN_PDU_ILLEGAL_DATA_VALUE = 0x03, CAN_PDU_ILLEGAL_EXCEPTION = 0x10, CAN_PDU_ILLEGAL_TIME_OUT = 0x44 }; #define CAN_CONFIG CanConfig::getInstance() class CanConfig { private: // 私有构造函数,防止外部实例化 CanConfig(); // 禁止拷贝构造函数和赋值运算符 CanConfig(const CanConfig&) = delete; CanConfig& operator=(const CanConfig&) = delete; // 静态成员变量,保存单例实例 static CanConfig* instance; // CAN 帧 ID uint32_t can_frame_id; public: // 互斥锁句柄,用于线程安全 static osMutexId_t mutex; public: // 静态方法,获取单例实例 static CanConfig* getInstance(); // 设置 CAN 帧 ID void setCanFrameId(uint32_t id); // 获取 CAN 帧 ID uint32_t getCanFrameId() const; }; #endif /* APPHAL_CAN_CONFIG_H_ */