一、什么是CAN?
CAN是Controller Area Network的缩写,是ISO国际标准化的串行通信协议。CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
CAN协议的特点:
1、多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可以继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
2、系统柔软性。连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其它单元的软硬件和应用层都不需要做改变。
3、速度快、距离远。最高1Mbps(距离<40M)最远可达10KM(速率<5Kbps)。
4、具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其它所有单元(错误通知功能),正在发消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复的重新发送此消息直到成功发送为止(错误挥发功能)。
5、故障封闭功能。CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引次故障的单元从总线上隔离出去。
6、连接节点多。CAN总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟以及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互联连。
二、CAN的物理层特征
物理层特征如图所示:
CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。显性电平对应逻辑:0 CAN_H和CAN_L之差为2V左右。隐性电平对应逻辑:1 CAN_H和CAN_L之差为0V。
显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐性电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻来做阻抗匹配,以减少回波反射。
CAN通信是以以下5种类型的帧进行的:
其中,数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有11个位的标识符(ID),扩展格式有29个位的ID。其中最常用也是最复杂的是数据帧。
三、数据帧解析
数据帧介绍
数据帧由7个段组成:
1、帧起始:表示数据帧开始的段。
2、仲裁段:表示该帧优先级的段。
3、控制段:表示数据的字节数以及保留位的段。
4、数据段:数据的内容,一帧可以发送0~8个字节的数据。
5、CRC段:检查帧的传输错误的段。
6、ACK段:表示确认正常接收的段。
7、帧结束:表示数据帧结束的段。
1、帧起始。标准帧和扩展帧都是由1个位的显性电平表示帧起始。
2、仲裁段。表示数据优先级的段,标准帧和扩展帧格式在本段有区别,如图所示:
ID:高位在前,低位在后。
基本ID,禁止高7位都为隐性,即不能:ID=1111111XXXX。
RTR,远程请求位。0,数据帧;1,远程帧。
SRR,替代远程请求位。设置为1(隐性电平);IDE,标识符选择位。0,标准标识符;1:扩展标识符。
3、控制段。由6个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图所示:
r0,r1:保留位。必须以显现电平发送,但是接收可以是隐性电平。
DLC:数据长度码。0~8,表示发送/接收的数据长度(字节)。
IDE,标识符选择位。0,标准标识符;1,扩展标识符。
4、数据段。该段可包含0~8个字节的数据,从最高位(MSB开始输出)。标准帧和扩展帧在这个段的格式完全一样:
5、CRC段。该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的:
CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。(帧起始+仲裁段+控制段+数据段来做CRC计算)
接收方以同样的算法计算CRC值并进行比较,不一致时会通报错误。
6、ACK段。此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符两个位组成。标准帧和扩展帧在这个段的格式也是相同的:
发送单元ACK段:发送2个隐性位。
接收单元ACK段:接收到正确消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。称之为发送ACK/返回ACK。
注意:发送ACK的是既不处于总线关闭状态也不处于休眠状态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。正常消息是指:不含填充错误、格式错误、CRC错误的消息。
7、帧结束。由7个位的隐性位组成。标准帧和扩展帧在这个段格式完全一样。
总线仲裁:
同时多个单元发送数据时,总线仲裁过程:
规律:1、总线空闲时最先发送的单元获得发送优先权,一旦发送,其它单元无法抢占。2、如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级。
从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。
四、位时序(设置波特率)
位速率。由发送单元在非同步的情况下发送的每秒钟的位数为位速率。一个位一般可以分为如下四段:
同步段(SS)
传播时间段(PTS)
相位缓冲段1(PBS1)
相位缓冲段2(PBS2)
这些段又可由称为Time Quantum(Tq)的最小时间单位构成。1位分为4个段,每个段又由若干个Tq构成,这称为位时序。
位时间=1/波特率,因此,知道位时间,我们就可以知道波特率。
1位由多少个Tq构成、每个段又由多少个Tq构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设置采样点。