香水城版主 请进 请教CAN 过滤器设置

[复制链接]
4804|11
 楼主| 03024003 发表于 2009-8-26 12:31 | 显示全部楼层 |阅读模式
//CAN 过滤器初始化
   CAN_FilterInitStructure.CAN_FilterNumber   = 0;
   CAN_FilterInitStructure.CAN_FilterMode     = CAN_FilterMode_IdMask;
   CAN_FilterInitStructure.CAN_FilterScale    = CAN_FilterScale_32bit;
   CAN_FilterInitStructure.CAN_FilterIdHigh   = 0x0000;
   CAN_FilterInitStructure.CAN_FilterIdLow   = 0x0000;
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh   = 0x0000;
   CAN_FilterInitStructure.CAN_FilterMaskIdLow    = 0x0000;
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
   CAN_FilterInitStructure.CAN_FilterActivation   = ENABLE;
   CAN_FilterInit(&CAN_FilterInitStructure);

           如果我想收标识符是0x18dafa00的帧,设置
           CAN_FilterInitStructure.CAN_FilterIdHigh   = 0x18DA;
   CAN_FilterInitStructure.CAN_FilterIdLow   = 0xFA00;
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
   CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;
           另一个节点发送标识符是0x18dafa00的帧,为什么我收不到呢?
           也许是我没研究明白,还请帮忙
hanker510 发表于 2009-8-28 08:49 | 显示全部楼层
试试看
  CAN_FilterInitStructure.CAN_FilterIdHigh= J1939_REQ_DM1SinglePacket >>13;
  CAN_FilterInitStructure.CAN_FilterIdLow= (u16)((J1939_REQ_DM1SinglePacket &0xFFFF)<<3) |CAN_ID_EXT |CAN_RTR_DATA;
jinjing999 发表于 2009-8-28 13:54 | 显示全部楼层
我正有这方面问题
yiyuep 发表于 2009-9-21 14:03 | 显示全部楼层
我也想问
sinadz 发表于 2009-9-21 15:43 | 显示全部楼层
CAN过滤器是一位一位进行过滤的,你先设置好你需要接收的ID,然后在过滤器里,把要过滤的为置1,不需要过滤的为置0就可以了
majesse 发表于 2009-10-9 11:43 | 显示全部楼层
我也有这方面的问题,望各位不吝赐教!
hsbjb 发表于 2009-10-11 08:55 | 显示全部楼层
你过滤器设置是对的,会不会是其他设置的问题
yybj 发表于 2009-10-11 10:49 | 显示全部楼层
看不出有什么问题
majesse 发表于 2009-10-14 10:59 | 显示全部楼层
呵呵,这个问题我终于搞定了,谢谢2楼兄弟的提示。

如果收标识符是0x18dafa00的帧,设置
  CAN_FilterInitStructure.CAN_FilterIdHigh  =(unsigned short)(0x18dafa00 >> 13);
   CAN_FilterInitStructure.CAN_FilterIdLow   = =(unsigned short)(((0x18dafa00 &  0x0000FFFF) << 3) | CAN_ID_EXT | CAN_RTR_DATA);        CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;
   CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

原因在于:
在CAN_Transmit(&TxMessage);  函数中 你配置的ID在此函数中有移位,目的是为了写入32bits的寄存器中,但是在CAN_FilterInit(&CAN_FilterInitStructure); 中,需要滤波的ID没有移位,也就是自己得先移位后在配置。
majesse 发表于 2009-10-14 11:03 | 显示全部楼层
大家仔细看看
CAN_Transmit(&TxMessage);
CAN_FilterInit(&CAN_FilterInitStructure);
这两个库函数就明白了为什么滤波器配置老出问题。
mulangic 发表于 2014-7-21 16:38 | 显示全部楼层
感谢分享~~
it_yrj 发表于 2017-7-20 12:50 | 显示全部楼层
多谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

125

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部