刚开始接触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发送的数据。
如有错误可留言