STM32 can的屏蔽怎么弄的?

EmbeddedLong 2012-08-07 11:47:08



/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=1; // 选择过滤器编号
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //指定了过滤器将被初始化到的模式标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //给出了过滤器位宽1个32位过滤器
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; // 标识符匹配
CAN_FilterInitStructure.CAN_FilterIdLow=0x0001; //用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF; // // 标识符屏蔽位,1:必须匹配,0:不用关心
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000f; /
/用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO1;//设定了指向过滤器的FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);


/*数据接收*/
/*i = 0;
while((CAN_MessagePending(CAN_FIFO0) < 1) && (i != 0xFF))//有报文到达FIFO0
{
i++;
} */
while(CAN_MessagePending(CAN1,CAN_FIFO1) < 1);//一直等到有数据收到为止
/* receive */
RxMessage.StdId=0x00000002;
RxMessage.IDE=CAN_ID_STD;
RxMessage.DLC=4;
RxMessage.Data[0]=0x00;



RxMessage.Data[1]=0x00;

看不懂这些是怎么对应的啊 烦恼啊
...全文
1219 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
further_away 2013-05-25
  • 打赏
  • 举报
回复
这个之前也做过一段时间 理论知识你自己百度下。 下面代码 稍加修改就可以了 u32 Ext_ID = 0x18FF0800; //过滤这组数据:0x18FF0800 CAN_FilterInitStructure.CAN_FilterNumber=7; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;// CAN_FilterInitStructure.CAN_FilterIdHigh = ((Ext_ID<<3) >>16) &0xffff; CAN_FilterInitStructure.CAN_FilterIdLow = (u16)(Ext_ID<<3) | CAN_ID_EXT; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x87ff;//过滤一组数据 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
「已注销」 2013-05-10
  • 打赏
  • 举报
回复
醍醐灌顶呀
阳扬1991 2012-12-20
  • 打赏
  • 举报
回复
二楼的确牛逼 顶一个
elliot chen 2012-12-14
  • 打赏
  • 举报
回复
2楼牛逼啊,一针见血
zc850463390zc 2012-10-23
  • 打赏
  • 举报
回复
stm32 can的屏蔽位模式:
一个是标识符寄存器,一个是屏蔽位寄存器。
凡是屏蔽位寄存器里为1的位所对应的标识符寄存器的位,这些位是必须匹配的,也就是说,你接受到的Message里面的标识符(ID)里面对应的位必须跟标识符寄存器里对应的位相同,才能被接受。
例如:
标识符寄存器的bit15=0,屏蔽位寄存器的bit15=1,那么接受的Message里面的标识符的bit15必须为0才可能被硬件接受。
如果屏蔽位寄存器的bit15=0,Message里面的标识符的bit15无论为什么值,bit15都能匹配通过。
当bit0~bit31都能通过时。此Message就会被硬件接受。
billowtust 2012-08-08
  • 打赏
  • 举报
回复
代码看不懂,可能是你对CAN通信还不是特别的清楚明白

有空看看CAN协议,没空的话至少也得看看STM32的CAN篇章,VERY仔细的看

27,367

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧