1. 程式人生 > >stm32 CAN過濾器組

stm32 CAN過濾器組

在互聯型產品中, CAN1和CAN2分享28個過濾器組
其它STM32F103xx系列產品中有14個過濾器組

位寬設定
1

四種配置方式:
1個32位的遮蔽位模式
2個32位的識別符號列表模式,可以過濾2個識別符號id
2個16位的遮蔽位模式
4個16位的識別符號列表模式,可以過濾4個標準識別符號id

擴充套件識別符號必須選擇32位寬

識別符號列表模式
在識別符號列表模式下,遮蔽暫存器也被當作識別符號暫存器用。因此,不是採用一個識別符號加一
個遮蔽位的方式,而是使用2個識別符號暫存器。接收報文識別符號的每一位都必須跟過濾器識別符號
相同

CAN_FilterInitStructure.CAN_FilterNumber = 0; //過濾器組0(FM1R)
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
//第一個識別符號id(FR1)- 標準識別符號舉例
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x123 << 5;  //根據位寬設定圖
CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID_STD;   //選擇標準識別符號
//第二個識別符號id(FR2)- 擴充套件識別符號舉例 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x321 << 3 | CAN_ID_EXT; //根據位寬設定圖 | 選擇擴充套件識別符號

傳送方識別符號id必須是0x123或0x321

遮蔽位模式
遮蔽位模式可以過濾出一組識別符號

//標準識別符號舉例
CAN_FilterInitStructure.CAN_FilterNumber = 0; //過濾器組0(FM1R)
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x123
<< 5; CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID_STD; //選擇標準識別符號 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x23 << 5; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;

CAN_FilterIdx:期望的識別符號id
CAN_FilterMaskIdx:遮蔽位。關心的位

期望的識別符號id:
1
關心的位:
只關心為1的位,必須和期望的識別符號id位一致。其他位是多少不關心
2

優先順序規則

位寬為32位的過濾器,優先順序高於位寬為16位的過濾器
對於位寬相同的過濾器,識別符號列表模式的優先順序高於遮蔽位模式
位寬和模式都相同的過濾器,優先順序由過濾器號決定,過濾器號小的優先順序高