总线拓扑
CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平。
CAN连接图:图
CAN的特点
1)多主控制
在总线空闲时,所有的单元都可以开始发送消息。
2)消息的发送
CAN协议中,所有的消息都是以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。有两个以上的单元同时开始发送消息时,根据标识符(ID)决定优先级。ID并不表示发送的目的地,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可以继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
3)系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其他单元的软硬件及应用层都不需要改变。
4)通信速度
根据整个网路的规模,可设定适合的通信速度。在同一个网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其他的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
5)远程数据请求
可以通过发送“遥控帧”请求其他单元发送数据。
6)错误检测功能、错误通知功能、错误恢复功能
错误检测功能:所有的单元都可以检测错误。
错误通知功能:检测出错误的单元会立即同时通知其他所有单元。
错误恢复功能:正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止。
7)故障封闭
CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发送持续数据错误时,可将引起此故障的单元从总线上隔离出去。
8)连接
CAN总线是可以同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
错误
单元始终处于3种状态之一。
1)主动错误状态
主动错误状态是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标志。
2)被动错误状态
被动错误状态是易引起错误的状态。
- 处于被动错误状态的单元虽可以参加总线通信,但是为不妨碍其他单元通信,接收时不能积极地发送错误通知。
- 处于被动错误状态的单元即使检测出错误,而其他处于主动错误状态的单元如果没有发现错误,整个总线也被认为是没有错误的。
- 处于被动错误状态的单元检测出错误时,输出被动错误标志。
- 处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。
3)总线关闭态
总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
4)错误状态和计数值相关表
单元错误状态 | 发送错误计数值(TEC) | 逻辑关系 | 接收错误计数值(REC) |
主动错误状态 | 0-127 | 且 | 0-127 |
被动错误状态 | 128-255 | 或 | 128-255 |
总线关闭态 | 256- | none |
单元错误转换图:图
CAN协议的基本概念
CAN协议涵盖了ISO规定的OSI基本参考模型中的传输层、数据链路层和物理层。
数据链路层分为MAC子层和LLC子层,MAC子层是CAN协议的核心部分。数据链路层的功能是将物理层受到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体的说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在CAN控制器的硬件中执行。
物理层定义了信号实际的发送方式、位时序、位的编码方式及同步步骤。但具体来说,信号电平、通信速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义。这些必须由用户根据系统需求自行确定。
CAN协议及标准规格
CAN协议经过ISO标准化后有ISO11898标准和ISO11519-2标准两种。这两种标准对于数据链路层的定义相同,但物理层不同。
1)ISO11898
ISO11898是通信速度为125kbps-1Mbps的CAN高速通信标准。目前,ISO11898追加新规约后,成为ISO11898-1新标准。
2)ISO11519
ISO11519是通信速度为125kbps以下的CAN低速通信标准。ISO11519-2是ISO11519-1追加新规约后的版本。
物理层主要不同点:图
通信速度和最大总线长度:图
物理层特征:图
CAN协议内容
帧的种类
通信是通过以下五种类型的帧进行的。
- 数据帧
- 遥控帧
- 错误帧
- 过载帧
- 帧间隔
数据帧和遥控帧有标准格式和扩展格式两种。标准格式有11个位的标识符(ID),扩展格式有29个位的ID。
帧 | 帧用途 |
数据帧 | 用于发送单元向接收单元传送数据的帧 |
遥控帧 | 用于接收单元向具有相同的ID的发送单元请求数据的帧 |
错误帧 | 用于当检测出错误时向其他单元通知错误的帧 |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧 |
帧间隔 | 用于数据帧及遥控帧与前面的帧分离开来的帧 |
数据帧
数据帧由7个段构成,如图所示:
数据帧构成图
图中D表示显性电平、R表示隐性电平。
(1)帧起始:表示帧开始的段。标准帧和扩展帧都是由1个位的显性电平表示。
(2)仲裁段:表示数据的优先级的段。标准格式和扩展格式在此的构成有所不同。
数据帧仲裁图:图
标准格式的ID有11位。从ID28到ID18被依次发送。禁止高7位都为隐性。禁止高7位都为隐性。(禁止设定:ID=1111111XXXX)
扩展格式的ID有29个位。基本ID从ID28到ID18,扩展ID由ID17到ID0表示。基本ID和扩展格式的ID相同,禁止高7位都为隐性。(禁止设定:ID=1111111XXXX)
其中RTR位用于标识是否是远程帧(0:数据帧,1:远程帧),IDE位为标识符选位(0:使用标准标识符,1:使用扩展标识符),SRR位为代替远程请求位,为隐形位,它代替了标准帧中的RTR位。
(3)控制段:控制段由6个位构成,表示数据段的字节数。标准格式和扩展格式构成有所不同
数据帧控制段图:图
保留位(r0、r1):保留位必须全部以显性电平发送。但接收方可以接收显性、隐形及其任意组合的电平。
数据长度码(DLC):数据的字节必须为0-8字节,但接收方对DLC=9-15的情况并不视为错误。
(4)数据段(标准、扩展格式相同):数据段可以包含0-8字节的数据。从MSB(最高位)开始输出。
(5)CRC段:由15个位的CRC值和1个位的CRC界定符(用于分隔的位)构成。CRC计算的范围包括帧起始、仲裁段、控制段、数据段。
(6)ACK段:ACK段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位构成。
发送单元的ACK:发送单元在ACK段发送2个位的隐形位。
接收单元的ACK:接收到正确消息的单元在ACK槽发送显性位,通知发送单元正常接收结束。正称作“发送ACK”或者”返回ACK“。发送ACK的是在即不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。所谓正常消息是指不含填充错误、格式错误、CRC错误的消息。
(7)帧结束:由7个位的隐形位构成。
遥控帧
遥控帧是没有数据段的数据帧。
遥控帧图:图
遥控帧和数据帧不同:
- 遥控帧的RTR位为隐形位,没有数据段。
- 没有数据段的数据帧和遥控帧可以通过RTR位区别开来。
遥控帧的数据长度码(DLC)以所请求数据帧的数据长度码表示。
错误帧
过载帧
帧间隔
优先级的决定
位填充
位填充是为了防止突发错误而设定的功能。当同样的电平持续5位时则添加一个位的反型数据。
1)发送单元的工作:在发送数据帧和遥控数帧时,SOF~CRC段间的数据,相同电平如果持续5位,在下一个位(第6个位)则要插入1位与前5位反型的电平。
2)接收单元的工作:在接收数据帧和遥控数帧时,SOF~CRC段间的数据,相同电平如果持续5位,需要删除下一个位(第6个位)再接收。如果这个第6个位的电平与前5位相同,将被视为错误并发送错误帧。
错误种类
错误帧的输出
位时序