Files
1CAR/interface_can.h
2025-10-21 19:13:44 +08:00

177 lines
6.5 KiB
C

#ifndef _INTERFACE_CAN_H_
#define _INTERFACE_CAN_H_
#include "regs_base.h"
#include "irq_num.h"
#include <sdrv_flexcan.h>
#define CAN_INDEX_0 FLEXCAN7
#define CAN_INDEX_1 FLEXCAN21
#define CAN_INDEX_2 FLEXCAN16
#define CAN_INDEX_3 FLEXCAN3
#define CAN_INDEX_4 FLEXCAN23
#define CAN_INDEX_5 FLEXCAN5
#define CAN_INDEX_6 FLEXCAN6
#define CAN_INDEX_7 FLEXCAN4
#define TX_MB_INDEX (USED_MB_FOR_FIFO)
#define MOTOR_INPUT_ID_1 0x189
#define MOTOR_INPUT_ID_2 0x18A
#define MOTOR_INPUT_ID_3 0x103
#define MOTOR_INPUT_ID_4 0x104
//#define MOTOR_INPUT_ID_1 0x15000003//采集模块
//#define MOTOR_INPUT_ID_2 0x10F92708//右前
//#define MOTOR_INPUT_ID_3 0x15000003//采集模块
//#define MOTOR_INPUT_ID_4 0x10F94708//右后
//
//
//#define MOTOR_INPUT_ID_1 0x10F81708//左前 档位
//#define MOTOR_INPUT_ID_2 0x10F82708//右前
//#define MOTOR_INPUT_ID_3 0x10F83708//左后
#define MOTOR_INPUT_ID_8 0x10F84708//右后
#define BMS_INPUT_ID1 0x100
#define BMS_INPUT_ID2 0x101
#define REMOTE_ID 0x12000023
#define REMOTE_ID_1 0x12000024
#define TEMP_MODULE_INPUT_ID_1 0x15000003
#define CAN_FIFO_SIZE 8
//#define TEMP_MODULE_INPUT_ID_2 0x302
// 故障信息
typedef struct _StrCanFault
{
uint8_t navigator_count; //导航仪计数器
uint8_t motor1_count; //手动数据计数器
uint8_t motor2_count; //手动数据计数器
uint8_t bms_count; //bms计数器
uint8_t temperature_count; //温度计数器
uint8_t remote_count; //遥控计数器
uint8_t navigator_state; //导航数据状态
uint8_t motor1_state; //电机1数据状态
uint8_t motor2_state; //电机2数据状态
uint8_t bms_state; //bms状态
uint8_t temperature_state; //温度计数器
uint8_t remote_state; //遥控状态
} StrCanFault;
typedef union _UnCanFault
{
StrCanFault bit_data; // 使用定义的结构体变量名
uint8_t arr[sizeof(StrCanFault)]; // 通过结构体类型确定大小
} UnCanFault;
// can缓存节点
typedef struct _StrCanBuffer
{
uint32_t id; //**< CAN Frame Identifier. */
uint8_t dataBuffer[8]; //数据缓存
unsigned int length : 7; //**< CAN frame payload length in bytes(Range: 0~8). */
unsigned int type : 1; //**< CAN Frame Type(DATA or REMOTE). */
unsigned int format : 1; //**< CAN Frame Identifier(STD or EXT format). */
}StrCanBuffer;
typedef struct Fifo_Queue_Tag
{
StrCanBuffer Data[CAN_FIFO_SIZE];//缓存
uint8_t front;//头指针
uint8_t rear;//尾指针
}StrCanFifoQueue;
#define ON 1
#define OFF 0
#define left_motor_fan(Value) un_inf_can_kgf_output1.bit_data.KGF01 = Value;//电机控制器风扇左
#define right_motor_fan(Value) un_inf_can_kgf_output1.bit_data.KGF03 = Value;//电机控制器风扇右
#define pre_charge_relay(Value) un_inf_can_kgf_output1.bit_data.KGF04 = Value;//预充
#define high_voltage_relay(Value) un_inf_can_kgf_output1.bit_data.KGF07 = Value;un_inf_can_kgf_output1.bit_data.KGF08 = Value//高压继电器
#define low_voltage_relay(Value) un_inf_can_kgf_output1.bit_data.KGF11 = Value;un_inf_can_kgf_output1.bit_data.KGF12 = Value//低压继电器
#define yellow_light(Value) un_inf_can_kgf_output1.bit_data.KGF06 = Value;//黄灯
#define red_light(Value) un_inf_can_kgf_output1.bit_data.KGF09 = Value;//红灯
#define left_vehicle_fan(Value) un_inf_can_kgf_output1.bit_data.KGF14 = Value;//车左风扇
#define right_vehicle_fan(Value) un_inf_can_kgf_output2.bit_data.KGF03 = Value;//车右风扇
#define computer(Value) un_inf_can_kgf_output2.bit_data.KGF01 = Value;un_inf_can_kgf_output2.bit_data.KGF02 = Value//自主计算机
#define network_switch(Value) un_inf_can_kgf_output2.bit_data.KGF05 = Value;un_inf_can_kgf_output2.bit_data.KGF06 = Value//网络交换机含路由器
//H桥
#define brake_motor_forward un_h_bridge_output.bit_data.channel_01 = ON ;un_h_bridge_output.bit_data.channel_04 = ON ;un_h_bridge_output.bit_data.channel_02 = OFF;un_h_bridge_output.bit_data.channel_03 = OFF;un_h_bridge_output.bit_data.sleep_01 = ON ;un_h_bridge_output.bit_data.sleep_02 = ON//正转
#define brake_motor_reversal un_h_bridge_output.bit_data.channel_01 = OFF;un_h_bridge_output.bit_data.channel_04 = OFF;un_h_bridge_output.bit_data.channel_02 = ON ;un_h_bridge_output.bit_data.channel_03 = ON ;un_h_bridge_output.bit_data.sleep_01 = ON ;un_h_bridge_output.bit_data.sleep_02 = ON//反转
#define brake_motor_off un_h_bridge_output.bit_data.channel_01 = OFF;un_h_bridge_output.bit_data.channel_04 = OFF;un_h_bridge_output.bit_data.channel_02 = OFF;un_h_bridge_output.bit_data.channel_03 = OFF;un_h_bridge_output.bit_data.sleep_01 = OFF;un_h_bridge_output.bit_data.sleep_02 = OFF//关闭
//外部函数
void flexcan_transfer_callback(flexcan_handle_t *handle,flexcan_status_e status, uint32_t result,void *userData);
uint8_t flexcan_config_rx_fifo(flexcan_handle_t *handle,flexcan_rx_fifo_config_t *config);
uint8_t CAN_Send_Msg( flexcan_handle_t *handle, uint32_t ID, flexcan_frame_format_e ide, flexcan_frame_type_e rtr, uint8_t *msg, uint8_t len, uint8_t tx_index);
void flexcan_Busoff_Recovery(void);
void initialization_All_Flexcan(void);
//外部变量
extern flexcan_handle_t g_flexcan_handle;
extern bool busoff_occur_flag;//标志量
extern bool WDTReFresh_flag;//更新标志
extern flexcan_handle_t g_flexcan_handle;
extern uint16_t FrameHeader;//帧头
extern flexcan_handle_t can_handle_0;//can初始化结构体
extern flexcan_handle_t can_handle_1;
extern flexcan_handle_t can_handle_2;
extern flexcan_handle_t can_handle_3;
extern flexcan_handle_t can_handle_4;
extern flexcan_handle_t can_handle_5;
extern flexcan_handle_t can_handle_6;
extern flexcan_handle_t can_handle_7;
extern UnCanFault can_fault_info;
extern uint32_t time_elapsed;
extern uint32_t time_elapsed1;
//外部函数
void canInterfaceInit(void);
#endif /* INTERFACE_CAN_H */