CAN
1. CAN简介
CAN(controller area network)控制器局域网是用于解决汽车众多控制部件之间的数据交换而开发的一种串行数据通信总线。
其特点有:
- 总线上节点不分主从
- 采用载波监听多路访问(CSMA)、逐位仲裁的非破坏性总线仲裁技术。
- 直接通信距离最远10km,速率5Kb/s
- 通信速率最高可达1Mb/s,距离40m
- 末端要有120欧终端电阻
CAN通讯协议标准(ISO-11898:2003)介绍了设备间信息是如何传递以及符合开放系统互联参考模型(OSI)的哪些分层项。实际CAN通讯是在连接设备的物理介质中进行,物理介质的特性由模型中的物理层定义。ISO11898体系结构定义七层,OSI模型中的最低两层作为数据链路层和物理层,如下图所示:
- LLC用于接收滤波、超载通告、回复管理;
- MAC用于数据封装/拆封、帧编码、媒体访问管理、错误检测与标定、应答、串转发/并转串;
- PLS用于位编码/解码、位定时、同步;
- PMA为收发器特性。
CAN协议主要用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束,该协议的健壮性使其同样适用于自动化和工业环境中。
由于目前在汽车上使用的高速网络系统采用的都是基于CAN总线的标准,特别是广泛使用的ISO 11898国际标准。CAN总线通常采用屏蔽或非屏蔽的双绞线,总线接口能在极其恶劣的环境下工作。根据ISO 11898的标准建议,即使双绞线中有一根断路,或有一根接出其至两根线短接,总线都必须能继续工作。
2.闭环总线网络
CAN通讯是异步通讯,也就是没有时钟信号线来保持信号接收同步,也就是所说的半双工,无法同时发送与接收,在同一时刻,只能有一个节点发送数据,其余节点都只能接收数据。它有CAN_HIGH与CAN_LOW两条信号线组成。这两条线的组合方式也就造成了一下两种情况
这种形式的特点就是 高速 短距离 闭环 最高速度可达1Mbps,最长距离40m.
这种形式的特点就是 传输距离远,开环 最高速度125Kbps,最远距离1km.
3.通信节点
在I2C协议中存在主机与从机,可以挂载多个从机,但是在CAN协议中,我们可以挂载多个 节点 ,通过总线来实现节点通讯,与其他协议不同的是,不对节点的地址进行编码,而是对节点的数据内容进行编码。理论上节点个数不受限制。
节点是由一个 CAN控制器 和一个 CAN收发器 组成
CAN控制器用于将欲收发的消息(报文),转换为符合CAN规范的CAN帧,通过CAN收发器,在CAN-bus上交换信息。
CAN收发器是CAN控制器和物理总线之间的接口,将CAN控制器的逻辑电平转换为CAN总线的差分电平,在两条有差分电压的总线电缆上传输数据。
如果是发送数据:控制器发送一个信号(0或1),收发器将这个信号变成差分信号传送到总线中。
若果是接收数据:收发器将差分信号转化为0或1的二进制编码;
差分信号
差分差分,你品,是不是差,差分信号其实使用CAN_HIGH减去CAN_LOW的到的,在逻辑信号中,5V代表1, 0V代表0,而在差分信号中
0V---------逻辑1------隐形电平 2.0V-------逻辑0-----显性电平
协议层
CAN协议的波特率与位同步
由于CAN通信协议并没有时钟信号线,所以各个节点之间要约定好特定的波特率进行通讯,特别的时候我们还需要使用位同步!
下面介绍一下位时序,所谓位时序,就是一个数据位的时序。我们可以把一个数据位分为四段
SS段: 又叫做同步段,它的作用就是判断节点与总线的时序是否一致,如何判断我们稍后再讲。先留一个疑点。它的长度为1tq,tq就相当于一个时间单位,我们可以规定它的大小,一般tq=1us.
PTS段: 传播时间段,用于补偿网络的延时时间
PBS1,PBS2: 都是用来补偿阶段的误差。
总之这几个段都是用来校验来确保数据传输准确的。
波特率=1000000/19=52631.6bps
两种位同步方式
首先我们需要知道的是,当数据开始传输的时候会有一个帧起始信号,这个帧起始信号会产生一个下降沿(由高变低),正常情况下这个下降沿是在SS段的,如果不在就需要进行同步了
硬同步:
前面已经说过,下降沿要落在SS段,如图,出现这种情况,我们可以将SS段向左平移,让下降沿在SS段内。这种情况有一种限制,就是必须要存在帧起始信号。
重新同步:
这里就只介绍一种情况了,从前往后看,发现第一个下降沿在SS段之后,说明内部时序比总线时序要快2个Tq,所以我们可以在PBS1段增加两个时序,下个位时序就可以保持同步了。
同时这里定义了这个补偿时间叫做SJW,它的含义就是最大补偿值。一般保持在不大不小的状态,小了容易造成误差,大了影响传输速率。
4.CAN报文
所谓的帧就是CAN报文了,接下来给大家介绍一下这几种帧(CAN报文)
帧种类
数据帧
标准数据帧
(1)帧起始:表示数据传输开始的意思,告诉一声数据要来了,他只有一个数据位,并且是显性电平
(2)仲裁段: 这段很重要,CAN通讯协议中不对节点地址分配优先级,而是对信息的重要程度分配优先级。仲裁段的主要内容就是ID信息。这个ID决定信息的优先级。对于重要的信息,我们可以给他一个高的优先级
当同时出现显性电平(0)和隐形电平(1)时,显性电平的优先级高,如图,此时的话,节点1报文就会失去对总线的占有权。
RTR段: 此段用于区分数据帧与远程帧,显性电平表示数据帧,隐形表示远程帧。
(3)控制段: r0,r1为保留位,默认显性,DLC段为数据长度。
(4)数据段: 存储着原始的数据,数据段中最重要的内容。IDE用于区分标准帧与扩展帧 显性为标准帧
(5)CRC段: 表示一个15位的校验码,算出来的校验码和接收到的校验码相同,表示正确,如果出现错位,则会通过错误帧返回,请求重新发送。
(6)CRC界定符: 分界线
(7)ACK段: 与I2C协议相似,表示应答。
(9)帧结束: 表示传输完成。
扩展数据帧
扩展数据帧与标准数据帧差别不算很大。区别如下
仲裁段:先是有11位ID,SSR段与RTR段相同,区分数据帧和远程帧,后面又有18位ID,扩展帧仲裁段的ID共有39位。其他大致相同
5.TP协议
UDS网络层,又称为TP层(Transport Protocol Layer)。
其存在的目的是为了解决ISO 11898协议中定义的经典CAN数据链路层与ISO 14229协议中定义的应用层,彼此之间数据长度不统一的问题。经典CAN数据链路层最大能够支持8个字节,但ISO 14229并不仅仅是为了CAN总线设计的,最大容量达到4095个字节。比如VIN码是17个字节,CAN总线必然需要传递3帧才能传完VIN码,那么如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题。ISO 15765-2 协议由此诞生。
15765-2作为车辆诊断通信的一个组成部分,规范了“传输协议和网络层服务”。
网络层概述
网络层最主要的目的就是把数据转换成能适应CAN总线规范的单一数据帧,从而进行传输。如果将要传输的报文长度超过了CAN数据帧的长度,则需要将报文信息进行拆分后传输,每次至多可以传输4095个字节长度的报文。
所有的网络层服务都具有相同的通用结构。为了定义这种服务,需要定义三种类型的服务原语:
A. 请求服务(Request):用于向网络层传递控制报文信息及要发送的数据,应用于更高层或应用层。如tester向ECU发出数据。
B. 指示服务(Indication):用于向更高层或应用层传递状态信息及接收到的数据,应用于网络层。如ECU收到了tester的数据,传至应用层。具体说来,Indication前端应该执行的是底层传入数据的处理函数,即读取PDU(协议数据单元)信息,这一帧具体是SF、FC、CF还是FF。若满足条件,继续向上,即应用层传递。
C. 确认服务(Confirm):被网络层使用,用于向更高层或应用层传递状态信息。如tester收到了ECU方面的数据。
具体说来,Confirm和Indication很像的是都是从网络层向应用层传递信息,有何区别呢?
在代码的处理中,Confirm的前端应向底层外发Tx数据或超时处理函数,反馈的信息不需要包含数据。而Indication传递的信息则分为两种,一种包含真实数据,另一种不包含。
网络层服务
这一章要注意一个知识点,7.3.2.4中提到,对于物理寻址(Physical addressing)需要被所有的报文类型所支持;而对于功能寻址(Functional addressing),只能被单帧所支持。
传输层协议
这一章一开始就重申了TP层的意义之所在:
- 使收发的数据帧所包含的字节总数,扩容到4095个字节。
- 不管发送或接收是成功或是出错,都需要上报给应用层。
网络层协议数据单元 N_PDU
网络层协议数据单元(N_PDU,Network_Protocol Data Unit)包含N_AI,N_PCI,N_Data。即地址信息,协议控制信息和数据。
注:这里的N_PCI全称为Protocol Control Information。
网络层协议数据单元(N_PDU)有四种类型,即 单帧(SF)、首帧(FF)、连续帧(CF)、流控制帧(FC),用于建立对等实体间的通信。
N_PCI
网络层对于这四种类型的数据单元是通过协议控制信息(N_PCI,Protocol Control Information)进行区分的。每一个N_PDU都只有一个N_PCI。
也就是说,对于CAN诊断来说,我们完全可以通过识别每条CAN帧数据域的首个字节来确定它属于四种类型中的哪类。
N_PCI是TP层最为核心的信息,是TP层区别于其他CAN总线抽象协议的、最为显著的特征。
以下说明仅以乘用车常用的常规寻址举例。
对于TP层来说,我们可以把报文分为单帧和多帧,单帧只有一种N_PCI,即单帧;多帧有三种N_PCI,即首帧、流控制帧、连续帧。代码实现中,主要的工作其实就在多帧的处理和对超时错误(Timeout)的处理上。
0X 单帧(SF,Single Frame):首个字节为0(4bit)+ Data Length(4bit),控制信息占用1个字节
举例:Data 02 10 02 55 55 55 55 55,02表示接收方应知晓,这一个单帧只有2个有效字节。后续的字节是自动填充的无效字节。
单帧PCI通常仅占用1个字节,其他是数据,所以可以后面可以跟着最多7个字节的数据
1X XX 首帧(FF,First Frame):前两个字节为1(4bit)+ Data Length(12bit),控制信息共占用2个字节。
举例:Data 10 14 2E F1 90 01 02 03,0x014表示,接收方应知晓,这一个多帧组合共有20个字节。
首帧可以携带一个多帧报文的头部6个字节数据
3X 流控制帧(简称流控帧,FC,Flow Control):前三个字节为3(4bit)+流状态(FS,4bit)+块大小(BS,8bit)+最小间隔时间(STmin,8bit),控制信息共占用三个字节。
举例:Data 30 00 14 AA AA AA AA AA,多帧发送方应知晓,这是一个流控帧,允许你方继续发送,CF数量无限制,上一个连续帧的确认接收(ACK)到新的连续帧开始发出的最小间隔时间为20ms。
Flow State 流状态:0为继续发送,Continue To Send(CTS),1为Wait(WT),2为Overflow(OVFLW)。
流控帧仅有3个字节的控制信息,无数据字节
STmin含义的解读
间隔最短时长(STmin)值的含义如下。
2X 连续帧(CF,Consecutive Frame):第一个字节为2+SN(最多16个SN,溢出后从0开始重新计数),控制信息占用1个字节。
我们通常记首帧为0x20,之后的第一个连续帧自然是0x21,之后一直到0x2F,下一个是0x20,循环。
一个连续帧最多可携带7个数据字节
下图是一个传输规则的例子。可以看出,这首先是一个多帧传输,下列CAN帧依次代表的含义是首帧、流控、连续帧、连续帧。
FF-FC-CF-CF
实际截取到的多帧报文
下图是N_PCI字节的概要。N_PCI在不同的类型下占用的字节数是不同的。记忆时可以按照单帧、首帧、连续帧、流控的顺序,与0、1、2、3建立映射关系。这四种类型所占用的字节大小依次是1个、2个、1个、3个。
网络层内部传输服务
网络层的主要任务是传递一帧或大于一帧的数据信息。以下是一个被拆分的信息传送的例子。
帧的发送主要有单帧发送和多帧发送两种,在标准地址情况下,单帧SF按照N_PDU格式最多发送和接收7个字节数据(因第一个字节为N_PCI)。
而发送长报文信息时,拆分后的报文信息会通过多个N_PDU进行发送,接收到多个N_PDU信息后进行重组。这些N_PDU包括首帧和连续帧。报文信息接收者可通过流控机制按照自己的接收能力调整传输流量。在正常地址的情况下,一个首帧PDU包括6个字节,一个连续帧PDU包括6或7个字节。当然最后一个连续帧可以少于6或7个字节。
网络层时间控制分析
网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数。
多帧传输时序表,划重点
我们对上述信息进行归纳:
N_As超时:发送方自己没有及时发出首帧或者连续帧。
N_Ar超时:接收方没有及时回复流控帧。
N_Bs超时:发送方没有接收到流控帧。
N_Cr超时:接收方没有收到连续帧。
N_Br超时:接收方没有发出流控帧。
N_Cs:即STmin,发送两个连续帧需要等待的最短时间。
与外卖的对比(按时间先后顺序排序,并不完全准确,请意会)
N_As:外卖小哥拨出电话到你听到手机铃声(同时外卖小哥听到了第一声“嘟”)的时间。(发送方发出消息,到接收方刚刚收到的时间,极短)
N_Br:从你听到手机铃声,直到你说完“放在301门口”这句话。(你作为接收方,大脑处理信息的时间,短)
N_Bs:外卖小哥听到第一声“嘟”到外卖小哥听到你说的“放在301门口”这个信息的时间。(发送方发完消息后,直到发送方收到了接收方回应的时间,长!)
N_Ar:你说出“放在301门口”这句话到外卖小哥听到“放在301门口”这个信息的时间。(与N_As相反,接收方发出消息,到发送方刚刚收到的时间,极短)
N_Cs:外卖小哥听到“放在301门口”这个信息到外卖小哥说完“疫情期间进不了小区!”的时间。(与N_Br相反,外卖小哥作为发送方,大脑思考/等待的时间,短)
N_Cr:你说完“放在301门口”这句话以后咽了口吐沫,到你听到了外卖小哥说“疫情期间进不了小区!”的时间。(与N_Bs相反,接收方发完消息后,直到接收方收到了发送方回应的时间,长!注意,N_Cr不包含N_Ar)
N_As:外卖小哥说完“疫情期间进不了小区!”这句话到你听到“疫情期间进不了小区!”这句话的时间。(虽然短,但存在)
由此我们可以看出,N_Bs近似等于N_Br+N_Ar;N_Cr近似等于N_Cs+N_As。
建议搭配上面提到的“多帧传输时序表”一起看。
ISO14229、14230、15765、15031之间的联系和不同之处在哪里。我们看一下下面的两张图。
基于k线
基于CAN线
ISO15031-5是排放相关的应用层协议,它不关心我们使用K线还是CAN线,主要用于监控车辆基本参数,例如监控里程、车速;用于监控排放相关的参数,比如各种尾气的含量,氧含量等等,以此来保证满足各国的标准;用于读取VIN码等车辆参数;读取/清除排放相关的故障码。
ISO14229-1是UDS诊断的应用层协议,通常基于CAN线,主要用于监控车内参数、记录存储故障信息、错误检测、读写数据等。
ISO14230是老式的基于K线的诊断协议,其功能与UDS类似,但是基于的是类似于串行总线的K线,速度慢,易出错,已经被UDS淘汰。
ISO15765有很多子协议,通常基于CAN线,LIN线也支持。可以看做对ISO14229-1和ISO15031-5的支撑。比如本文中的ISO15765-2就负责帮助ISO14229-1处理CAN的短帧数据(小于6或7个字节),使其形成最大4095个字节长度的长帧数据,方便ISO14229-1进行处理。