1. 程式人生 > >STM32 CAN應用-過濾器設定

STM32 CAN應用-過濾器設定

在使用STM32的CAN控制器進行資料收發,當用到位遮蔽模式的時候,就要設定過濾器了,這個關係到是否能夠接收到想要的資料。下面針對幾種不同情況對CAN過濾器(Filter)進行設定。
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //標示符遮蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
1、對擴充套件資料幀進行過濾:(只接收擴充套件資料幀)
CAN_FilterInitStructure.CAN_FilterIdHigh =(EXT_ID >> 13) & 0xFFFF;
CAN_FilterInitStructure.CAN_FilterIdLow =((EXT_ID << 3) | (0x04)) & 0xFFFF; 
//這裡設定|0x04(0b0100)就是為了IDE=1,RTR=0,
//這裡也可以寫為(EXT_ID << 3)|CAN_ID_EXT|CAN_RTR_ROMOTE,效果一樣,下同
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
2、對擴充套件遠端幀過濾:(只接收擴充套件遠端幀)
CAN_FilterInitStructure.CAN_FilterIdHigh =(EXT_ID >> 13) & 0xFFFF;
CAN_FilterInitStructure.CAN_FilterIdLow =((EXT_ID << 3) | (0x06) & 0xFFFF; 
//這裡設定|0x06(0b0110)就是為了IDE=1,RTR=1
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
3、對標準遠端幀過濾:(只接收標準遠端幀)
CAN_FilterInitStructure.CAN_FilterIdHigh =((STD_ID << 21) & 0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow =((STD_ID << 21) | (0x0)) & 0xFFFF; 
//這裡設定|0x0(0b0000)就是為了IDE=0,RTR=0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFE0; //0xFFE0表示要關注11位的STD_ID
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0006;  //0110,表示要關注IDE和RTR位,只接受標準,不接受擴充套件
4、對標準資料幀過濾:(只接收標準資料幀)
CAN_FilterInitStructure.CAN_FilterIdHigh =((STD_ID << 21) & 0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow =((STD_ID_ID << 21) | (0x06)) & 0xFFFF; 
//這裡設定|0x02(0b0010)就是為了IDE=0,RTR=1
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFE0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0006;//只接受標準資料幀,不接受擴充套件資料幀