OpenEdv-开源电子网

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

CAN总线一主机对多从机通讯的疑问?

[复制链接]

127

主题

207

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1077
金钱
1077
注册时间
2017-9-11
在线时间
105 小时
发表于 2018-7-7 15:37:49 | 显示全部楼层 |阅读模式
1金钱
小白对CAN总线不怎么了解。项目里有1个主机4个从机。从机可以通过设置过滤器只接收主机发的信息,主机能分辨出是哪个从机发的信息吗?接收的信息里含有从机的发送ID吗?

最佳答案

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

读出的是FIFO最新的帧的Id,不要理解成发送方或者是接收方的Id,它是由发送方设定的,但是不要理解成是发送方的Id...同一个发送方可以使用不同的Id(比如DLC相同时利用StdId来区分数据含义),同一个Id也可以被多个你所认为的“接收方”所接收到,建议细细理解一下CAN协议
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
发表于 2018-7-7 15:37:50 | 显示全部楼层
huyuezhan 发表于 2018-7-7 20:08
如果从CAN1_Handler.pRxMsg->StdId里能读出信息,读出来的是本机的还是发送方的ID?

读出的是FIFO最新的帧的Id,不要理解成发送方或者是接收方的Id,它是由发送方设定的,但是不要理解成是发送方的Id...同一个发送方可以使用不同的Id(比如DLC相同时利用StdId来区分数据含义),同一个Id也可以被多个你所认为的“接收方”所接收到,建议细细理解一下CAN协议
回复

使用道具 举报

127

主题

207

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1077
金钱
1077
注册时间
2017-9-11
在线时间
105 小时
 楼主| 发表于 2018-7-7 15:46:04 | 显示全部楼层
本帖最后由 huyuezhan 于 2018-7-7 15:49 编辑

比如:
主机过滤器ID列表0x11,0x12,0x13,0x14,向从机发ID是0x15,0x16,0x17,0x18的信息。
四个从机过滤器ID列表分别是0x15,0x16,0x17,0x18,分别向主机发ID是0x11,0x12,0x13,0x14的信息。
这样主机接收的数据能分出是哪个从机发的吗?
回复

使用道具 举报

127

主题

207

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1077
金钱
1077
注册时间
2017-9-11
在线时间
105 小时
 楼主| 发表于 2018-7-7 16:06:18 | 显示全部楼层
本帖最后由 huyuezhan 于 2018-7-7 20:07 编辑

u8 CAN1_Receive_Msg(u8 *buf)
{                                      
    u32 i;
    if(HAL_CAN_Receive(&CAN1_Handler,CAN_FIFO0,0)!=HAL_OK) return 0;//接收数据,超时时间设置为0        
    for(i=0;i<CAN1_Handler.pRxMsg->DLC;i++)
    buf=CAN1_Handler.pRxMsg->Data;
    return CAN1_Handler.pRxMsg->DLC;        
}
例程的这一段就是把接收的数据存到数组里,没有涉及到发送方的ID。是不是可以加一段话从CAN1_Handler.pRxMsg->StdId 里读出来?
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-7-7 16:56:23 | 显示全部楼层
接收的信息里就保护ID信息
一分耕耘一分收获。
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
发表于 2018-7-7 19:52:03 | 显示全部楼层
1.CAN总线在硬件上没有主从之分,各节点除了ID导致的总线竞争优先级外无差别
2.CAN_TxMsg和CAN_RxMsg中,StdId为其不可或缺的组成部分——但是这个Id是通过软件设置的,可以修改,可以代表发送方的Id,也可以是接收方的Id(远程帧),由滤波器决定能否接受,由中断服务函数决定如何处理
接收信息中,CAN_RxMsg -> StdId就是ID
回复

使用道具 举报

127

主题

207

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1077
金钱
1077
注册时间
2017-9-11
在线时间
105 小时
 楼主| 发表于 2018-7-7 20:08:28 | 显示全部楼层
HexAI 发表于 2018-7-7 19:52
1.CAN总线在硬件上没有主从之分,各节点除了ID导致的总线竞争优先级外无差别
2.CAN_TxMsg和CAN_RxMsg中,S ...

如果从CAN1_Handler.pRxMsg->StdId里能读出信息,读出来的是本机的还是发送方的ID?
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-9-4
在线时间
25 小时
发表于 2018-7-8 14:00:55 | 显示全部楼层
你可了解CAN在汽车电子中的应用,使用扩展帧PDU格式就能解决你的问题,帧头中就包含了自己的地址和接收方的地址,CAN总线自己会仲裁的,能确保不会产生总线冲突,你发的消息肯定会被别人收到。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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