STM32同時使用can1與can2,can2無法使用的問題
首先 我們先介紹一下原理
bxCAN 主要特性的其中一點需要注意
在can接收資料時:
● 兩個具有三級深度的接收 FIFO
● 可調整的篩選器組:
— CAN1 和 CAN2 之間共享 28 個篩選器組

從這張圖片不難看出can1為主機,can2為從機,因此can2的啟動前提是已經啟動了can1.
- can通訊can2是基于can1的
使用can2之前必須初始化can1 - 因此舉例如果使用FIFO0的話,將篩選器分配:
can1的篩選器組就從0開始 范圍為0-14
CAN_FilterInitStructure.CAN_FilterNumber=0;
can2的篩選器組就從14開始 范圍為14-27
CAN_FilterInitStructure.CAN_FilterNumber=14;
注意:can過濾器配置必須用16進制
很多小伙伴可能懶得看原理,多說無益,咋們直接上代碼:
1.can1&can2正常配置
2.配置can總線濾波器:
void can_filter(CAN_HandleTypeDef* hcan)
{
CAN_FilterTypeDef CAN_FilterConfigStructure;
if (hcan == &hcan2)
{
CAN_FilterConfigStructure.FilterBank = 14;//***********************!!
}
if (hcan == &hcan1)
{
CAN_FilterConfigStructure.FilterBank = 0;
}
CAN_FilterConfigStructure.FilterMode = CAN_FILTERMODE_IDMASK;
CAN_FilterConfigStructure.FilterScale = CAN_FILTERSCALE_32BIT;
CAN_FilterConfigStructure.FilterIdHigh = 0x0000;
CAN_FilterConfigStructure.FilterIdLow = 0x0000;
CAN_FilterConfigStructure.FilterMaskIdHigh = 0x0000;
CAN_FilterConfigStructure.FilterMaskIdLow = 0x0000;
CAN_FilterConfigStructure.FilterFIFOAssignment = CAN_RX_FIFO0;
CAN_FilterConfigStructure.SlaveStartFilterBank = 14;
CAN_FilterConfigStructure.FilterActivation = ENABLE;
HAL_CAN_ConfigFilter(hcan, &CAN_FilterConfigStructure);
}
3.主函式里初始化
MX_CAN1_Init();//先初始化can1!!!!!
MX_CAN2_Init();
can_filter(hcan1);
can_filter(hcan2);
4.齊活
如果你覺得還有用就點一個贊叭,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272795.html
標籤:其他
上一篇:C++ STL 常用函式
