CAN总线通信机制(3)

在物理线路上由于噪声干扰、信号衰减等原因,在数据传输过程中可能会出现差错,而物理层只负责透明的传输结构的原始比特流,不会进行任何差错的控制。

所以,当需要在线路上传送数据时,除了必须有物理线路之外,还必须有必要的规程来控制这些数据传输。将实现这些规程的硬件和软件加到链路上,就构成了CAN总线的数据链路层。

数据链路层重点关注内容——第一部分:通信机制

1.事件触发广播式通信方式

CAN总线采用广播的形式发送报文,所有连接在总线上的节点都可以收到其他节点发过来的信息。它是一个事件触发的总线类型,一旦有事件发生,对应的节点就会把相应的报文发送到总线上去,连接在总线上的其他的节点都可以读到这帧报文,但这帧报文的数据并不是对所有的节点都有用。

如何判断某个节点需要这帧报文?

这需要对CAN报文最前端的ID部分进行过滤,如果某个节点需要这帧报文的内容,报文就会通过过滤器进入到主机中进行数据的处理,不需要这帧报文的节点就会将它过滤掉。

图片

图1

如图1,在CAN总线上有A、B、C 、D E五个节点,发送端用TX表示,接收端用RX表示,节点C所需要发送的报文信息有0x6BF、0x1A1、0xA0这几帧,当事件触发后,节点C向总线发送0x6BF这一帧报文,这帧报文发出来之后会被节点A B E接收,节点D不接收。这是因为CAN总线上的控制器只会接收和处理自身相关的报文,对于其他报文信息可以监听但不接收。

这样的通信方式也可以写成一个通信矩阵:

图片

图2 

在图2这个表里面可以看到0x6BF是节点C发送的,节点A、B、E接收,节点D不接收。

现在的DBC的文件就是具体地定义通信矩阵,不同的节点接收和发送的相应的报文信息对它的ID做相应的定义。

2.总线访问的机制

当多个节点同时都有事件触发,这些节点都想向总线上发送报文的时候该如何处理?

  • 当总线处于空闲状态,节点可以向总线上发送报文

报文发送,要先知道总线上的节点什么时候可以向总线传输信息,而不是有事件触发想发就发。需要先检测总线的状态,只有当总线处于空闲的时候,节点才能发送报文。

如何判断总线是否处于空闲状态?

当总线上出现连续的11个逻辑1的数据流,总线是空闲的,这个时候所有的控制器都可以向总线上发送报文,控制器会将总线电平拉为逻辑0,接着传输对应的ID(ID对应每一个节点的每一帧报文)。

  • 仲裁机制决定报文发送优先顺序

如果多个节点同时都有事件触发,同时想向总线上发送报文的时候,谁先发送?

这就需要总线访问中的仲裁机制来确定谁先发,在仲裁结束之后只有一帧报文获得向总线发送的权限能把信息发送出去。

线“与”机制

CAN总线上传输的显性位0和隐性位1两种逻辑电平状态。

  • 显性位可以覆盖隐性位

  • 只有所有的节点都发送隐性位,总线上才处于隐性状态

当A 、B 、C三个节点同时向总线上发送相应的报文,除了帧起始的位,最先出现在总线上的是报文的ID,由谁先发送就是通过ID部分来进行仲裁。

ID按照高位在前低位在后的方式进行排列,节点按照排布的顺序进行发送

当所有的节点向总线发送的都是逻辑1,那么逻辑1线与之后依然是1;逻辑0线与之后是0,到了第四位的时候,节点A发送的是逻辑1,而节点B、 C继续发送的是逻辑0。

图片

图3

根据线与原理,显性位可以覆盖隐性位,那么线与之后总线上传输的是逻辑0,这个时候节点A就会停止发送,并由发送模式改为接收模式。

那节点A又是如何知道现在总线上传输的是逻辑的0?

这里要提到总线通信中的另一个机制:

回读机制

每个节点在发送一个位的时候,它都会再去读取总线上的电平,看一下总线上传输的逻辑电平与自己发送的位是否一致,如果一致继续发送,不一致会有相应的处理措施。

在仲裁场中,如果节点发送的是0,而回读的是1,就会出现错误。

根据线与机制,只要有节点发的是0,总线上出现的逻辑电平一定是0。如果节点发送的是1而读取的是0,就会认为当前总线上有一个优先级比他更高的节点正在发送报文,它就会停止当前的发送转为接收模式。

图片

图4

所以节点A会在第4位之后停止发送变成接收节点,而节点B和C继续发送,但到第9位的时候,节点B发送的是逻辑0,而节点C发送的是逻辑1。这个时候节点C将停止发送并且转为接收模式,节点B可以继续发送剩下的报文。

仲裁结束之后就只剩下B这一帧报文在总线上传输。

所以,当有多个节点同时向总线上发送信息的时候,谁先出现逻辑0谁的优先级就会更高一些。

总结

在CAN总线中节点发送报文优先级随ID的大小递减,数字越大越大优先级月底,数字越小优先级越高。

在具体设计的时候,重要的报文比如底盘、安全相关的报文,会将它们的ID设置的比较小,让他们的优先级高一些。而对于诊断、网络管理等相关的报文,会将它的ID值设置的比较大。

CAN总线数据链路层核心内容除了通信机制,还有数据帧、数据保护、同步机制,后期将继续分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值