CAN协议
CAN示波镜图片
这是一张来自非常常见的ISO 11898 CAN总线的图片(以1 Mbit/s的速率运行)。收发器是82C251;换句话说,物理层属于ISO 11898中指定的一种。
测量在CAN_H和地线之间完成。请注意,静态和隐性总线电压在2.5 V左右波动。发送显性位时,电压升高到大约3.5V。
现在,采用相同的总线,但是测量在CAN_L和地线之间完成:
此处是另一条以125 kbit/s发送的报文。报文的(11位)标识符是300(十六进制值为12C)。仔细观察,您将能够识别报文中前面的那些位。
下方是一张较难理解的图片。它显示与前面相同的报文,仍然是(11位)标识符(值为300),仍然是125 kbit/s的传输速率,但是在CAN总线上没有任何终端。CAN线缆是纯线缆的短暂运行。
那么,发生什么情况?这是125 kbit/s,所以一个位是8微秒。
- 首先,发送方发送一个起始位。这是一个逻辑“0”(也就是显性位)。
- 然后发送标识符。十进制300的十六进制是12C,二进制是001 0010 1100。前面两个零顺利发送。这解释了图片中看到的24微秒的显性电平。
- 然后应该发送“1”。但是,因为总线没有终断节点,所以斜率与本来应该的值不同。发送节点现在将认为它在总线上看到一个“0”。
- 因为这在仲裁阶段发生,发送方将停止发送 – 它认为有其它节点正在发送。现在,因为事实上没有任何节点在发送报文,所以总线将变成隐性。
- 在6个隐性位之后,发送方和接收方都将检测到填充错误,然后开始进行错误处理。这时,已经过去80微秒(一个起始位,两个“0”,一个误解的位和六个隐性位,总共10个位,等于80微秒)。
- 所有检测到填充错误的节点现在都将开始发送错误帧。这个例子中,因为在捕获上方图片之前生成了许多错误,错误帧处于消极状态,所以发送方处于错误消极状态。消极错误帧与积极错误帧一样,但是以隐性电平发送,所以在总线上不可见。
- 消极错误帧延续了6个位的时间。
- 然后,所有节点都等待8个隐性位的时间,这称为错误分隔符。
- 然后,所有节点都等待3个隐性位的时间,这称为间歇。
- 把以上数值相加,我们得到1+6+6+8+3 = 24个隐性位 = 192微秒(参见图片!)。
职业道德:始终端接CAN总线!反射不一定会有害,但是边沿的不良形状将破坏通信。
下面是另一个时间刻度中的相同CAN总线:
CAN总线大约2分米(8英寸)长。信号下冲和上升都可见,但是在这个例子中并不重要。这次,缓慢的上升沿是罪魁祸首。
此处使用相同的设置,但是这次发送方和接收方都处于错误积极状态:
- 如上图一样,发送三个‘0’(花费24微秒),接下去的位被误解,所以发送方认为它已经仲裁失败。
- 发送方等待6位时长,然后检测到填充错误。误解的位和等待的6位花费56微秒。
- 发送方和接收方现在开始传输一个错误帧。它是6个显性位(48微秒)。
- 发送错误帧的节点现在等待8个隐性位的时长,但是,因为上升斜率出错,第一个位被误解。节点将认为这是另一个节点发送的错误帧,所以将忽略它。
- 当总线回到隐性电平时,所有节点等待8个位的时长。
- 然后是3个隐性位的间歇。
- 这样,正如图中所示,结果为3+9 = 12位 = 96微秒。
- 然后发送方再次尝试发送并得到相同的结果。一段时间以后,发送方进入错误消极状态,将如前所述那样运行。
下方是另一张图片。在此设置中,正确端接的CAN总线上只有单个节点。该节点试图发送一条报文,但是没有任何节点在侦听。
- 首先,发送方发送整条报文。
- 发送方期待确认槽中出现一个显性电平,但是因为没有任何节点在侦听,没有收到确认,所以发送方检测到一个确认错误。
- 然后发送方发送一个消极错误标志(因为在上方图片中,它已经尝试发送了几秒钟,不再处于错误积极状态,所以处于消极状态)。
- 消极错误标志后面跟随一个错误分隔符和间歇。
- 因为这个节点试图发送一条报文但是失败了,它必须等待另一个8位时长后才能开始新的传输。这在CAN规范中称为“挂起传输”。
- 发送节点还必须为其发送错误计数器加8,但是作为CAN规范中的特殊情况,这只有在发送方处于错误积极状态时才发生。当发送方进入错误消极状态后,它不会增加其发送错误计数器(本例中),随后将永久地尝试重传。
所以上图中看到的是一条被发送的报文,后跟一个短时的停顿(错误标志、错误分隔符、间歇和挂起传输的时长总和)。然后报文被不停的重传。