OpenEdv-开源电子网

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

stm32 CAN 过滤器配置问题

[复制链接]

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
发表于 2017-6-8 17:33:52 | 显示全部楼层 |阅读模式
1金钱
        STM32 用CAN总线时,如果有多个主机向我发送数据,并且他们发送时CAN ID相同,这样会不会有问题?虽然我也能正确收到所有主机数据,如果多主机同时发送数据时,是不是CAN总线仲裁就不起作用了?
       
// 我自己的过滤器配置如下:
void CAN_Filter_Config(void)
{
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
       
        CAN_FilterInitStructure.CAN_FilterNumber = 0;               
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

        CAN_FilterInitStructure.CAN_FilterIdHigh = (((uint32_t)MYID<<3)& 0xFFFF0000)>>16;                                                                // 其中MYID = 0001
        CAN_FilterInitStructure.CAN_FilterIdLow = (((uint32_t)MYID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; // 其中CAN_ID_EXT = 0x00000004, CAN_RTR_DATA = 0x00000000
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;                                                               
          CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;                                                                       

        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;       
       
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                                                               
        CAN_FilterInit(&CAN_FilterInitStructure);

        CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);                                       
        CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);                                       
}



// 多个主机发送端CAN ID值相同。如下:
void CANTransmitFrame()
       
        TxMessage.ExtId = SendID;                 // 0x0001
        TxMessage.IDE = CAN_ID_EXT;         // 0x00000004
        TxMessage.RTR = CAN_RTR_DATA; // 0x00000000
        TxMessage.DLC = 8;
        for(i=0;i<8;i++){
                TxMessage.Data[i]=ucFrameBuf[i];
        }
        transmailbox =        CAN_Transmit(CAN1,&TxMessage);
       
        .....................以下省略
       
}
       

最佳答案

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

仲裁机制保证了必定只有一个主机给你发来数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-6-8 17:33:53 | 显示全部楼层
仲裁机制保证了必定只有一个主机给你发来数据。
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2017-6-9 10:48:51 | 显示全部楼层
我的意思是,现在有多个主机用相同 CAN ID (发送时用的ExtId,IDE、 RTR 相同),这样多主机同时发送数据总线还能正确仲裁吗?总线仲裁不是根据CAN ID仲裁的吗? 我用的是扩展帧CAN ID是29位的
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-6-8
在线时间
35 小时
 楼主| 发表于 2017-6-9 11:49:30 | 显示全部楼层
正点原子 发表于 2017-6-8 17:33
仲裁机制保证了必定只有一个主机给你发来数据。

首先谢谢原子哥的解答,但还有不明啊 :
我的意思是,现在有多个主机用相同 CAN ID (发送时用的ExtId,IDE、 RTR 相同),这样多主机同时发送数据时,总线还能正确仲裁吗?总线仲裁不是根据CAN ID仲裁的吗? 如果CAN ID相同又怎么仲裁呢。我用的是扩展帧CAN ID是29位的
回复

使用道具 举报

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
发表于 2017-7-8 11:47:38 | 显示全部楼层
hanchaoman 发表于 2017-6-9 11:49
首先谢谢原子哥的解答,但还有不明啊 :
我的意思是,现在有多个主机用相同 CAN ID (发送时用的ExtId, ...

在一个CAN 网络里面,一个ID 只能被一个节点发出,不能几个节点发送一个ID  ,不然会出现问题的!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 01:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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