欢迎光临散文网 会员登陆 & 注册

K课堂 | CAN总线基础知识汇总, 一文搞懂! (下篇)

2023-02-15 19:10 作者:KVASER克萨CAN总线  | 我要投稿

本篇内容根据Kvaser《CAN协议教程》内容进行整理。《CAN协议教程》简要阐述ISO 11898-1和ISO 11898-2标准,主要介绍CAN在汽车设计、工业自动化控制和许多其它应用中的基础知识,希望能对CAN总线技术的学习者有所帮助。

内容框架如下:


上篇(已更新,进入Kvaser主页专栏查看


介绍CAN总线

CAN报文

  • CAN报文/ 报文类型/ 标准CAN vs.扩展CAN/ 基本CAN和完整CAN/ 总线仲裁和报文优先级/ 报文寻址和标识/ 标识符值注意事项

CAN物理层

  • CAN总线/ 不同的物理层/ 最大总线速度/ 最小总线速度/ 最大电缆长度/ 总线端接/ 电缆/ CAN连接器


下篇(本篇内容)


CAN示波器图片

CAN连接器

  • 9 针 DSUB/ 5 针Mini-C/ 6针 Deutsch DT04-6P

CAN位时序

  • 位布局/ 时钟同步/ 位时序寄存器计算

CAN错误处理

  • CAN 怎样处理错误/ 错误检测机制/ 错误限制机制/ 总线故障模式

高层协议

  • 不同的高层协议/ 其他相关协议和标准

图1是一幅来自最普通的 ISO11898CAN 总线的图片,以 1Mbps 速率运行。收发器是82C251。也就是说,物理层是由 ISO 11898 指定的。

图 1

测量在 CAN_H(CAN 高位)和 GND(接地)之间进行。注意,静态和隐性总线电压约为 2.5V。

传送显性位时,电压升高到约 3.5V。

图2是同一总线,但是测量在 CAN_L(CAN 低位)和 GND(接地)之间进行:

图 2

图3是另一个报文,以 125kbps 速率发送。报文的(11 位)标识符是 300,或十六进制12c。仔细查看就可识别报文中的第一个位。

图 3

图4这是一幅更复杂的图片。它显示与上面例子相同的报文。仍然是 11 位标识符 300,速率仍然是 125kbps,但是 CAN 总线上没有端接。CAN 电缆是短扁平带状线缆。

图 4

那么,发生了什么情况?

这是 125kbps,所以一位是 8 微秒。

➡ 首先传送节点发送一个起始位。这是一个逻辑‘0’,即一个显性电平。

➡ 然后传送标识符。十进制 300 是十六进制 12c,或者二进制 001 0010 1100。前两个 0 会顺利传送。这解释了图片中看到的 24 微秒的显性电平。

➡ 然后应该传送一个‘1’。但是因为总线没有端接,所以斜率上升不是预期的结果。传送节点现在会认为它在总线上看到的是‘0’。

➡ 因为这种情况发生在仲裁阶段,所以传送节点将停止传送,其认为有其它节点正在传送。总线现在将变为隐性状态,因为实际上没有节点在传送。

➡ 在 6 个隐性位之后,传送节点和接收节点都将检测到填充错误,并开始进行错误处理。这时已经过了 80 微秒(1 个起始位,2 个‘0’,1 个误解位和 6 个隐性位,总共 10 个位,等于80 微秒)。

➡ 检测到填充错误的所有节点现在将开始传送错误帧。这种情况下错误帧为被动模式,因为在捕获到上方图像之前产生了许多错误,所以传送节点是被动错误模式。被动型错误帧和主动型错误帧相似,但是使用隐性电平进行传送,所以在总线上不可见。

➡ 被动型错误帧占用 6 位时间。

➡ 然后所有节点等待 8 个隐性位的周期,称为错误定界符。

➡ 然后所有节点等待 3 个隐性位的周期,称为间歇。

➡ 对以上数字求和,结果是 1+6+6+8+3 = 24 个隐性位 = 192 微秒(如图)

⚫ 经验:始终端接 CAN总线!反射不一定有害,但是损坏的边缘形状将破坏通信。

图5是同一 CAN 总线在另一时间尺度中的情况:

图 5

CAN 总线大约长 2 厘米(8 英寸)。下冲和震荡是可见的,但是在这种情况中显然不重要。这次,平缓的上升斜率是问题所在。

图6里是相同的设置,但是这次传送节点和接收节点都是主动错误模式:

图 6

发生了什么情况?

➡ 如上图所示,传送了三个‘0’(耗时 24 微秒),下一位被误解,所以传送节点认为它已经失去了仲裁。

➡ 传送节点等待 6 位,然后检测到一个填充错误。误解的位和这 6 个位需 56 微秒。

➡ 传送节点和接收节点现在开始传送错误帧。它是 6 个显性位(48 微秒)。

➡ 传送错误帧的节点现在等待 8 个隐性位,但随着上升斜率的坏处,第一个位被误解。节点将认为这是另一个节点在传送错误帧,所以将忽略它。

➡ 当总线回到隐性电平时,所有节点等待 8 位。

➡ 然后是 3 个隐性位的间歇。

➡ 3+9 = 12 位 = 96 微秒,如图所示。

➡ 然后传送节点重新尝试并得到相同的结果。一段时间以后传送节点进入被动错误模式,并将按照前面所述那样运行。

图7是另一幅图片。在此设置中,CAN 总线上只有一个节点(正确端接)。该节点试图传送一条报文,但是没有其它节点在侦听。

图 7

那么会发生什么情况?

➡ 首先传送节点发送整个报文。

➡ 传送节点期望在 ACK 时隙中填充一个显性电平。但是,因为没有其它节点在侦听,没有任何ACK 到达,所以传送节点检测到一个确认错误。

➡ 然后传送节点传送一个被动错误标志(上图中,尝试发送了几秒钟,所以不再是主动错误模式,而是被动模式)。

➡ 被动错误标志后面跟随一个错误定界符和间歇。

➡ 因为这个节点尝试发送一个报文但是操作失败,它必须再等待 8 位才能开始新的传送。这种情况在 CAN 规范中称为“暂停传送”。

➡ 传送节点还必须将其传送错误计数增加 8。但是这是 CAN 规范中的特殊情况,只有当传送节点是主动错误模式时才会发生。当传送节点进入被动错误模式时,它不会增加其传送节点错误计数(这种情况中),而是会不断重试传送。

所以你在上图中看到的是一个正在发送的报文,然后是短暂停顿,它是错误标志、错误定界符、间歇和暂停传送的总和。然后报文被不断重传……

1. 9 针 DSUB

CiA推荐使用这种连接器布局,几乎是行业标准。

如果供电,电压范围应该为+7至+13V,额定电流为100mA。模块提供一个公接头,内部必须连接引脚3和6。

引脚编号适用于接头侧视图的公接头或焊接侧视图的母接头。为了方便记住引脚编号,可留意CAN_LOW 的引脚号小,而 CAN_HIGH 的引脚号大。

2. 5 针 Mini-C

DeviceNet 和 SDS 都使用这种接头,并且这两种协议恰好兼容。

模块含公接头。输入电压为 24V+/-1%。

注意:在 DeviceNet 规范版本 1.x 中,图 9.13 中母接头的编号顺序错误。规范 2.0 及更高版本的编号顺序正确。

3. 6 针 Deutsch DT04-6P


CANHUG 推荐将其用移动液压应用场合中。

模块端为公接头,总线端为母接头。目前对于供电没有建议值。

1. 位布局

出于时序目的,CAN 总线上的每一位都划分成至少 4 个时间份额。时间份额逻辑上划分成四组或四段:

▪ 同步段

▪ 传播段

▪ 相位段1

▪ 相位段2

以下是 CAN 数据位的图片:

总是一个时间份额长的同步段用于时钟同步。总线上的数据改变时,预计会出现一个位边界。需要传播段来补偿总线线路中的延迟。

如果需要保持时钟同步,相位段可能会缩短(相位段 1)或延长(相位段 2)。

在相位段 1 和相位段 2 之间的边界采样总线电平。

大部分 CAN 控制器还提供在一个位期间进行三次采样选项。这种情况中,在采样点之前的两个时间份额的边界上进行采样,结果取决于择多译码(至少是 82527 的情况)。

2. 时钟同步

为了调整片上总线时钟,CAN 控制器可以将一个位的长度缩短或延长整数个时间份额。这些位时间调整的最大值称为同步跳转宽度(SJW)。

硬同步在起始位从隐性到显性转换时产生。位时间从该边界重新开始。

当报文中的同步段内不发生位边沿时,会发生重新同步。其中一个相位段被缩短或延长,取决于信号中的相位误差;可以使用的最大量由“同步跳转宽度”参数确定。

3. 位时序寄存器计算

大多数 CAN 控制器允许编程器使用以下参数设置位时序:

▪ 时钟预分频器值

▪ 采样点前的时间份额数

▪ 采样点后的时间份额数

▪ 同步跳转宽度(SJW)中的时间份额数

通常为此提供两个寄存器:btr0 和 btr1。但是,不同控制器之间略有差异,因此请仔细阅读数据表。

恩智浦(恩飞公司)82c200 和 SJA1000 的寄存器布局如下:

➡ BRP0..BRP5 设置时钟预分频器值

➡ SJW0..SJW1 设置 SJW 的长度

➡ TSEG10..TSEG13 设置采样点之前的时间份额数(不包含起始位)

➡ TSEG20..TSEG22 设置采样点之后的时间份额数

➡ 如果要获取三个样本,则 SAM 设置为 1,如果一个样本就已足够,则设置为 0。

注意:这些参数的实际值比写入寄存器的值多1。

示例:如果提供给 SJA1000 的振荡器信号是 16MHz,并且我们想要 250kbps 的比特率,采样点接近整个位的 62%,以及 SJW 为 2 个时间份额,那么我们可以设置:

BRP=4,其给出时间份额长度为 2*4/16000000s= 500ns,并且

TSEG1=5,其给出采样点前有 5 个时间份额,并且

TSEG2=3,其给出采样点后有 3 个时间份额。

每个位将包含 5+3=8 个时间份额,这样所需的比特率为 1/(8*500ns)=250kbps。寄存器值应该为:

btr0 = (SJW - 1) * 64 + (BRP -1) =

(2-1)*64 + (4-1) =

67 =

0×43

btr1 = SAM * 128 + (TSEG2 - 1)* 16 + (TSEG1 - 1) =

0*128 + (3-1)*16 + (4-1) = ("4″ 因为起始位不包括在内)

35 =

0×23

采样点为位的 5/8=62.5%。

1. CAN 怎样处理错误

错误处理内建在 CAN 协议中,对 CAN 系统的运行十分重要。错误处理的目标是检测 CAN 总线上出现的报文中的错误,从而传送节点可以重传出错的报文。总线上的每个 CAN 控制器都会尝试检测报文中的错误。如果发现错误,发现节点将传送一个错误标志,从而中断总线通信。其它节点将检测错误标志导致的错误(如果它们尚未检测到初始错误)并采取合适的措施,例如丢弃当前报文。

每个节点维护两个错误计数器:传送错误计数器和接收错误计数器。有几条规则规定这些计数器如何递增或递减。实质上,检测到故障的传送节点增加其传送错误计数器比侦听节点增加其接收错误计数器要快。这是因为很有可能是传送节点发生了故障!当任何错误计数器增加到超过某个值时,节点将首先进入“被动错误”,也就是说,它在检测到错误时不会主动阻止总线通信,然后“离开总线”,这意味着节点根本不参与总线通信。

使用错误计数器,CAN 节点不但可以检测故障,而且可以执行错误限制。

2. 错误检测机制

CAN 协议定义了五种以上不同的方法来检测错误。其中两种在位级别工作,另外三种在报文级别工作。

▪ 位监控

▪ 位填充

▪ 帧检查

▪ 确认检查

▪ 循环冗余检查

01. 位监控

CAN 总线上的每个传送节点都会监控(也就是回读)传送的信号电平。如果位级别实际读取的与传送的不同,则发出信号指示位错误。(仲裁过程中不会发出位错误)。

02. 位填充

当一个节点已经发送了相同级别的五个连续位时,它将向输出位流添加相反电平的第六位。接收方将删除这个额外的位。这样做是为了避免总线上出现过度的直流电成分,但它同时也给予了接收方检测错误的额外机会:如果总线上出现五个以上相同级别的连续位,会发出信号指示填充错误。

03. 帧检查

CAN 报文的一些部分具有固定的格式,也就是说,标准明确定义了何种级别和何时必须发生。(那些部分是 CRC 定界符、ACK 定界符、帧结束以及间歇,但是间歇还有一些另外的特殊错误检查规则)。如果 CAN 控制器在这些固定字段中的一个中检测到无效值,将发出组成错误。

04. 确认检查

正确接收报文的总线上的所有节点(不管这些节点是否对报文内容“感兴趣”)预期将在报文中所谓的确认时隙中发送一个显性电平。发送节点在此将发送隐性电平。如果发送节点无法在确认时隙中检测到显性电平,会发出确认错误的信号。

05. 循环冗余检查

每个报文都包含一个15位的循环冗余校验和(CRC)。节点如果在报文中检测到与自己计算所得不同的 CRC,将发出 CRC 错误的信号。

3

错误限制机制


总线上的每个 CAN 控制器都将在每个报文中尝试检测以上列出的错误。如果发现错误,发现节点将传送一个错误标志,从而中断总线通信。其它节点将检测错误标志导致的错误(如果它们尚未检测到初始错误)并采取合适的措施,例如丢弃当前报文。

每个节点维护两个错误计数器:传送错误计数器和接收错误计数器。有几条规则规定这些计数器如何递增或递减。实质上,检测到故障的传送节点增加其传送错误计数器比侦听节点增加其接收错误计数器要快。这是因为很有可能是传送节点发生了故障!

节点开始时处于主动错误模式。当两个错误计数器中的任何一个计数超过 127 时,节点将进入称为被动错误状态。当传送错误计数器达到 255 以上时,节点将进入总线关闭状态。

➡ 主动错误节点将在检测到错误时发送主动错误标志

➡ 被动错误节点将在检测到错误时发送被动错误标志

➡ 总线关闭节点不会在总线上传送任何内容

增加和减少错误计数器的规则略显复杂,但是原理比较简单:传送错误给出 8 个错误点,而接收错误给出 1 个错误点。正确传送和/或接收的报文会导致计数器减少。

示例(略简化):假设总线上节点 A 运气不好。每当 A 尝试发送报文时,它都会失败(无论什么原因)。每次发生这种情况,它将其发送错误计数器增加 8 并发送主动错误标志。然后它将尝试重传报文,但是一直失败。

当传送错误计数器超过 127 时(也就是在 16 次尝试之后),节点 A 进入被动错误模式。不同之处在于它现在将在总线上传输被动错误标志。被动错误标志包含 6 个隐性位,不会破坏其它总线通信,所以其它节点不会侦听到有关总线错误的反馈。但是,A 继续增加其发送错误计数器。当它升高到 255 以上时,节点 A 最终放弃传送并进入总线关闭模式。

其它节点怎样响应节点 A?对于 A 传送的每个主动错误标志,其它节点将其自身接收错误计数器增加 1。当 A 进入总线关闭时,其他节点的接收错误计数器的计数远低于错误被动极限值 127。

每次正确收到一条报文,这个计数将减 1。但是,节点 A 将停留在总线关闭模式。

大部分 CAN 控制器将为两种状态提供状态位(和相应的中断):

▪ “错误警告” – 一个或两个错误计数器的计数超过 96

▪ “总线关闭”,如上所述。

部分是这样,但不是所有!控制器还为被动错误状态提供了一个位。一些控制器还可以直接访问错误计数器。

CAN 控制器在发生错误时自动重传报文的特性有时候会很烦人。市场上至少有一种控制器(飞利浦公司生产的 SJA1000)允许对错误处理完全人工控制。

4. 总线故障模式

ISO11898 标准列出了 CAN 总线电缆的几种故障模式:

▪ CAN_H 中断

▪ CAN_L 中断

▪ CAN_H 短路到电池电压

▪ CAN_L 短路到接地

▪ CAN_H 短路到接地

▪ CAN_L 短路到电池电压

▪ CAN_L 短路到 CAN_H 线路

▪ CAN_H 和 CAN_L 在同一个位置中断

▪ 丢失到终端网络的连接

对于故障 1-6 和 9,建议减小 S/N 比率保持总线继续工作。对于故障 8,建议保持产生的子系统继续工作。对于故障 7,可以选择减小 S/N 比率继续工作。

实践中,使用 82C250 类型收发器的 CAN 系统无法在发生故障 1-7 时继续工作,在发生故障 8-9时可能无法继续工作。

但是,存在诸如 TJA1053 等有容错能力的驱动程序可以处理所有故障。通常,获得这种容错能力的代价是最大速度受到限制。对于 TJA1053,最大速度是 125kbps。

CAN 标准在基本级定义硬件(“物理层” - 有几种)和通信(“数据链路层”)。CAN 协议本身只是规定如何使用共享通信介质将小数据包从 A 点传输到 B 点。它不包含流量控制,数据传输大于可容纳 8 字节的报文,节点地址,通信建立等。

为了管理系统内的通信,需要更高层协议(HLP)。术语 HLP 来源于 OSI 模型及其七个层次。HLP通常规定如下:

▪ 启动行为

▪ 如何在系统内不同的节点中分发报文标识符

▪ 如何编译数据帧的内容

▪ 系统内的状态报告

1. 不同的高层协议

CAN 总线有很多(几十种)高层协议。最常见的如下:

▪ CanKingdom

▪ CANopen

▪ CCP/XCP

▪ DeviceNet

▪ MilCAN

▪ NMEA 2000®

▪ OSEK/VDX

▪ SDS

▪ J1939: 简介和标准概述

2. 其他相关协议和标准

和 CAN 关系密切的协议和标准非常多。下面列出了几种:

▪ LIN 总线

▪ J1587 

▪ J1708 

▪ J2534 

▪ RP1210A, RP1210 B


K课堂 | CAN总线基础知识汇总, 一文搞懂! (下篇)的评论 (共 条)

分享到微博请遵守国家法律