在使用STM32的CAN控制器進行數(shù)據收發(fā),當用到位屏蔽模式的時候,就要設置過濾器了,這個關系到是否能夠接收到想要的數(shù)據。下面針對幾種不同情況對CAN過濾器(Filter)進行設置。
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//標示符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
1、對擴展數(shù)據幀進行過濾:(只接收擴展數(shù)據幀)
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、對標準數(shù)據幀過濾:(只接收標準數(shù)據幀)
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;//只接受標準數(shù)據幀,不接受擴展數(shù)據幀