1. 程式人生 > >STM32F103 CAN通訊的濾波器設定

STM32F103 CAN通訊的濾波器設定

剛開始接觸CAN通訊,測試過收發後,還需要使用識別符號過濾來實現固定節點的資料收發。記錄一下“遮蔽位模式”下濾波引數的設定。

傳送程式碼如下:

//can傳送一組資料(固定格式:ID為0X123,標準幀,資料幀)
//len:資料長度(最大為8)     
//msg:資料指標,最大為8個位元組.
//返回值:0,成功;
// 其他,失敗;
u8 Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0X123; // 標準識別符號 
TxMessage.ExtId=0x00;

// 設定擴充套件標示符 
TxMessage.IDE=CAN_Id_Standard; // 標準幀
TxMessage.RTR=CAN_RTR_Data; // 資料幀
TxMessage.DLC=len; // 要傳送的資料長度
for(i=0;i<len;i++)
TxMessage.Data[i]=msg[i];          
mbox= CAN_Transmit(CAN1, &TxMessage);   
i=0; 
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;
//等待發送結束
if(i>=0XFFF)return 1;
return 0;  

}

程式碼中使用迴環測試識別符號濾波功能。標準識別符號0X123。這裡要注意雖然賦值為0X123但是在CAN_Transmit(CAN1, &TxMessage)函式內部會有這樣一句話,會發現把StdId右移了21位。

 CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) |  TxMessage->RTR);//標準幀只有31-21位


由上圖的暫存器位結構,實際上移位以後可以看做0X123<<21=0X24600000;

再看識別符號濾波器的設定程式碼

CAN_FilterInitStructure.CAN_FilterNumber=0; //過濾器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //遮蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 
CAN_FilterInitStructure.CAN_FilterIdHigh=0x2460; //32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;//32位MASK 設定為31-21位全部匹配
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//過濾器0關聯到FIFO0

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//啟用過濾器0

標準幀只有31-21位,所以濾波器設定引數時只需要設定31-21位。

由123<<21位得到0x24600000,所以CAN_FilterInitStructure.CAN_FilterIdHigh=0x2460。

遮蔽位設定為31-21位全部匹配CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;這樣只能接收0x123傳送的資料。


如有錯誤可留言