最近在学习CAN通讯,花费好多时间搜索资料,网络上大多数资料都是泛泛而谈,或者只是将CAN标准的文字罗列出来,看起来不够直观。不过,也找到了一些写的很好的资料,我将这些资料中对CAN知识点描述比较好的部分汇总起来并在某些地方添加一些例子,方便大家阅读,省去大家搜索查找各种文献的时间,提高效率。
1.什么是CAN
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO 国际标准化的串行通信协议。它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11898-1/ISO11519-2),是国际上应用最广泛的现场总线之一[1]。
CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。由于它具有的高可靠性和良好的错误检测能力而受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境[1]。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议[2]。
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面[2]。图 1 是车载网络的构想示意图。该车型有4个CAN网络构成,分别是传动CAN网段、混动CAN网段、车身CAN网段、和底盘CAN网段。
图1车载网络示意图
2. CAN网络协议
2.1 CAN协议与OSI模型
国际标准化组织ISO提出了一套网络体系结构模型,称为开放系统互联参考模型(Open Systems Interconnection,简称OSI),CAN协议也是基于该模型打造出来的。首先,来回顾一下ISO的OSI模型,见表1。
表1 OSI模型
ISO/OSI 基本参照模型 |
各层定义的主要项目 |
软件控制 |
7 层:应用层 |
由实际应用程序提供可利用的服务。 |
6 层:表示层 |
进行数据表现形式的转换。
如:文字设定、数据压缩、加密等的控制
|
5 层:会话层 |
为建立会话式的通信,控制数据正确地接收和发送。 |
4 层:传输层 |
控制数据传输的顺序、传送错误的恢复等,保证通信的品质。如:错误修正、再传输控制。 |
3 层:网络层 |
进行数据传送的路由选择或中继。
如:单元间的数据交换、地址管理。
|
硬件控制 |
2 层:数据链路层 |
将物理层收到的信号(位序列)组成有意义的数据,提供传输错误控制等数据传输控制流程。
如:访问的方法、数据的形式。
通信方式、连接控制方式、同步方式、检错方式。
应答方式、通信方式、包(帧)的构成。
位的调制方式(包括位时序条件)。
|
1 层:物理层 |
规定了通信时使用的电缆、连接器等的媒体、电气信号规格等,以实现设备间的信号传送。
如:信号电平、收发器、电缆、连接器等的形态。
|
CAN 协议只涵盖了 ISO 规定的 OSI基本参照模型中的传输层、数据链路层及物理层。数据链路层可以分为2个子层:LLC : Logical LinkControl (逻辑链路控制层)和MAC : Medium Access Control (媒介访问控制层)。CAN网络协议与ISO的OSI模型的对照如图2所示[2]。
![d34a530ab4ea105a74cb9e89d0dc52db.png](https://img-blog.csdnimg.cn/img_convert/d34a530ab4ea105a74cb9e89d0dc52db.png)
图2 CAN协议与OSI对照图(图片来自参考文献2)
数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行。
2.2 博世CAN协议与ISO相应标准
前面曾提到CAN通讯最早是由博世公司提出的,最终发展成为ISO标准。博世发布的CAN2.0规范分为A和B两个部分,A 部分是对CAN 的报文格式说明,B 部分是对标准格式和扩展格式的说明。为了兼容CAN2.0,要求CAN 的仪器应兼容A 部分或B 部分。博世公司的CAN协议规范英文版可以在附录中给出的网址下载,其中文翻译版由周立功公司提供,可以在相应网站下载。
CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同[2]。
(1) 关于 ISO11898-1
ISO11898 是通信速度为 125kbps-1Mbps 的 CAN 高速通信标准。
目前,ISO11898 追加新规约后,成为 ISO11898-1 新标准。
(2) 关于 ISO11519-2
ISO11519 是通信速度为 125kbps 以下的 CAN 低速通信标准。
ISO11519-2 是 ISO11519-1 追加新规约后的版本[2]。
图 3表示 CAN 协议和 ISO11898 及 ISO11519-2 标准的范围。
![49e655e33505aed1469d4fb0fbc30359.png](https://img-blog.csdnimg.cn/img_convert/49e655e33505aed1469d4fb0fbc30359.png)
图3 CAN 协议和 ISO11898 及 ISO11519-2 标准(图片来自参考文献2)
2.3 CAN协议物理层
与I2C、SPI等具有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。 CAN物理层的形式主要分为闭环总线(ISO11898)及开环总线网络(ISO11519-2)两种,一个适合于高速通讯,一个适合于远距离通讯。接下来将讨论两者在物理层的主要区别[1]。
下图4给出了CAN总线两种形式的连接图,后续将分别进行介绍。图中总线端部均有负载电阻RL,这些电阻用来抑制反射作用。一般不要把RL置于ECU内部,因为这样的话,断开一个内部置有RL的ECU同总线的链接时,总线就会失去终端[3]。
![d07f883f09139f56f793ea7a794272ae.png](https://img-blog.csdnimg.cn/img_convert/d07f883f09139f56f793ea7a794272ae.png)
图4 CAN 总线及节点连接(图片来自参考文献2)
下图5给出了CAN网络的通信速度与总线长度的关系曲线
![aefa028bd03caf0cbc74c3397e6dca2d.png](https://img-blog.csdnimg.cn/img_convert/aefa028bd03caf0cbc74c3397e6dca2d.png)
图5通信速度和最大总线长度(图片来自参考文献2)
2.3.1 闭环总线网络
CAN闭环通讯网络是一种遵循ISO11898标准的高速、短距离网络,它的总线最大长度为40m,通信速度最高为1Mbps,总线的两端各要求有一个“120欧”的电阻,如图6所示。
![b526322d6de0b55fa4bd7cf89d8dcc7d.png](https://img-blog.csdnimg.cn/img_convert/b526322d6de0b55fa4bd7cf89d8dcc7d.png)
图6 CAN闭环总线通讯网络(图片来自参考文献1)
2.3.2 开环总线网络
CAN开环总线网络是遵循ISO11519-2标准的低速、远距离网络,它的最大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻。
![ec82e7b39fcf2fd6b24a8f9842e1d24d.png](https://img-blog.csdnimg.cn/img_convert/ec82e7b39fcf2fd6b24a8f9842e1d24d.png)
图7 CAN开环总线通讯网络(图片来自参考文献1)
2.3.3 CAN协议中的差分信号
CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于CAN通讯协议不对节点进行地址编码,而是对数据内容进行编码,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载[1]。
CAN通讯节点由一个CAN控制器及CAN收发器组成,控制器与收发器之间通过CAN_Tx及CAN_Rx信号线相连,收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。其中CAN_Tx及CAN_Rx使用普通的类似TTL逻辑信号,而CAN_High及CAN_Low是一对差分信号线,使用比较特别的差分信号[1]。
当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的CAN_High及CAN_Low信号转化成普通的逻辑电平信号,通过CAN_Rx输出到控制器中[1]。
那问题来了,什么是差分信号?图8给出了模电中差模信号的标示方法。差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑0和逻辑1[1]。
![8300fcea6b67ada2a4ab767601e56b9f.png](https://img-blog.csdnimg.cn/img_convert/8300fcea6b67ada2a4ab767601e56b9f.png)
图8 差模信号
为什么选择差分信号,差分信号有什么优点呢?
相对于单信号线传输的方式,使用差分信号传输具有如下优点[1]: