#include "main.h" #include "can.h" #include "gpio.h" #include "CToC.h" #include "RefreeSystem.h" #include "Remote.h" #include "M3508.h" static CAN_TxHeaderTypeDef TxMessage; static uint8_t DATE_CAIPAN[8]; uint8_t CToC_SlaveSendRefereeSystemData(void) { uint32_t send_mail_box; TxMessage.StdId=CToC_MasterID1; TxMessage.IDE = CAN_ID_STD; TxMessage.RTR = CAN_RTR_DATA; TxMessage.DLC=0x08; DATE_CAIPAN[0]=RefereeSystem_ShooterStatus; DATE_CAIPAN[1]=0; DATE_CAIPAN[2]=0; DATE_CAIPAN[3]=0; DATE_CAIPAN[4]=0; DATE_CAIPAN[5]=0; DATE_CAIPAN[6]=0; DATE_CAIPAN[7]=0; HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(&hcan2, &TxMessage,DATE_CAIPAN, &send_mail_box); if (status != HAL_OK) { return 0; } uint16_t i = 0; while ((HAL_CAN_IsTxMessagePending(&hcan2, send_mail_box)) && (i < 0xFFF)) { i++; } if (i >= 0xFFF) { return 0; } return 1; } void can_filter_init(void) { CAN_FilterTypeDef can_filter_st; // ==================== CAN1 ?? ==================== // CAN1??ID can_filter_st.FilterActivation = ENABLE; can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK; can_filter_st.FilterScale = CAN_FILTERSCALE_32BIT; can_filter_st.FilterIdHigh = 0x0000; // ??ID can_filter_st.FilterIdLow = 0x0000; can_filter_st.FilterMaskIdHigh = 0x0000; can_filter_st.FilterMaskIdLow = 0x0007; // ??ID can_filter_st.FilterBank = 0; can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0; can_filter_st.SlaveStartFilterBank = 14; // CAN2??14??? HAL_CAN_ConfigFilter(&hcan1, &can_filter_st); HAL_CAN_Start(&hcan1); HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING); // ==================== CAN2 ?? ==================== // CAN2??ID 0x200-0x207??? can_filter_st.FilterIdHigh = 0; // ?????ID can_filter_st.FilterIdLow = 0; // ?????ID can_filter_st.FilterMaskIdHigh = 0; // ???????ID can_filter_st.FilterMaskIdLow = 0; // ???????ID can_filter_st.FilterBank = 14; // CAN2??????14 can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0; HAL_CAN_ConfigFilter(&hcan2, &can_filter_st); HAL_CAN_Start(&hcan2); HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING); } Remote_Data Remote_RxData; void CToC_CANDataProcess(uint32_t ID,uint8_t *Data) { if(ID==CToC_SlaveID1)//????????? { Remote_RxData.Remote_R_RL=(uint16_t)((uint16_t)Data[0]<<8 | Data[1]);//????? Remote_RxData.Remote_R_UD=(uint16_t)((uint16_t)Data[2]<<8 | Data[3]);//????? Remote_RxData.Remote_L_RL=(uint16_t)((uint16_t)Data[4]<<8 | Data[5]);//????? Remote_RxData.Remote_L_UD=(uint16_t)((uint16_t)Data[6]<<8 | Data[7]);//????? } else if(ID==CToC_SlaveID2)//????????? { Remote_Status=Data[0];//??????? Remote_RxData.Remote_RS=Data[1];//????????? Remote_RxData.Remote_KeyPush_Ctrl=Data[2];//??Ctrl?? Remote_RxData.Remote_KeyPush_Shift=Data[3];//??Shift?? Remote_StartFlag=Data[4];//???????? Remote_RxData.Remote_LS=Data[5];//????????? } } /** * @brief 更新电机测量数据到控制器 * @param motor_id: 电机ID (0-3) * @param measure: 电机测量数据指针 */ void Update_Motor_Measure(uint8_t motor_id, motor_measure_t* measure) { if (motor_id < 4) { // 直接结构体赋值(更简洁) motor_controller[motor_id].measure = *measure; } } //can传回参数结构体定义 // CAN2接收回调函数 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef rx_header; uint8_t rx_data[8]; HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data); // 判断是CAN1还是CAN2 if (hcan->Instance == CAN1) { // CAN1处理电机数据 (ID 1-4) switch (rx_header.StdId) { case 1: case 2: case 3: case 4: { static uint8_t i = 0; i = rx_header.StdId - 1; get_motor_measure(&motor_chassis[i], rx_data); Update_Motor_Measure(i, &motor_chassis[i]); break; } default: break; } } else if (hcan->Instance == CAN2) { // CAN2处理板间通信数据 CToC_CANDataProcess(rx_header.StdId, rx_data); } } //HAL库接收函数HAL_CAN_GetRxMessage HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);