首先在RCC中把晶振设置为外部晶振
时钟图设置如下
can1和can2设置波特率250k,开接收中断,并配置IO
设置NVIC
配置路径,生成代码
打开MDK工程后,需要进行以下设置才可完成收发通讯
1、增加过滤器设置
2、开启启动函数
3、开启接收
4、编写回调函数
//CAN1设置,注意FilterBank 为0-13
CAN1_FilerConf.FilterFIFOAssignment = CAN_FILTER_FIFO0; //过滤器0关联到FIFO0
CAN1_FilerConf.SlaveStartFilterBank = 0; //过滤器0
CAN1_FilerConf.FilterMode = CAN_FILTERMODE_IDMASK;
CAN1_FilerConf.FilterScale = CAN_FILTERSCALE_32BIT;
CAN1_FilerConf.FilterActivation = ENABLE; //激活滤波器0
CAN1_FilerConf.FilterBank = 1;
CAN1_FilerConf.FilterIdHigh = 0x00; //0XC007; //32位ID
CAN1_FilerConf.FilterIdLow = 0x00; //0X8200;
CAN1_FilerConf.FilterMaskIdHigh = 0x00; //0XC007; //32位MASK
CAN1_FilerConf.FilterMaskIdLow = 0x00; //0XFA00;
if (HAL_CAN_ConfigFilter(&hcan1, &CAN1_FilerConf) != HAL_OK)
Error_Handler(); //滤波器初始化
HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
//CAN设置,注意FilterBank 为14-27
CAN2_FilerConf.FilterFIFOAssignment = CAN_FILTER_FIFO0; //过滤器0关联到FIFO0
CAN2_FilerConf.SlaveStartFilterBank = 14; //过滤器14
CAN2_FilerConf.FilterMode = CAN_FILTERMODE_IDMASK;
CAN2_FilerConf.FilterScale = CAN_FILTERSCALE_32BIT;
CAN2_FilerConf.FilterActivation = ENABLE; //激活滤波器0
CAN2_FilerConf.FilterBank = 14;
CAN2_FilerConf.FilterIdHigh = 0x00; //0XC007; //32位ID
CAN2_FilerConf.FilterIdLow = 0x00; //0X8200;
CAN2_FilerConf.FilterMaskIdHigh = 0x00; //0XC007; //32位MASK
CAN2_FilerConf.FilterMaskIdLow = 0x00; //0XFA00;
if (HAL_CAN_ConfigFilter(&hcan1, &CAN2_FilerConf) != HAL_OK)
Error_Handler(); //滤波器初始化
HAL_CAN_Start(&hcan2);
HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
/**
* @brief 中断回调函数
*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if (hcan->Instance == hcan1.Instance)
{
uint8_t buf[8];
CAN_RxHeaderTypeDef CAN_RX_HDR;
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &CAN_RX_HDR, buf) // 获得接收到的数据头和数据
== HAL_OK)
{
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING); // 再次使能FIFO0接收中断
}
}
if (hcan->Instance == hcan2.Instance)
{
uint8_t buf[8];
CAN_RxHeaderTypeDef CAN_RX_HDR;
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &CAN_RX_HDR, buf) // 获得接收到的数据头和数据
== HAL_OK)
{
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING); // 再次使能FIFO0接收中断
}
}
}
剩下的只需要在main函数中编写发送函数即可,亲测可以实现CAN1和CAN2的数据收发