CAN协议

 

原文地址:http://www.can-cia.org/index.php?id=systemdesign-can-protocol

CAN协议是ISO 11898中定义的一种国际标准。除了CAN协议之外,ISO 16845中定义了CAN协议合格试验测试,保证了CAN芯片的可交互性。

数据交互原理

CAN基于“广播通信机制”,是一种面向消息的传输协议。CAN定义了消息内容,而没有定义 节点(Station)以及节点地址。每条消息有一个消息标识符,该标识符在整个网络中是唯一的,用于定义内容和消息的优先级,这在多个节点竞争访问总线时非常重要(总线仲裁)。

面向内容的寻知机制使得系统和配置具有高度的灵活性。在已有的CAN网络中可以很方便的添加节点,只要新加入的节点仅作为接收者,那么无需对硬件或软件做任何修改。这便考虑到了模块化,允许接收多个数据和分布式处理同步。此外,数据传输并不是基于特性类型节点的可用性,这便使得对网络网络进行间的的维修和升级。

实时数据传输

在实时处理过程中,网络中交互的消息的紧急性大有不同:与其他层面相比(例如引擎温度),需要更为频繁的传递瞬息万变的层面(例如,引擎负载)的数据。

消息的优先级通过每条消息中的标识符进行定义。消息的优先级是在系统设计过程中以相应的二进制值进行定义的,不能在运行过程中动态改变。二进制值越小,优先级越高。

CAN通过读总线上的节点的标识符逐位仲裁来解决总线访问冲突。根据电气特性,显性电平(0)“胜过”隐形电平(1)。所有发送隐形电平的节点在观察到显性电平时,会失去对总线的竞争访问。所有“失去着”会自动成为具有最高优先级的消息接收者,在总线再次可用之前不再尝试重新发送消息。

 

整体系统的传输请求按照重要性来进行处理,这一点在高负载情况下越发能显示其有点。由于是基于消息的优先级来访问总线的,可以保证实时系统的低延时。

消息帧格式

CAN协议支持两种类型的帧格式,这两种帧格式的不同之处在于标识符的长度。“CAN标准帧”支持长度为11位的标识符,“CAN扩展帧”支持29位的标识符。

CAN标准帧格式

 CAN标准帧消息的起始位称之为“开始帧(Start Of Frame,SOF)”,随后是“仲裁域”,仲裁域包括标识符和“远程传输请求(Remote Transmission Request, RTR)”位,RTR用来标识数据帧和数据请求帧(远程帧)。随后是“控制域”,控制域包含了“标识符扩展(IDentifier Extension,IDE)”位,用来区分CAN标准帧和CAN扩展帧,然后是“数据长度码(Data Length Code,DLC)”,DLC包含了“数据域(Data field)”中的字节数。如果消息是远程帧,DLC包含了请求数据的字节数。“数据域”最多可以容纳8个字节。帧的完整性通过其后的CRC和来保证。“ACK域”包括ACK槽和ACK定界符,在发送的时候ACK槽为隐形位,当接收者收到正确的消息之后会将该位置为显性位,接收者通过这种方法来告知接收结果。通过“结束帧(End Of Frame,EOF)”来标识消息的结束。“帧间隔(Intermission Frame Space,IFS)”为连续的消息之间的最少数据位数。除非有另一个节点开始传输数据,否则总线再此之后保持空闲。

CAN扩展帧格式

标准帧和扩展帧的不同之处在于标识符的长度。29位的标识符包括11位的标识符(“标准标识符”)和18位的扩展(“标识符扩展”)。CAN标准帧和CAN扩展帧格式在IDE位的使用上也不同,在传输11位帧时为显性,在传输29位帧是为隐形。由于一个总线上同时存在两种帧格式,当不同消息格式不同、具有相同的标识符/标准标识符的消息访问总线发生冲突时,就要看谁的优先级高:11位消息总是比29位消息的优先级高。

扩展格式有一些取舍:总线延迟会长一些(最少20bit-times,消息需要更大的带宽(约20%),错误处理性能较低(因为选择15位的多项式在在位数不高于112位是性能最佳)。

支持扩展帧格式的CAN控制器也可以发送和接收CAN标准帧格式的消息。仅能处理标准帧格式的CAN控制器无法正确解释扩展帧格式。然而,也有仅支持标准帧格式的CAN控制器,而不能识别扩展消息,因此会忽视扩展格式。

检测并通过信号告知错误

不像其他的总线系统,CAN协议没有使用响应消息,而是即刻使用信号来告知错误的发生。对于错误检测,CAN协议在消息层面实现了三种机制(数据链路层,OSI层2):

CRC:消息发送方通过在帧里添加一个CRC帧检测序列(Frame Check Sequence,FCS)来保证安全。在接收端,重新计算一遍FCS来进行校验,如果CRC不匹配,则发生了错误。

  • 帧检测:该机制通过位来检测帧的固定格式和帧长度来验证所传输的帧的格式是否正确。帧检测到的错误称之为“格式错误”
  • ACK错误:接收方在收到帧之后对其进行响应,如果发送方没有收到响应,那么表明发生了ACK错误

CAN协议还实现了两个位级别的错误检测(物理层,OSI层1):

  • 监视:基于对总线信号的监视,发送方有检测错误的能力。每个节点发送数据的同时可以观察总线级,因此可以发现发送的数据和接收到的数据不同之处。这种机制保证了检测全局错误和发送方自身错误的可靠性。
  • 位填充:在位级别会对每个位的编码进行测试。CAN使用“不归零码NRZ (Non Return Zero)”。同步沿用位填充来生成,这就意味着在五个i按需的低电平之后就会传输放就会插入一个填充为。在接收端会将该填充位去掉。

如果以上任何一个机制检测到了一个或多个错误,会通过发送一个“错误帧”来终止当前传输。这样就阻止了其他节点接受消息,保证了整个网站数据的一致性。在终止传输发生了错误的消息之后,发送者会自动重新尝试传输(自动重传)。节点可能重新开始竞争访问总线。

然而,当存在有缺陷的节点时,上述有效的、高效的方法可能会导致所有的消息(包括正确消息)会被终止。如果不采用自我监督机制,会导致总线的阻塞。因此,CAN协议提供了一种区分间歇性错误、永久性错误、节点本地失效的机制。该机制使用统计评估节点错误情况的方法,目的是识别节点自身的缺陷并可能进入一种模式,在这种模式下CAN网络不会受到负面影响。可能会关闭节点,来防止其他节点的消息被错误的识别为不正确的消息。

本文地址: http://blog.csdn.net/donhao/article/details/6730174

你可能感兴趣的:(网络,测试,ide,扩展,引擎,extension)