概述
CAN总线是BOSCH公司发布的一款针对汽车电子的总线协议,主要用于汽车各部件之间的通信以及对各部件进行检测。
1989年PHILIPS公司发布了CAN2.0标准
1991年ISO组织讲CAN总线协议列为标准的现场总线协议ISO11898
第一章:
要了解CAN总线的知识,必须实现了解NRZ编码,因为CAN总线的物理层使用的就是NRZ编码。NRZ编码的示例图如下图所示:

NRZ编码
NRZ编码存在的一个问题就是当连续传输n多个0或者n多个1时,发送者和接收者没法进行同步。 NRZI 编码(Non-Return-to-ZeroInverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。
USB 传输的编码就是 NRZI 格式,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1(NRZI 遇 0 翻转,遇 1 不变):NRZI编码如下图所示: NRZI编码 翻转的信号本身可以作为一种通知机制,而且可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB 这种通过差分线来传输的信号尤其方便. 但是同样,NRZ 和 NRZI 都没有自同步特性,但是可以用一些特殊的技巧解决。比如,先发送一个同步头,内容是 0101010 的方波,让接受者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号,就可以了。
在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 00000001,这个域通过 NRZI 编码之后,就是一串方波(复习下前面:NRZI 遇 0 翻转遇 1 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。
此外,因为在USB的NRZI编码下,逻辑0会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确.
但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是1000个逻辑1,经过USB的NRZI编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者999个1了。
USB 对这个问题的解决办法,就是强制插 0,也就是传说中bit-stuffing,如果要传输的数据中有7个连续的1,发送前就会在第6个1后面强制插入一个0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除6个连续1之后的0,就可以恢复原始的数据了。 而CAN协议当位流里有连续5个1或者连续5个0时,便在位流里插入一个补充位,而接收器则自动删除这个补充位,换句话说,最长等待5个bit的时间,各节点就可以进行同步。需注意连续6个相同的位表示ERRORFLAG, bit-stuffing的示意图如下所示:图中白色的为填充位
位填充示意图
关于NRZ编码就介绍到这里。下面我们将介绍CAN2.0的规范 第二章 CAN2.0规范 CAN2.0规范分为A和B两部分,其中A定义了标准帧,B定义了标准帧和扩展帧。 其中标准帧又分为四种: 数据帧 远程帧 过载帧 错误帧 数据帧: 标准数据帧的格式如图所示: 
标准数据帧示意图 有图可以看出数据帧由如下及部分组成: SOF 起始帧 ARBITRATIONFIELD 仲裁域 CTRLFIELD 控制域 DATAFIELD 数据域 CRC FIELD 校验域 ACKFIELD 确认域 EOF 终止帧 数据域的长度可以为0 MESSAGE ID 用于寻址,它在总线网络中是唯一的。CAN控制器一般都有一个验收码寄存器和验收屏蔽寄存器,当接收到消息ID时,控制器检查验收寄存器为1的位有哪些,那么就不去判断MESSAGEID的相应位,剩下的位如果和验收寄存器的值相等,那么就接收该消息。 MESSAGE ID号越小表示优先级越高,多个节点同时发送数据时总线通过该域进行仲裁,传输优先级高的节点继续传输,失去传输资格的节点在总线空闲时重新传输。仲裁的过程如下图所示: 
CAN仲裁过程示意图
如图,仲裁采用的是按位仲裁的方式,谁的大值出现的早谁就先退出仲裁。 INTERMISSIONFIELD 用于区区分开两个连续的帧 扩展数据帧的格式如下: 
两种帧的区别在于CTRLFIELD 中的识别符扩展位(IDE)
远程帧也分为两种:标准帧和扩展展,他们与数据帧的区别在于:
远程帧没有数据域
RTR位为recessivebit
其它完全一样。
错误帧只有当检测到CAN标准定义的错误时产生错误帧,错误帧的位数有6-12BIT,错误帧的示意图如下:

错误帧示意图
过载帧
一般情况下,如下几种情况会导致过载帧的出现
1、上次接收的数据帧未被CPU读取,又来了新的数据帧
2、CAN节点检测到帧间隔的第一位或者第二位为dominant位,在检测到dominant位后马上发出
3、CAN节点检测到错误帧的界定域或者过载帧的界定域存在dominant位,在检测到dominant位后马上发出。
过载帧示意图如下:

过载帧
暂时到这里,有了新的理解再持续更新
|