OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2979|回复: 6

stm32can双节点通信标识符ID的过滤问题

[复制链接]

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
发表于 2017-9-7 16:28:21 | 显示全部楼层 |阅读模式
1金钱
我用两台单片机进行CAN通信试验,收发都成功了,但发现了一个问题,设置的过滤器id为00和01,结果另一台单片机发送ID
StdId无论改为什么这台单片机都能收到消息,怎么回事?难道双节点通信不需要用ID标识符过滤消息?
这是我的can过滤器设置:
void CAN1_Config16BitFilter(uint16_t id1, uint16_t id2)
{
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    uint16_t mask = 0xFFFF;

        CAN_FilterInitStructure.CAN_FilterNumber = 1;               
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//IDÄ£ê½


        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
        CAN_FilterInitStructure.CAN_FilterIdHigh = (id1 << 5);           
        CAN_FilterInitStructure.CAN_FilterIdLow =  (id2 << 5);       

        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask << 5);
        CAN_FilterInitStructure.CAN_FilterMaskIdLow  = (mask << 5);
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

        CAN_FilterInit(&CAN_FilterInitStructure);
}

最佳答案

查看完整内容[请看2#楼]

我找到原因了,我发送函数拓展ID和标准ID设置反了,导致单片机以拓展帧的方式过滤我的发送帧 if((id & 0x7FF) == 0x7FF) { TxMessage.IDE = CAN_ID_EXT; //拓展ID } else { TxMessage.IDE = CAN_ID_STD; //标准ID }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
 楼主| 发表于 2017-9-7 16:28:22 | 显示全部楼层
我找到原因了,我发送函数拓展ID和标准ID设置反了,导致单片机以拓展帧的方式过滤我的发送帧
   if((id & 0x7FF) == 0x7FF)
    {
            TxMessage.IDE = CAN_ID_EXT;        //拓展ID
    }
    else
    {
            TxMessage.IDE = CAN_ID_STD;        //标准ID
    }
回复

使用道具 举报

63

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2015-11-29
在线时间
146 小时
发表于 2017-9-7 20:41:07 | 显示全部楼层
两组过滤器只要满足一组就可以收到数据了,还有就是你的匹配可以设置成完全匹配才接收
回复

使用道具 举报

19

主题

195

帖子

1

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-7
在线时间
82 小时
发表于 2017-9-7 21:12:35 | 显示全部楼层
认真看看这个,会有意想不到的收获。
http://www.openedv.com/forum.php?mod=viewthread&tid=10328
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
 楼主| 发表于 2017-9-8 09:08:43 | 显示全部楼层
feiyang0725 发表于 2017-9-7 20:41
两组过滤器只要满足一组就可以收到数据了,还有就是你的匹配可以设置成完全匹配才接收

我上面这样设置屏蔽滤波器uint16_t mask = 0xFFFF;就是设置为完全匹配才能接收,但不匹配的也能进接收中断;
我的问题是不满足过滤器设置也能收到消息,比如我16位ID标识符设置id1=00,id2=01;结果我另一台机发id=05的can帧他居然也能收到,有什么可能原因
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
 楼主| 发表于 2017-9-8 09:10:15 | 显示全部楼层
qshuashao 发表于 2017-9-7 21:12
认真看看这个,会有意想不到的收获。
http://www.openedv.com/forum.php?mod=viewthread&tid=10328

论坛上的帖子我看了不少,按此设置的程序也没什么不同,有什么原因造成这种情况?
回复

使用道具 举报

63

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2015-11-29
在线时间
146 小时
发表于 2017-9-8 10:32:52 | 显示全部楼层
一起哈皮 发表于 2017-9-8 09:08
我上面这样设置屏蔽滤波器uint16_t mask = 0xFFFF;就是设置为完全匹配才能接收,但不匹配的也能进接收中 ...

设置两个过滤器组,我设置的两个过滤器组,接收两个ID返还自己的ID值加数据是可以的
CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
                #if ID_EXT_En//扩展帧滤波器全部匹配
                CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)0x0013<<3)&0xFFFF0000)>>16;
    CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x0013<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;//0x0000;//
    CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;//0x0000;//

                CAN_FilterInitStructure.CAN_FilterNumber=1;          //过滤器1
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
                #if ID_EXT_En//扩展帧滤波器全部匹配
                CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)0x0014<<3)&0xFFFF0000)>>16;
    CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x0014<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;//0x0000;//
    CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;//0x0000;//
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 00:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表