CAN是Controller Area Network的缩写,是ISO国际标准化的串行通信协议。1986年由德国电气商博士公司开发面向汽车的CAN通信协议,此后,经ISO11898和ISO11519进行了标准化,现在在欧洲已经是汽车网络的标准协议。其高性能和可靠性已经被广泛认同。
CAN控制器根据两根线上的电位差来判断总线电平,总线电平分为显性和隐形电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。有如下特点:
1.多主控制
在总线空闲时,所有单元都可开始发送消息,最先访问总线的单元可获得发送权,多个单元同时开始发送时,发送高优先级ID消息的单元可获得优先权。
2.消息发送
所有的消息以固定格式发送,ID只是优先级,以位进行逐个仲裁比较,连续输出显性电平最多的单元,仲裁获胜,获得发送权,失利的单元则停止发送而进行接收工作,并且在总线再次空闲之前不会再发送报文。也就是在线与逻辑中,ID的数值越小,优先级越高。这种仲裁,可以让高优先级的数据帧无延时的实时发送,因为在仲裁结束后,数据帧的前面部分起始已经发送过了。(以太网CSMA/CD,CAN总线采用CSMA/CA)。
3.系统柔软性
CAN协议中,与总线下相连的单元没有类似的地址信息,因此,总线上增加单元不影响其他单元的软硬件以及应用层都不需要改变。
4.通信速度
在同一个网络中,所有单元的通信速度一致,即使有一个单元的通信速度与网络通信速度不同,此单元也会输出错误信号,妨碍整个网络;不同网络的通信速度可不同。
5.远程数据请求
可以通过发送远程帧请求其他单元发送数据
6.错误检测功能·错误通知功能·错误恢复功能
所有的单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止。
7.故障封闭
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
8.连接
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
CAN协议
CAN协议涵盖了OSI规定的传输层,数据链路层,物理层,其中:
物理层决定了位编码方式(NRZ编码,6个位插入填充位),位时序(位时序,位的采样),同步方式(根据同步段ss实现同步,并具有再同步功能),但具体的说,信号电平,通信速度,采样点,驱动器和总线的电气特点,连接器的形态都没有定义,需要用户自行确定;传输层定义了再发送控制;数据链路层分LLC(逻辑链路控制)子层和MAC(媒介访问控制)子层,其中LLC子层,执行接收消息选择(可点到点,广播,组播),过载通知(通知接收准备尚未完成),错误恢复功能(再次发送),而MAC层则进行数据帧化(4种帧类型),连接方式控制(竞争方式),消息仲裁(ID仲裁),故障扩散抑制(自动识别暂时错误和持续错误,排除故障节点),错误通知(CRC错误,填充位错误,位错误,ACK错误,格式错误),错误检测,应答方式(ACK,NACK),通信方式(半双工)等设置。
MAC子层是CAN协议的核心,数据链路层的功能是将物理层的信号组成有意义的消息,并提供传送错误控制等传输控制的流程。数据链路层的功能通常在CAN控制器的硬件中执行。
实际上,驱动器和总线的电气特性等在博士公司的CAN总线标准中没有定义,但在CAN的ISO标准中分别定义了总线和驱动器的电气特性。
CAN协议标准化有两种,ISO11898和ISO11519-2,他们对于数据链路层的定义相同,但物理层不同。另外,对传输层未做标准化,对物理层的驱动器,收发器,连接器,电缆等形态没有规定。
ISO11898 是通信速度为125kbps-1Mbps 的CAN 高速通信标准。目前,ISO11898 追加新规约后,成为ISO11898-1 新标准。
ISO11519 是通信速度为125kbps 以下的CAN 低速通信标准。ISO11519-2 是ISO11519-1 追加新规约后的版本。
CAN协议中物理层有三个子层,其中PMA(物理媒介链接)和MDI(介质相关接口)层不同,PLS(物理信号子层)层相同。
总线上执行线与逻辑时,显性电平的逻辑值为0,隐性为1,显性意味着优先,只要有一个单元输出显性电平,总线上即为显性电平。隐性意味着包容,只有所有单元都是隐性电平,总线上才是隐性电平。
驱动IC的选择:
也就是说:
对于CAN总线,博世公司的CAN总线规格书和ISO规范区别在于:
1.信号电平,通信速度,采样点,连接器的形态,驱动器,总线的电气特性等在博世公司的CAN总线规格书中没有定义。需要用户自己根据系统设置。
2.CAN的ISO标准中定义了总线及驱动器的电器特性。
3.ISO11898和ISO11519-2并没有标准化CAN的传输层特性。
4.数据链路层及物理层的一部分在ISO中进行了标准化。对于数据链路层,11898和11592规格相同,对于物理层,两者定义的内容不同。
5.ISO在CAN协议物理层定义了3个子层,其中两者的PMA及MDI层不同,即包含通信速度,总线最大长度,链接单元数,总线拓扑及电气特性。
6.对应每个标准不同的物理层,定义了驱动IC。
另外,要注意的是ISO11898采用闭环总线,因此单元两端需要两个120欧姆的终端电阻,而ISO11519-2是开环总线,一端需要一个2.2KΩ的终端电阻。
7.物理层中没有标准化的部分,包含驱动器,收发器,连接器,电缆等的形态。
此外,这只是ISO对于CAN总线的标准化,还有SAE等其他团体对CAN总线定义。例如,SAE J1939-11,SAE J1939-12,SAE J2284,SAE J24111,NMEA-2000,DeviceNet,CANOpen,SDS等。针对不同的用途,可选不同的标准。还有SAE的Class,ClassA~D等。
帧格式说明:
1.帧种类:
数据帧,远程帧,错误帧,过载帧,帧间隔
另外,数据帧和远程帧有标准格式和扩展格式,标准格式有11位的ID,扩展格式有29位的ID。
详细说明如下:
数据帧 用于发送单元向接收单元传送数据的帧。
标准格式的数据帧一般44bit~108bit.扩展ID的数据帧一般64~128.
SOF:1个位的显性位,标准ID和扩展ID相同。在空闲时的下降沿同步所有总线模块。只有在总线空闲时,才允许节点开始发送信号,所有的节点必须同步首先开始发送信息的节点的帧起始前沿。
仲裁段,标准格式的ID有11位,从ID28到ID18被依次发送,禁止高7位都是阴性电平,即禁止ID = 1111111XXXX,扩展格式的仲裁段有29位,即基本ID+扩展ID,也就是基本ID从bit28~bit11,扩展ID从bit17~0.禁止基本ID = 1111111xxxx。
IDE:扩展ID标志位。IDE = 1,表示采用扩展ID。这是为了区别标准ID和扩展ID,在前版本CAN1.0~1.2中的r1表示为IDE。
IDE属于:
扩展帧的冲裁场
标准帧的控制场
RTR:远程发送请求位,为1则表示为远程发送请求帧、
SRR:替代远程请求位。它在扩展格式的标准帧RTR位位置,因此代替标准帧的RTR位。因此,标准帧与扩展帧的冲突是通过标准帧优先于于扩展帧这一途径得到的。
具有标准格式的ID和扩展格式的ID的数据帧在总线上竞争时,标准格式的数据帧具有优先权。
控制段,有6位,表示数据的字节数和保留位,其中保留位全部以显性电平发送,但接收方任意,数据长度码DLC,必须为0~8B,但接收方收到DLC = 9~15时也不报错。注意,DLC有4位,0表示D,显性,1表示R,阴性。因此,DLC= 8表示,RDDD.
数据段,从MSB(最高位)开始输出,CRC段,其中前15位表示CRC多项式,最后1位CRC界定符,用于分隔。CRC的计算范围包括帧起始,仲裁段,控制段,数据段。
ACK段用来确认是否正常接收,由ACK槽和ACK界定符组成,若ACK槽为1,表示发送单元的ACK,发送单元在ACK段发送2个隐性位。若ACK槽为0,接收单元的ACK段,接收到正确消息的单元在ACK槽发送显性位,通知发送单元已经正常接收结束,这称作发送ACK或者返回ACK。注意,发送单元不发送ACK。
远程帧 用于接收单元向具有相同 ID 的发送单元请求数据的帧。
远程帧和数据帧的区别:
远程帧没有数据段,RTR位为隐性位,没有数据段的数据帧和远程帧可以通过RTR位区别开来。注意,数据帧的RTR位是显性电平。
远程帧的数据长度码DLC,是以它所请求的数据帧的DLC来表示的。
具有相同ID的远程帧和数据帧在总线上竞争时,RTR位为显性的数据帧具有优先权。
错误帧 用于当检测出错误时向其它单元通知错误的帧。
过载帧 用于接收单元通知其尚未做好接收准备的帧。
帧间隔 用于将数据帧及远程帧与前面的帧分离开来的帧。
过载帧和错误帧前不能插入帧间隔。
其中,延迟传送,只处在被动错误状态的单元刚发送一个消息后的帧间隔中包含。表示发送暂时停止。
位填充:
为防止突发错误而设定的功能,当同样的电平持续5位时,则添加一个位的反型数据,因此,在发送单元,增加的反型位要在接受单元删除,如果该位与之前的位相同,则视为错误,并发送错误帧。
位时序:
由发送单元在非同步的情况下,发送的每秒的位数,称为位速率。一个位分4个段,即SS,PTS,PBS1,PBS2.这些段又由最小时间单位Tq组成。这称为位时序。
1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
SS:同步段,多个连接在总线上的单元通过此段实现时序调整,同步进行接收和发送的工作。由隐性电平到显性电平的边沿或由显性电平到隐性电平边沿最好出现在此段中。固定为1Tq。
PTS:传播时间段,用于吸收网络上的物理延迟的段。所谓的网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。这个段的时间为以上各延迟时间的和的两倍。1~8Tq.
PBS1~2:相位缓冲段,当信号边沿不能被包含于SS 段中时,可在此段进行补偿。由于各单元以各自独立的时钟工作,细微的时钟误差会累积起来,PBS 段可用于吸收此误差。通过对相位缓冲段加减 SJW 吸收误差。(请参照图34)。SJW 加大后允许误差加大,但通信速度下降。其中,PBS1, 1~8Tq,PBS2,2~8Tq。
SJW:再同步补偿宽度,因时钟频率偏差、传送延迟等,各单元有同步误差。SJW 为补偿此误差的最大值。1~4Tq。
采样点,在PBS1处结束。
同步方法:
CAN协议的通信方式为NRZ方式,各个位的开头和结束都没有附加同步信号,发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
硬件同步方法:
硬件同步,通过检测到隐型到显型的边沿视为位的起始SS段,但这是在接受单元从总线空闲状态检测出起始帧做的同步调整。在检测边沿地方不考虑SJW的值。
再同步,在接受过程中检测出的电平变化时进行的同步调整。每当检测出边沿时,根据 SJW 值通过加长PBS1 段,或缩短PBS2 段,以调整同步。但如果发生了超出SJW值的误差时,最大调整量不能超过SJW 值。
如果隐性到显性的边沿出现在PTS与PBS1之间,在PBS1之后增加SJW。
如果隐性到显性的边沿出现在PBS2之后,在PBS2中减少SJW。
同步调整的规则:
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要
满足下面条件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
错误
单元始终处于以下三种状态之一。
主动错误状态:
主动错误状态是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标志。
被动错误状态:
被动错误状态是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内
必须插入“延迟传送”(8 个位的隐性位)。
总线关闭态:
总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
这些状态是靠发送错误计数TEC和接受错误计数REC来管理,根据计数值决定进入何种状态。
主动:REC && TEC 在0~127,被动REC || TEC 128~255 关闭 >= 256
错误计数器在错误标志的第一个位出现的时间点上开始计数。
错误种类:
(1) 位错误
位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出ACK 的单元、输出错误的单元来检测。
在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
发送单元在ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的ACK 应答,而非位错误。
输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同6 个位的值(显性或隐性),并不视为位错误。
(2) 格式错误
即使接收单元检测出EOF(7 个位的隐性位)的最后一位(第8 个位)为显性电平,也不视为格式错误。
即使接收单元检测出数据长度码(DLC)中9∼15 的值时,也不视为格式错误。
错误帧的输出
检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。