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发送的数据。

如有错误可留言


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值