關於STM32 CAN的過濾器/濾波器

1.在設置CanTxMsg.StdId時注意需要將其右移一位,比如如下濾波器配置:

CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x7f20;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xf0f0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

使用的是標識符掩碼模式,接收到的消息想要通過濾波器則STDID必須是0x7x2,這時我們可以設置 TxMessage.StdId=0x7a2>>1,注意這裏必須要右移一位,因爲標準標識符的長度是11位,它佔用的是CAN_TIxR的高11位,所以在最後組合到CAN_TIxR中時是會被左移21位的,如下:

if (TxMessage->IDE == CAN_Id_Standard)
    {
      assert_param(IS_CAN_STDID(TxMessage->StdId));  
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \
                                                  TxMessage->RTR);
    }

一個數如果被左移4的整數倍那麼其還可以保持數字不變,只是值擴大了,如0x7f在左移4位之後是0x7f0,7和f都不變只是最後增加了一個0,左移8位則增加兩個0,但是如果是左移3位則變成0x3f8了,數字全變;因此我們這邊被左移 21位是會導致數字全變的,所以我們採取的措施就是在賦值的時候主動右移一位,這樣它左移21位就相當於原來是隻左移20位了。

2.標識符列表模式允許匹配多個ID,你配置了幾個濾波器組就可以匹配幾個ID,如下:

CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; 
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x7f20;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x7f20;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
	
CAN_FilterInitStructure.CAN_FilterNumber=1;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; 
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x7c20;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x7c20;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

表示ID爲7f20和7c20的都可以通過。

3.在配置爲標識符列表模式時 CAN_FilterId 和 CAN_FilterMaskId 必須一樣才起效。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章