CAN协议
CAN - bus规范V2.0版本
随着串行通讯进入更多应用领域,因此,在一些应用里,需要对通讯功能的报文识别位提出分配标准化的要求。原先的地址范围由11个识别位定义,如果地址范围扩大,则这些应用就可以更好地由CAN来实现。
因此引入了第二种报文格式的概念,其定义的地址范围更宽,由29位定义。系统设计者从考虑良好的结构命名方案中得到解放。有的用户不需要由扩展格式提供的识别符范围,可以继续沿用唱过的11位识别符范围(标准格式),在这种情况下,可以采用市场上可用的CAN仪器,或使用兼容这两种模式的心控制器类仪器
为了区别标准格式和扩展格式,按CAN1.2规范定义,使用了CAN报文格式的第一个保留位。因为CAN1.2定义的信息格式相当于标准格式,因此仍然是有效的。此外,由于扩展格式已经定义,因此网络中会共存标准格式和扩展格式的报文。
这本CAN规范技术规范由两部分组成:
A部分:CAN的报文格式说明(按CAN1.2规范定义)
B部分:标准格式和扩展格式的说明
1. 介绍
控制器局域网(CAN)为串行通信协议,能有效地支持具有很高安全等级的分布实时控制。CAN的应用范围很广,从告诉的网络到低价位的多路接线都可以使用CAN。在汽车电子行业里,使用CAN连接发送机控制单元,传感器,防刹车系统,等等。其传输速度可达1Mbit/s。同时,可以将CAN安装在卡成本题的电子控制系统里,诸如车灯组、电气车窗等等,用以代替接线配线装置。
这本技术规范的目的是为了在任何两个CAN仪器之间建立兼容性。可是,兼容性有不同的方面,比如电气特性和数据转换的解释。为了达到设计透明度以及实现柔韧性,CAN被细分为以下不同的层次:
CAN对象层(the object layer)
CAN传输层(the transfer layer)
CAN物理层(the physical layer)
对象层和传输层包括所有由ISO/OSI模型定义的数据链路层的服务和功能。对象层的作用范围包括:
查找被发送的报文。
确定由实际要是用的传输层接受哪一个报文。
为应用层相关硬件提供接口。
在这里,定义对象处理较为灵活,传输层的作用主要是传送规则,也就是控制帧结构、执行仲裁、错误检测、出错标定、故障界定。总线上什么时候开始发送新报文,均在传输层里确定。位定时的一些普通功能也可以看作是传输层的一部分。理所当然,传输层的修改是受到限制的。
物理层的作用是在不同节点之间根据所有的电气属性进行位信息的实际传输。当然,同一网络内,物理层对于所有的节点必须是相同的。尽管如此,在选择物理层方面还是很自由的。这杯技术规范的目的是定义传输层,并定义CAN协议于周围各层当中所发挥的作用。
2. 基本概念
2.1 CAN具有以下的属性:
- 报文的优先权
- 保证延迟时间
- 设置灵活
- 时间同步的多点接收
- 系统宽数据的连贯性
- 多主机
- 错误检测和标定
- 只要总线一处于空闲,就自动将破坏的报文重新传输
- 将节点的暂时性错误和永久性错误区分开来,并且可以自动关闭错误的节点
2.2 CAN节点的层结构
应用层
对象层
- 报文滤波
- 报文和状态处理
传输层
- 故障界定
- 错误检测和标定
- 报文校验
- 应答
- 仲裁
- 报文分帧
- 传输速率和定时
物理层
- 信号电平和位表示
- 传输媒体
物理层定义实际信号的传输方法。本技术规范没有定义物理层,以便允许根据他们的应用,对发送媒体和信号电平进行优化。
传输层是CAN协议的核心。它把接收到的报文提供给对象层,以及接收来自对象层的报文。传输层负责位定时及同步、报文分帧、仲裁、应答、错误检测和标定、故障界定。
对象层的功能是报文滤波以及状态和报文的处理。
这本技术规范的目的是为了定义传输层及定义CAN协议在周围各层中所发挥的作用。
报文(Message)
总线上的信息以不同的固定报文格式发送,但长度受限。当总线空闲时任何连接的单元都可以发送新的报文。
信息路由(Information Routing)
在CAN系统里,节点不使用任何关于系统配置的信息,以下是几个重要的概念。
系统灵活性:不需要改变任何节点的应用层及相关的软件或硬件,就可以在CAN网络中直接添加节点。
报文路由:报文的内容由识别符命名。识别符不指出报文的目的地,但解释数据的含义。因此,网络上所有的节点可以通过报文滤波确定是否应对该数据做出反应。
多播:由于引入了报文滤波的概念,任何数目的节点都可以接收报文,并同时对此报文做出反应。
数据连贯性:在CAN网络内,可以确保报文同时被所有的节点接收。因此,系统的数据连贯性是通过多播和错误处理的原理实现的。
位速率(bit rate)
不同的系统,CAN的速度不同。可是,在已给定的系统里,位速率是唯一的,并且是固定的。
优先权(priorities)
在总线访问期间,识别符定义一静态的报文优先权。
远程数据请求(Remote Data Request)
通过发送远程帧,需要数据的节点可以请求另一节点发送相应的数据帧。数据帧和相应的远程帧是由相同的识别符命名的。
多主机(multimaster)
总线空闲时,任何单元都可以开始发送报文。具有较高优先权报文的但愿可以获得总线访问权。
仲裁(Arbitration)
只要总线空闲,任何单元都可以开始发送报文。如果2个或者2个以上的但愿同时开始传送报文,那么就会有总线访问冲突。通过使用识别符的位形式仲裁可以解决这个冲突。仲裁的机制确保信息和时间均不会损失。当具有相同识别符的数据帧和远程帧同时初始化时,数据帧优先于远程帧。仲裁期间,每一个发送器独对发送位的电平与被监控的总线电平进行比较。如果电平相同,则这个但愿可以继续发送。如果发送的是一隐性电平而监控室到一显性电平,那么该单元就失去了仲裁,必须退出发送状态。
安全性(safety)
为了获得最安全的数据发送,CAN的每一个节点均采取了强有力的措施进行错误检测、错误标定及错误自检。
错误检测(Error Detection)
为了检测错误,必须采取以下措施:
- 监视(发送器对发送位的电平与被监控的总线电平进行比较)
- 循环荣誉检查
- 位填充
- 报文格式检查
错误检测的执行(performance of error detection)
错误检测的机制要具有以下的属性:
- 检测到所有的全局错误
- 检测到发送器所有的局部错误
- 可以检测到一报文里多达5个任意分布的错误
- 检测到一报文里长度低于15位的突发性错误
- 检测到一报文里任一奇数个的错误
对于没有检测到的错误报文,齐参与的错误可能性概率低于:报文错误率4.7*10-11
错误标定和恢复时间(error sinalling and recovery time)
任何检测到错误的节点会标志出已损坏的报文。此报文会失效并将自动地开始重新传送。如果不再出现新错误的话,从检测到错误到下一报文的传送开始为止,恢复时间最多为29个位的时间。
故障界定(fault confinement)
CAN节点能够把永久故障和短暂扰动区分开来。永久付账的节点会被关闭。
连接(connections)
CAN串行通信链路是可以连接许多单元的总线。理论上,可连接无数多的单元,但由于实际上受延迟时间以及/或者总线线路上电器负载的影响。连接单元的数据是有限的。
单通道(single channel)
总线是由单一进行双向位信号传送的通道组成。通过此通道可以获得数据的再同步信息。要使此通道实现通讯。有许多的方法可以采用,如使用单芯线(加上接地)、2条差分线、光缆等等。这杯技术规范不闲着这戏实现方法的使用,即未定义物理层。
总线值(bus value)
总线可以具有两种互补的逻辑值之一:显性或隐性。显性和隐性位同时传送时,总线的结果值为显性。比如,在执行总线的线与时,逻辑0代表显性等级,逻辑1代表隐性等级。本技术规范不给出表示这些逻辑点评的物理状态。
应答(acknowledgement)
所有的接收器检查报文的连贯性。对于连贯的报文,接收器应答;对于不连贯的报文,接收器做出标志。
睡眠模式/唤醒(sleep mode/wake-up)
为了减少系统电源的功率消耗,可以将CAN器件设为睡眠模式以便停止内部活动及断开与总线驱动器的连接。CAN器件可由总线激活,或系统内部状态耳背唤醒。唤醒时,虽然传输层要等待一段时间使系统振荡器稳定,然后还要等待一段时间直到与总线活动同步(通过检查11位连续的隐性的位),但在总线驱动器被重新设置为总线在线之前,内部运行已重新开始。为了唤醒系统上正处于睡眠模式的其他节点,可以使用一特殊的唤醒包围,此报文具有专门的、最低等级的识别符。(rrr rrrd rrrr; r = 隐性 d = 显性)
3. 报文传输
3.1 帧类型
报文传输由以下4个不同的帧类型所表示和控制
- 数据帧:数据帧携带数据从发送器至接收器
- 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧
- 错误帧:任何单元检测到一总线错误就发出错误帧
- 过载帧:过载帧用以在现行的和后续的数据帧之间提供一附加的延时
3.1.1 数据帧
数据帧由7个不同的位场组成:
帧起始、仲裁场,控制场,CRC场,应答场,帧结尾。数据场的长度可以为0
帧起始
它标志数据帧和远程帧的起始,由一个单独的显性位组成。
只在总线空闲(总线空闲)时,才允许站开始发送(信号)。所有的站必须同步于首先开始发送信息的站的帧其实前沿(参见硬同步)。
仲裁场
仲裁场包括识别符和远程发送请求位(RTR)
识别符:识别符的长度为11位,这些位的发送顺序是从ID-10到ID-0。最低位是ID-0.最高的7位(ID-10到ID-4)必须不能全是隐性。
RTR位:该位在数据帧里必须为显性,而在远程帧里必须为隐性。
控制场
控制场由6个位组成,包括数据长度代码和两个将来作为扩展用的保留位。所发送的保留位必须为显性。接收器接收所有由显性和隐性组合在一起的位。
数据长度代码:数据长度代码指示了数据场中字节的数量。数据长度代码为4个位,在控制场里被发送。
数据长度代码中数据字节数的编码(DATA LENGTH CODE)
数据场
数据场由数据帧中的发送数据组成。他可以为0~8个字节,梅子姐包含了8个位,首先发送MSB。
CRC场
CRC场包括CRC序列(CRC sequence),其后是CRC界定符(CRC delimiter)。
CRC序列:由循环冗余码求得的帧检查序列最适用于位数地狱127位(BCH码)的帧。为进行CRC计算,被除的多项式系数由填充位流给定,组成这些位流的成分是:帧起始、仲裁场、控制场、数据场、(加入有),而15个最低位的系数为0.将此多项式被下面的多项式发生器除(其系数以2为模):
X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1
这个多项式除法的余数就是发送到总线上的CRC序列。为了实现这个功能,可以使用15位的位移寄存器CRC_RG。如果用NXTBIT标记指示位流的下一位,它由从帧的起始到数据场末尾都由无填充的位序列给定。
CRC序列的计算如下:
CRC_RG = 0;
REPEAT;
CRCNXT = NXTBIT EXOR CRC_RG(14);
CRC_RG(14:1) = CRC_RG(13:0);
CRC_RG(0) = 0;
IF CRCNXT THEN
CRC_RG(14:0) = CRC_RG(14:0) EXOR (4599hex)
ENDIF
在传送/接收数据场的最后一位以后,CRC_RG包含有CRC序列。CRC序列之后是CRC界定符,它包含了一个单独的隐性位。
应答场
应答场长度为2个位,包含应答间隙(ACK SLOT)和应答界定符(ACK delimiter)。在应答场里,发送两个隐性位。当接收器正确地接收到有效的报文,接收器就会在应答间隙期间(发送ACK心哈)向发送器发送一显性的位以示应答。
应答间隙:所有接收到匹配CRC序列的站会在应答间隙(ACK SLOT)期间用一显性的位写入发送器的隐性位来作出回答。
ACK界定符:ACK界定符是ACK场的第二个位,并且是一个必须为隐性的位。因此,应答间隙(ACK SLOT)被两个隐性的位所包围,也就是CRC界定符()和ACK界定符。
帧结尾
每一个数据帧和远程帧均由一标志序列界定。这个标志序列由7个隐性位组成。
3.1.2 远程帧
通过发送远程帧,作为某数据接收器的站通过其资源节点对不同的数据传送进行初始化设置。
远程帧由6个不同的位场组成:
帧起始、仲裁场、控制场、CRC场、应答场、帧末尾
与数据帧相反,远程帧的RTR位是隐性的,他没有数据场,数据长度代码的数值是不受制约的(可以以标注为容许范围里0...8的任何数值)。此数值是相应于数据帧的数据长度代码。
RTR位的极性表示了所发送的帧是一数据帧(RTR位显性)还是一远程帧(RTR隐性)。
3.1.3 错误帧
错误帧由两个不同的场组成。第一个场用作为不同站提供的错误标志(error flag)的叠加。第二个场是错误界定符。
为了能正确地终止错误帧—错误被动的节点要求总线至少有长度为3个位时间的总线空闲。因此,总线的载荷不应为100%。
有两种形式的错误标志,主动错误标志和被动错误标志。主动错误标志由6个连续的隐性的位组成,除非被其他节点的显性位重写。
检测到错误条件的错误主动的站通过发送错误标志,以指示错误。错误标志的形式破坏了帧起始到CRC界定符的位填充规则,或者破坏了应答场或帧末尾场的固定形式。所有其他的站由此检测到错误条件并与此同时开始发送错误标志。因此,显性位(此显性位可以在总线上监视)的序列导致一个结果,这个结果就是把各个单独站发送的不同的错误标志叠加在一起。这个顺序的总长度最小位6给位,最大为12个位。
检测到错误条件的错误被动的站试图通过发送被动错误标志,以指示错误。错误被动的站等待6个相同的极性的连续位(这6个位处于被动错误标志的开始)。当这6个相同的位被检测到时,被动错误标志的发送就完成了、
错误界定符包括8个隐性的位
错误标志传送了以后,每一站就发送隐性位并一直监视总线直到检测出一个一个隐性的位为止,然后就开始发送7位以上的隐性位。
3.1.4 过载帧
过载帧包括两个位场:过载标志和过载界定符
有两种过载条件都会导致过载标志的传送:
1. 接收器的内部条件(此接收器对于下一数据帧或远程帧需要有一定的延时)
2. 间歇场器件检测到一显性位
由过载条件1而引发的过载帧只允许起始于所期望的间歇场的第一个位时间开始。而由过载条件2引起的过载帧应起始于所检测到显性位之后的位。