103 lines
2.5 KiB
C
103 lines
2.5 KiB
C
#include "bsp_can.h"
|
|
#include "main.h"
|
|
#include "Motor.h"
|
|
//===============变量区
|
|
extern CAN_HandleTypeDef hcan1;
|
|
extern CAN_HandleTypeDef hcan2;
|
|
|
|
//===============公共函数
|
|
void Can_Filter_Init(void)
|
|
{
|
|
CAN_FilterTypeDef can_filter_st;
|
|
can_filter_st.FilterActivation = ENABLE;
|
|
can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK;//CAN_FILTERMODE_IDLIST//CAN_FILTERMODE_IDMASK
|
|
can_filter_st.FilterScale = CAN_FILTERSCALE_16BIT;
|
|
can_filter_st.FilterIdHigh = 0x0000; //(0x207<<5)
|
|
can_filter_st.FilterIdLow = 0x0000;
|
|
can_filter_st.FilterMaskIdHigh = 0x0000;//(0x1FF<<5)
|
|
can_filter_st.FilterMaskIdLow = 0x0000;
|
|
can_filter_st.FilterBank = 0;
|
|
can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
|
|
HAL_CAN_ConfigFilter(&hcan1, &can_filter_st);
|
|
HAL_CAN_Start(&hcan1);
|
|
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
|
|
|
|
can_filter_st.SlaveStartFilterBank = 14;
|
|
can_filter_st.FilterBank = 14;
|
|
|
|
HAL_CAN_ConfigFilter(&hcan2, &can_filter_st);
|
|
HAL_CAN_Start(&hcan2);
|
|
HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
|
|
|
|
}
|
|
|
|
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|
{
|
|
CAN_RxHeaderTypeDef rx_header;
|
|
uint8_t rx_data[8];
|
|
|
|
// 读取接收到的消息
|
|
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data) != HAL_OK)
|
|
return; // 安全检查
|
|
|
|
// 只处理标准帧
|
|
if (rx_header.IDE != CAN_ID_STD)
|
|
return;
|
|
|
|
// 根据 CAN 外设实例区分总线
|
|
if (hcan == &hcan1)
|
|
{
|
|
switch (rx_header.StdId)
|
|
{
|
|
case 0x201:
|
|
CAN1_M3508_DataProcess(0x201,rx_data);break;
|
|
case 0x202:
|
|
CAN1_M3508_DataProcess(0x202,rx_data);break;
|
|
case 0x203:
|
|
CAN1_M3508_DataProcess(0x203,rx_data);break;
|
|
case 0x204:
|
|
CAN1_M3508_DataProcess(0x204,rx_data);break;
|
|
case 0x205:
|
|
break;
|
|
case 0x206:
|
|
break;
|
|
case 0x207:
|
|
break;
|
|
case 0x208:
|
|
break;
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (hcan == &hcan2)
|
|
{
|
|
switch (rx_header.StdId)
|
|
{
|
|
case 0x201:
|
|
break;
|
|
case 0x202:
|
|
break;
|
|
case 0x203:
|
|
break;
|
|
case 0x204:
|
|
break;
|
|
case 0x205:
|
|
CAN2_M6020_DataProcess(0x205,rx_data);break;
|
|
case 0x206:
|
|
CAN2_M6020_DataProcess(0x206,rx_data);break;
|
|
case 0x207:
|
|
break;
|
|
case 0x208:
|
|
break;
|
|
case 0x149:
|
|
CToC_CANDataProcess(0x149,rx_data);break;
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|