一、CAN总线
CAN (Controller Area Network),即控制器局域网,1986年由德国BOSCH公司提出,用以解决汽车技术问题,后被广泛应用于汽车和工业自动化等领域。CAN技术规范2.0A 、2.0B以及ISO11898国际标准是设计汽车高速网络系统的基本依据和规范。 同样作为串行通讯技术,CAN总线相比RS232/RS485协议更加规范,速率更快,最高通信速率1Mbps(该速率最远通信距离可达40m)。
1.1 计算机网络层次结构模型
学习CAN 总线前需要先了解下计算机网络的层级结构,ISO提出了OSI(Open Systems Interconnection Reference Model),这个模型定义了如下内容:
(1) 单个网络节点有7层框架,如下图1。
图1 OSI模型及CAN网络
看到这,相信很多人和我一样,一下明白了,原来平时人们常说的这个层那个层就是指的OSI结构的层次。7层中,物理层(physical layer)、数据链路层(Data-link layer)和网络层(Network layer)通常被称作底层。
(2)多个节点时,不同节点有相同的层次,相同层次要有相同的功能,同一节点的相邻层有接口通信,每层使用下层服务并向上层提供服务。
(3)不同节点同层按照协议完成通信。
1.2 CAN-Bus系统物理组成
CAN总线可以将多个电子控制单元(ECU)连接在同一局域网内,实现各个ECU间的信息共享。如图1中所示,CAN网络结构符合OSI的层模型,而其物理结构组成如图2。
图2 CAN网络物理结构
系统主要由两根物理线缆、若干MCU、CAN控制器和CAN收发器组成。CAN收发器通常单独做成芯片,CAN控制器可以集成在ECU中也可以单独做成芯片,独立的CAN控制器可以和多种ECU连接,使用灵活方便。CAN网络的每个节点都可以是主机,且通信时不采用寻址方式(节点数量不受地址数目限制,但受总线负载能力限制),只要总线空闲,任意节点都可以向总线上广播消息。它和我们平时听过的I2C,uart通信一样都属于串行通信技术,I2C(芯片间短距离通信)两根线,一根数据线,一根时钟线;UART两根线,一根收信号,一根发信号。I2C和UART的特点是使用一根线就可以传输0 1 0 1的高低电平信号。但CAN通信和它们不同, 每一个逻辑0 或1都需要由两根线共同协作实现,即通过差分信号电路对两根线上的电压作差,根据差值确定逻辑信号是0还是1。这种通信方式可以提高信号的抗干扰能力。
1.3 CAN报文种类/帧类型
我们人与人交流时的语言有多种类型,例如通知类:“今天下午2点钟所有人在会议室集合“,询问类:“会议室钥匙在谁那里,请告知”等等,CAN通信类似,也定义了4种类型的帧来实现不同的功能:
(1) 数据帧
节点向外发送数据时使用该类型报文,比较基本和普遍的的一种帧类型
(2) 遥控帧/远程帧
所谓远程或遥控的意思就是节点向远处请求数据时使用的帧类型,例如某个节点A作为接收端想知道发动机水温,它就发送一个请求帧,询问。
(3) 错误帧
数据帧发送后,接收端接收后进行校验,校验后得到的校验码不对,接收错误,此时接收端发送错误类型报文,要求重新发送。
(4) 过载帧
通知远端节点,接收端没有做好接收准备,用于在数据帧或远程帧间增加附加延时。
1.4 CAN报文的结构
我们知道计算机通信时实际传输的就是0 1 0 1的高底电平,而人为的约定可以赋予这些数字组合以实际的意义,所以要传递具体的消息,就必须对传输的数据规定一下结构,或者说是格式。CAN 的数据帧有两种格式:CAN 2.0A标准帧和CAN 2.0B 扩展帧。标准帧结构如图3。
图3 CAN标准帧结构
每一帧数据自左向右依次为帧起始、仲裁段、控制段、数据段、校验段应答段和帧结束。
二、 SAE J1939协议
J1939协议是一种典型的应用协议,使用了CAN网络国际标准(ISO 11998-1 和 ISO 11998-2)的物理层,主要用于解决商用车的通信问题,除了J1939协议,常见的还有CANOpen和DeviceNet等。
J1939所拥有的特点包括:
(1) 该协议规定通信数据采用扩展帧格式。
(2) 在应用层定义了参数组
(3) 支持用户特定参数组
(4) 诊断功能
(5) 点对点的广播通信
Tips:扩展帧相比标准帧而言增加了18位的标识符,因此,它具有更强的信息表达功能,参与1939协议通信的所有ECU都需要有一个唯一的名字(64位数据,动态地址分配时用于确认优先级),同时每个节点还分配有一个唯一的地址(8位数据)。
J1939基于OSI模型对网络的各层有相应的定义和规范,并发布了一些列规范文档,官方文档命名规则如图4:
图4 文档命名规则
例如:
SAE J1939/21 :数据链路层文档,定义信息帧数据结构,编码规则等。
SAE J1939/71 :应用层文档,定义了一系列以协议数据单元(PDU-Protocol Data Unit)形式存在的物理参数和消息。
2.1 SAE J1939通信过程与原理
(1)信息识别方法
OSI模型中,越靠近上层,信息的处理方式越与人有关,当节点A向节点B发送数据时,消息由A节点应用层向下传到物理层,通过电路传给B节点物理层,再由B节点物理层传递到B节点的应用层,这样,我们用CAN工具测量时,便可以得到我们可以识别的消息。
现在有一个问题。
一个汽车有很多电子控制单元,车门、发动机、变速器、ABS等等,每个电子控制单元内又包含很多传感器,由于CAN通信不存在分配的片上物理地址,当总线上有报文的时候我们如何能知道这个报文的来源以及其包含的信息含义呢?
为了解决这个问题,J1939应用层文件需要提前对被控/被测量对象做出各种定义,应用层将各个物理参数分组管理,根据某些特性将一部分参数编成一个组,并给这个组一个编号。这样就有了参数组编号的定义。
PG--Parameter Group: A set of parameters belongs to the same topic and sharing the same transmission rate.
PGN--Parameter Group Number: Each PG is addressed via a unique number-the PGN.
Tips: 一帧数据通过ID优先级对比上了总线后,根据源地址(1939网络管理层要求每个节点需要有一个8位的地址编码)可以确定它来自哪个ECU,然后根据对比PGN定义进一步锁定信息的参数来源,从而得知数据域中数据的具体含义。
(2)扩展帧的报文结构
大致了解了PGN后再来看看帧的结构,如图5。
图5 扩展帧结构
扩展帧的ID位有29位,PDU对各个位的定义如下:
P:Priority 3个bit,用于判断报文的优先级;
R:Reserved 保留位,1个bit, 便于以后扩展;
DP: Data Page,页码,页码0中参数排满后在页码1继续排;
PF:PDU Format ;
PS:PDU Specific;
SA: Source Address(网络中一个特定的源地址只能匹配一个设备)。
TIPS:PDU指的就是协议数据单元,由ID和数据域两部分构成。
ID中的R、DP、PF、PS共18位是PGN的来源,PGN共24个Bit,其余6位置零。如图6.
图6 PGN构成
PF共8位,0-255,当PF<240时,说明是点对点通信,向特定目标通信,这时PS用于表示目标地址,不用于构成PGN,PGN后8位补0。当PF>=240时,采用广播式通信,这时PS用于构成PGN。以上可以知道,一个数据页码DP内共有PGN的个数为
(),其中240+(16∗256)=4336,其中28=256240+(16*256)=4336, 其中2^8=256
举个例子:从应用层文档定义来看PGN 37376
图7 PGN实例
文档对编号进行了定义,同时可以计算验证,37376就是DP、PF换算过来的,其中十进制146转换成十六进制是92,即0x009200。
我们从这个样例中看到了SPN,这是应用层文档对物理参数或状态做的定义。
SPN—Suspect Parameter Number: SPN is assigned to each parameter of a PG or component. SPN用于诊断目的,可以报告识别控制器程序的异常操作。
注意:集合PGN和集合SPN存在交集但不是相等和包含关系。
(3)通信原理
报文ID中可以获得源地址、目标地址、数据含义、优先级等信息,SRR是扩展帧特有位,没有实际意义,用于占位,为隐性位,IDE位用于区分标准帧和扩展帧,标准帧该位置0,扩展帧置1,RTR位用于区分数据帧和遥控帧的。DLC用于表示传输数据域的数据长度。这些逻辑位值均通过物理层定义的电路完成传输,如图8
图8 CAN物理层数据传输原理
总线上同一时刻只能有一个节点发消息,逻辑0为显性位,逻辑1为隐性位,在所有节点依次按位向总线上发ID时,谁先发出0,谁占领总线,因此说明,优先级数字中,数字越小优先级越高。其它位的数据发送原理相同。
说明:图8为CAN通信收发数据的基本原理图示,图中电路及电阻电压等参数不代表1939网络的实际情况。
以上-------------------------------
声明:尊重原创,严谨抄袭,转载请注明出处!
参考资料:
[2] 李真花,崔健等. CAN总线轻松入门与实践[M],北京航空航天大学出版社,2011.
[3]杨春杰,王曙光等. CAN总线技术[M], 北京航空航天大学出版社,2010.