1.什么是CAN总线
控制器局域网(Controller Area Network,简称CAN或者CAN bus) 是一种功能丰富的车用总线标准。 被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。 它基于消息传递协议,设计之初在车辆上采用复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。
传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。近些年来,CAN控制器价格越来越低。
(1)优点:
低成本:ECUs通过单个CAN接口进行通信,布线成本低。
高集成:CAN总线系统允许在所有ECUs上进行集中错误诊断和配置。
可靠性:该系统对子系统的故障和电磁干扰具有很强的鲁棒性,是汽车控制系统的理想选择。
高效率:可以通过id对消息进行优先级排序,以便最高优先级的id不被中断。
灵活性:每个ECU包含一个用于CAN总线收发芯片,随意添加CAN总线节点。
(2)总线拓扑:
为什么要接120R电阻:CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。
(3)收发器:
CAN收发器的作用是负责逻辑电平和信号电平之间的转换。即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换为差分信号输出到CAN总线上,CAN总线上的节点都可以决定自己是否需要总线上的数据。
(1)电平特性:
CAN2.0B规范定义了两种互补的逻辑数值:显性和隐性。同时传送显性和隐性位时,总线呈现显性状态;同时传送显性状态位时,总线呈现显性状态;同时传送隐性状态位时,总线呈现隐性状态。显性数值表示逻辑0,隐性数值表示逻辑1。
典型地,CAN总线为隐性(逻辑1)时,CAN_H和CAN_L的电平都为2.5V(电位差为0V);CAN总线为显性(逻辑0)时,CAN_H和CAN_L电平分别为3.5V和1.5V(电位差为2.0V)。
(2)数据帧和报文:
一,数据帧由 7 个不同位场组成(帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结尾)。
这里的位场,就是不同位的组合,这名字起的很烂,让人看了感觉很抽象。我们来看看这些个不同的位场吧。一开始是一位帧起始,也叫SOF。它用显性位表示,也就是0;它告诉我们,两个线上有电压差了,也就是有数据了。
这个帧起始看起来只有一位,其实不简单了。为了让所有的分站都同步于发送报文的发送站,好接收数据,有很多要考虑的地方。
然后下一个场是仲裁场。这个仲裁很抽象,其实在这里就是为了解决一个问题。如果2 个或2 个以上的单元同时开始传送报文,那么就会有总线访问冲突,那么仲裁机制就是用来根据标识符优先级来一个一个的去掉低级别的数据。我们可以详细的描述这场生动的争抢总线的战斗。
当总线处于空闲状态时呈隐性电平,此时任何节点都可以向总线发送显性电平作为帧的开始。2 个或2 个以上的节点同时发送开始争抢总线,但是总线只能被一个人抢走。这时候到底怎么决定谁留下,谁滚蛋呢。我们开始思索,我们以前定义了标识符,标识符有优先级,它越小,它优先级越高。那么怎么实现的呢。看下面图:
首先搞明白两点,
一、下图中, 低波形代表0(显性),高波形代表1(隐性);
二、当隐性碰到显性,就变为显性。
如图所示,节点 A 和节点B 的标识符的第10、9、8 位电平相同,因此两个节点侦听到的信息和它们发出的信息相同。第7位节点B发出一个“1”,但从节点上接收到的消息却是“0”。
为什么呢,因为A 节点同时发出显性位,让总线也变成显性了,也就是0。节点B 会退出发送处于单纯监听方式而不发送数据;节点A 成功发送仲裁位从而获得总线的控制权,继而发送全部消息。
总线中的信号持续跟踪最后获得总线控制权发出的报文,本例中节点A的报文将被跟踪。这种非破坏性位仲裁方法的优点在于,在网络最终确定哪个节点被传送前,报文的起始部分已经在网络中传输了,因此具有高优先级的节点的数据传输没有任何延时。
在获得总线控制权的节点发送数据过程中,其他节点成为报文的接收节点,并且不会在总线再次空闲之前发送报文,在这逐位的比较中,最终节点B 因为第七位的偏差丢掉了总线。从此单纯监听,江山就拱手让给了节点A 了。这就是仲裁机制
上面我们说过,报文有两种格式,标准和扩展。这里,不同的格式仲裁场是不一样的。标准格式下,仲裁场由11 位识别符和RTR 位组成。
但在扩展格式里,包括29 位识别符、SRR 位、IDE 位、RTR 位。
RTR 位,Remote Tranmission Request BIT 全称为远程发送请求位。它在数据帧里必须为显性0 ,但在远程帧里为隐性1。
我晕,为什么这么搞呢,不急,先留着这个问题。
SRR 位,替代远程请求位,SRR 是一隐性位,也就是1,它在扩展格式的标准帧RTR 位位置,那么标准帧怪不得优先于扩展帧了,因为在传输完11 位标识符之后(扩展帧的后18 位在最后发送,先发送11 位标识符),轮到标准帧的RTR 位和扩展帧的SRR 位了。
这时候,标准帧的RTR 为显性,而扩展帧SRR 为隐性,这样,总线自然就被标准帧占据。
同时上面那个问题,也一目了然了,CAN 总线协议设计者,肯定是设计了数据帧优先于远程帧。所以IDE(Identifier Extension Bit),全称识别符扩展位,它属于扩展格式的仲裁场
对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。标准格式的IDE位为“显性”,而扩展格式的IDE
控制场
控制场由6个位组成,标准格式和扩展格式的控制场格式不同。标准格式里的帧包括数据长度代码、IDE位(为显性位)及保留位r0。扩展格式里的帧包括数据长度代码和两个保留位:r1和r0。其保留位必须发送为显性,但是接收器认可“显性”和“隐性”位的任何组合。其结构如图所示:
控制场结构
数据长度代码(标准格式以及扩展格式)DLC,如下表所示:
3.应用场景
4.硬件电路及测试方法:
(1)典型电路:
(2)检测发送波形:
(3)检测接收波形:
(4)检测CAN总线上的波形:
上面测试均未发现故障。