STM32 CAN應(yīng)用-過濾器設(shè)置
在使用STM32的CAN控制器進(jìn)行數(shù)據(jù)收發(fā),當(dāng)用到位屏蔽模式的時候,就要設(shè)置過濾器了,這個關(guān)系到是否能夠接收到想要的數(shù)據(jù)。下面針對幾種不同情況對CAN過濾器(Filter)進(jìn)行設(shè)置。
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//標(biāo)示符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
1、對擴(kuò)展數(shù)據(jù)幀進(jìn)行過濾:(只接收擴(kuò)展數(shù)據(jù)幀)
CAN_FilterInitStructure.CAN_FilterIdHigh=(EXT_ID>>13)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterIdLow=((EXT_ID<<3)|(0x04))&0xFFFF;
//這里設(shè)置|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、對擴(kuò)展遠(yuǎn)程幀過濾:(只接收擴(kuò)展遠(yuǎn)程幀)
CAN_FilterInitStructure.CAN_FilterIdHigh=(EXT_ID>>13)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterIdLow=((EXT_ID<<3)|(0x06)&0xFFFF;
//這里設(shè)置|0x06(0b0110)就是為了IDE=1,RTR=1
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
3、對標(biāo)準(zhǔn)遠(yuǎn)程幀過濾:(只接收標(biāo)準(zhǔn)遠(yuǎn)程幀)
CAN_FilterInitStructure.CAN_FilterIdHigh=((STD_ID<<21)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow=((STD_ID<<21)|(0x0))&0xFFFF;
//這里設(shè)置|0x0(0b0000)就是為了IDE=0,RTR=0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;//0xFFE0表示要關(guān)注11位的STD_ID
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;//0110,表示要關(guān)注IDE和RTR位,只接受標(biāo)準(zhǔn),不接受擴(kuò)展
4、對標(biāo)準(zhǔn)數(shù)據(jù)幀過濾:(只接收標(biāo)準(zhǔn)數(shù)據(jù)幀)
CAN_FilterInitStructure.CAN_FilterIdHigh=((STD_ID<<21)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow=((STD_ID_ID<<21)|(0x06))&0xFFFF;
//這里設(shè)置|0x02(0b0010)就是為了IDE=0,RTR=1
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;//只接受標(biāo)準(zhǔn)數(shù)據(jù)幀,不接受擴(kuò)展數(shù)據(jù)幀