1.基本概念
CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。
CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
CAN总线的特点:
总线是一组能为多个部件分时共享的公共信息传送线路。
共享是指总线上可以挂接多个部件,各个部件之间互相交换的信息都可以通过这组线路分时共享。分时是指同一时刻只允许有一个部件总线发送信息,如果系统中有多个部件,则它们只能分时地向总线发送信息。
CAN总线的构成:
CAN总线由1个控制器,1个收发器,2个数据传输终端和2条传输线构成。
-
CAN控制器:接收在控制单元中的微处理器中的数据,处理数据并传给CAN收发器。同时,控制器接收收发器的数据,处理并传给微处理器。
-
CAN收发器:是一个发送器和接收器的组合。它将CAN控制器提供的数据转化为电信号并通过数据线发送出去。同时,它接收数据,并将数据传到CAN控制器。
-
数据传输终端:是一个电阻。阻止数据在传输终了被反射回来并发生反射波,这将破坏数据。
-
数据传输线:用以传输数据的双向数据线。分为CAN高位数据线和CAN低位数据线。
每个控制器都集成了微处理器、CAN控制器、CAN收发器。它们又被称作CAN网络节点。数据传输线有双绞线、同轴电缆或光纤。车辆多使用双绞线。
双绞线的作用是使外部干扰在两根导线上产生的噪声(在专业领域里,把无用的信号叫做噪声)相同,以便后续的差分电路提取出有用信号,差分电路是一个减法电路,两个输入端同相的信号(共模信号)相互抵消(m-n),反相的信号相当于x-(-y),得到增强。理论上,在双绞线及差分电路中m=n,x=y,相当于干扰信号被完全消除,有用信号加倍,但在实际运行中是有一定差异的。
简单来说就是消除共模干扰。
CAN总线的基本工作原理
跟其他总线一样,CAN总线的通信也是通过一种类似于“会议”的机制实现的,只不过会议的过程并不是由一方(节点)主导,而是,每一个会议参加人员都可以自由的提出会议议题(多主通信模式),二者对应关系如下:
1、多个控制单元以并联方式经收发器与总线连接。
2、每个控制单元都有权向总线发送信息(多主处理器结构)。
3、同一时刻只有一个控制单元向总线发送信息。其它的控制单元接收信息,其中一些控制单元对这些数据感兴趣并采用这些数据,而另一些控制单元则可能不理会这些数据。
CAN被细分为三个层次:
(1)CAN对象层(the object layer);
(2)CAN传输层(the transfer layer);
(3)CAN物理层(the phyical layer);
对象层和传输层包括所有由ISO/OSI模型定义的数据链路层的服务和功能。
对象层的作用范围包括:
(1)查找被发送的报文。
(2)确定由实际要使用的传输层接收哪一个报文。(即选择报文对象)
(3)为应用层相关硬件提供接口
传输层的作用主要是:
(1)传送规则,也就是控制帧结构、执行仲裁、错误检测、出错标定、故障界定。
(2)总线上什么时候开始发送新报文及什么时候开始接收报文,均在传输层里确定。
(3)位定时的一些普通功能也可以看作是传输层的一部分。
(4)传输层的修改是受到限制的。
物理层的作用:
在不同节点之间根据所有的电气属性进行位信息的实际传输。当然,同一网络内,物理层对于所有的节点必须是相同的。尽管如此,在选择物理层方面还是很自由的。
CAN具有以下的属性:
(1)报文(Messages):简单来说就是具有固定格式的数据包。
(2)信息路由(Information Routing):即,报文寻找结点的方式。
(3)位速率(Bit rate):数据位的传输速度。
(4)优先权(Priorities):即报文发送的优先权。
(5)远程数据请求(Remote Data Request):通过发送远程帧,需要数据的节点可以请求另一节点发送相应的数据帧。
(6)多主机(Multimaster):总线空闲时,任何结点都可以开始传送报文。
(7)仲裁(Arbitration):当2个及以上的单元同时开始传送报文,那么就会有总线访问冲突。仲裁是确定哪个单元的具有发送优先权。
(8)安全性(Safety):CAN的每一个节点均采取了强有力的措施以进行错误检测、错误标定及错误自检。
(9)错误检测(Error Detection):包括监视、循环冗余检查、位填充、报文格式检查。
(10)错误检测的执行(Performance of Error Detection)
(11)错误标定和恢复时间(Error Sinalling and Recovery Time):任何检测到错误的结点会标志出已损坏的报文。此报文会失效并将自动地开始重新传送。如果不再出现新的错误,从检测到错误到下一报文的传送开始为止,恢复时间最多为29个位的时间。
(12)故障界定(Fault Confinement):CAN结点能够把永久故障和短暂扰动区分开来。永久故障的结点会被关闭。
(13)连接(Connections):CAN串行通讯链路是可以连接许多结点的总线。理论上,可连接无数多的结点。但由于实际上受延迟时间或者总线线路上电气负载的影响,连接结点的数量是有限的。
(14)单通道(Single Channel):总线是由单一进行双向位信号传送的通道组成。
(15)总线值(Bus value):总线可以具有两种互补的逻辑值之一:“显性”(可表示为逻辑0)或“隐性”(可表示为逻辑1)。
(16)应答(Acknowledgment):所有的接收器检查报文的连贯性。对于连贯的报文,接收器应答;对于不连贯的报文,接收器作出标志。
(17) 睡眠模式/唤醒(Sleep Mode / Wake-up):为了减少系统电源的功率消耗,可以将CAN器件设为睡眠模式以便停止内部活动及断开与总线驱动器的连接。CAN器件可由总线激活,或系统内部状态而被唤醒。
物理层
CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。我们来看一个示意图
2.组网
3.协议
报文的种类
CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。
报文的种类
在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。
为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如表
数据帧的结构
数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,见图
数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。
4.抓包与解析
报文解析说明
1、一般情况下,一条报文消息包含8个字节的数据,共64位。
比如上图第一行中,ID为0x18FFC5A9的消息数据是:05 00 01 09 00 00 00 08,数据格式是16进制数,从左到右是第一个字节到第八个字节,也有称为每0个字节到第7个字节的。
2、8个字节数据的布局图如下:每一行代表一个字节,每个单元格代表一个位。第一个字节包含bit0bit7,第二个字节包含bit8bit15,依此类推。
3、比如第一个字节数据0x05,转换到布局图上的值是下图:
4、当一个信号的数据比较大时,超过8位,这就出现了跨字节的情况,这时就存在两种数据方向的类型。一种叫Intel格式,另一种叫做Motorola格式。
(1)Intel格式
假设上面举例中:05 00 01 09 00 00 00 08的第三、第四字节代表的是转速数据,格式是Intel格式,分辨率是1,偏移量是0。
数据的解码计算方法:实际值 = 数字量分辨率 + 偏移量
数字量:报文中的实际数值,一般要转换成十进制数;
分辨率:单位数值代表的实际值;
偏移量:数值为0时的实际值;
本例中:十六进制数字量即为0x0901,转换成十进制数是2305,所以转速 = 23051+0=2305。数据按位排列如下图所示:
(2)Motorola格式
Motorola格式的数据方向与Intel格式相反,如下图:
同样为上述数据,十六进制数字量变为0x0109,转换成10进制数是265,所以转速 = 265*1+0=265。
由以上两图可以看出,如果信号在同一个字节内,两种格式的方向是一样的。
https://blog.youkuaiyun.com/weixin_40674822/article/details/127231223
参考: