CAN协议介绍(Controller Area Network Protocol)
CAN协议是一个被定义为 ISO11898的国际标准,除了CAN协议本身外,CAN协议的一致性测试也被定义为ISO16845标准,它描述了CAN芯片的互换性。** 数据交换原理 **
CAN是一种基于广播的通讯机制,广播通讯依靠报文(Message)的传送机制来实现,因此CAN并未定义站及站地址,而仅仅定义了报文,这些报文依靠报文确认区(Identifier)来进行识别,一个消息报文确认区在一个网络中必须是唯一的,它不但描述了某一报文的意义,而且还定义了报文的优先级,当很多站都在访问总线时,优先级是很重要的,因此,CAN是通过报文的确认区来决定报文的优先级的。
CAN使用地址访问的方法,使网络系统的配置变得非常灵活,用户很容易可以增加一个新的站到一个已经存在CAN网络里,而不用对已经存在的站进行任何硬件或软件上的修改,但必须此新增的站为完全的接收者,这样它将不会对网络上各节点的通讯产生影响。
**实时数据传送**
在实时处理系统中,通过网络交换紧急报文存在很大的不同:一个迅速改变的值,如发动机负载必须频繁的进行传送且要求延迟比其它的值如发动机温度要小。
发送的报文都要和其它的不太紧急的报文进行优先级的比较,在系统设计中,报文的优先级体现在写入报文确认区的二进制值,这些值不能被动态的改变。确认区中的值越小,其报文的优先级越高(也就是0比1的优先级高)。
总线访问冲突是依靠对每个企图发送数据的站的确认区进行位元仲裁(Arbitration)来解决的。冲突的发生与“wired and”机制相一致,即显性状态覆盖隐性状态。仲裁失败的站会失去总线控制权,所有失去总线控制权的站都会自动变为接收者,接收高优先级的报文,它们不再企图发送报文,直到总线重新空闲。
发送请求在整个系统中按报文的重要性来排序处理,当总线负荷较重的时候这会带来很多好处,因为总线访问的优先权是基于报文本身的,因此可以节约很多总线时间,在实时系统中降低了传送的延迟。
**消息的帧格式(Frame format)**
CAN协议支持两种帧格式,它们只是在确认区存在差异,一种被称为CAN标准帧,在CAN2.0协议的Part A进行定义,标准帧支持11bit的确认区长度,;另一种称为CAN扩展帧,在CAN2.0协议的Part B进行定义,支持29bit的确认区。
¤¤ CAN标准帧: ¤¤
CAN标准帧格式以一被称为“Start of Frame(SOF)”的起始位开始,接下来是“仲裁区(Arbitration field)”,仲裁区由确认区和“远程传送请求(RTR)”组成,RTR位用于区分数据帧和被称为“远程帧”的数据请求帧。接下来的“控制区(Control field)”包括了确认扩展位(IDE),用于区别CAN标准帧和CAN扩展帧,同样,“数据长度代码(DLC)”用于表示接下去的“数据区(Data field)”中数据的字节数,如果报文用于远程帧,DLC就包含所请求数据的字节数。“数据区”可以达8字节。报文的完整性由接下来的“循环冗余校验码(CRC)”来保证。而“应答区(ACK)”则有应答槽(ACK slot)和ACK定界符(ACK delimiter),应答槽中的位元会被接收到正确的报文的站填充并发送到总线上,接收者不需要判断报文的有效性便可以应答正确的报文,即无论是否与自己有关的报文,接收者都会填充应答槽并进行发送。报文结束于“帧结束(EOF)”位,“帧间隔(IFS)”定义了一个两个数据帧之间的最小位元数,一般不小于3bit。如果没有任何站企图对总线进行访问,则总线会一直保持空闲状态。
¤¤ CAN扩展帧¤¤
扩展帧中的报文与标准帧相似,不同之处仅是所使用的确认区长度,确认区由已存在的11bit确认区(称为基本确认区)和18bit扩展区(称为标识扩展区)组成,标准帧与扩展帧的不同来自于对IDE位的使用。当IDE为显性时,则报文作为标准帧来发送,当IDE位为隐性时报文作为扩展帧来发送。当两种格式报文同时出现在总线上,并且具有相同的确认区或基本确认区,那判断报文优先级的方法通常为:标准帧的报文总是比扩展帧的报文优先级高。
支持扩展帧格式的CAN控制器(CAN Controller)同样也能发送和接收CAN标准帧,当仅仅支持标准帧的CAN控制器被用在网络上时,则仅只有标准帧能在整个网络上传送,扩展帧将不能被识别,但是有些只支持标准帧的CAN控制器可以识别扩展帧并且忽略它们(参考CAN2.0 B Passive)
**检测和信号错误**
不同于其它总线系统,当错误产生时CAN协议不能立即使用应答报文来取代错误信号,对于错误侦测CAN协议有完整的三种报文级机制:
* 循环冗余检测(CRC):CRC在报文结束时增加一个冗余检测位来保证帧信息安全,接收者会重新计算CRC值并与报文中的位做对比,如果不一样则发生CRC错误。
* 帧检测(Frame check):这种机制将接收的报文与固定的帧的格式和大小作比较,来确定所接收的报文的结构。帧检测所检测到的错误称为“格式错误(format errors)”。
* ACK错误:已经接收的帧都要被所有的接收者做应答,如果报文发送者没有收到应答信息则发生一个ACK错误。
CAN协议也提供两种位元级的错误侦测机制:
* 监视(Monitoring):发送者可以通过监视总线电平信号来检测错误。每个传送的站都可以监视总线电平并检测传送位与接收位的不同,对于全局性的错误和只基于发送者的错误都可以被检测到。
* 位填充(Bit stuffing):单一的位编码可以在位元级进行检测。CAN使用一种保证最大有效位元的“非归零(NRZ)”编码来表示位元。其同步边沿信号由位填充来产生,即5个连续相同的位元后,发送者会自动插入一个反向的填充位元到位元组中,接收者自动识别此填充位元并将其删除,以取得实际的位元组。
如果至少一个站使用上述机制发现一个或多个错误,则发送“错误标志(error flag)”来取消当前的传送,阻止其它站继续接收报文,以确保通过网络的数据连贯性,一个错误的报文传送被取消后,发送者自动重新尝试发送(自动重发),并重新进行总线访问权的竞争。
页:
[1]