STM32 CAN應用-過濾器設定
阿新 • • 發佈:2019-01-30
在使用STM32的CAN控制器進行資料收發,當用到位遮蔽模式的時候,就要設定過濾器了,這個關係到是否能夠接收到想要的資料。下面針對幾種不同情況對CAN過濾器(Filter)進行設定。
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //標示符遮蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
1、對擴充套件資料幀進行過濾:(只接收擴充套件資料幀)2、對擴充套件遠端幀過濾:(只接收擴充套件遠端幀)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;
3、對標準遠端幀過濾:(只接收標準遠端幀)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;
4、對標準資料幀過濾:(只接收標準資料幀)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位,只接受標準,不接受擴充套件
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;//只接受標準資料幀,不接受擴充套件資料幀