CAN 是什么?
CAN 是控制器局域网络(Controller Area Network)的简称,是 ISO 国际标准化的(异步)串行通信协议,被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
CAN 协议标准
ISO 标准
有 ISO11898 和 ISO11519-2 两种标准。两种标准的数据链路层定义相同,物理层不同。
- ISO11898
通信速度为 125kbps-1Mbps 的 CAN 高速通信标准。 - ISO11519
通信速度为 125kbps 以下的 CAN 低速通信标准。
ISO11898 和 ISO11519-2 的主要不同点:
其他标准
CAN 的特点
- 多主控制
总线空闲时,所有单元都可以开始发送消息。
最先开始发送消息的单元优先获得发送权。
当多个单元同时开始发送时,根据标识符(ID,非地址)决定优先级,会对各消息 ID 的各个位逐个进行仲裁比较,仲裁获胜(优先级最高)的单元可以继续发送消息,仲裁失败的单元立即停止发送并进行接收工作。 - 系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此,在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。 - 速度快,距离远
最高 1Mbps(距离 < 40m),最远可达 10Km(速率 < 5Kbps)。 - 具有错误检测、错误通知和错误恢复功能
所有的单元都可以检测错误(错误检测功能)。
检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。 - 故障封闭功能
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。 - 连接节点多
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
错误
单元始终处于 3 种状态之一。这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。
- 主动错误状态
主动错误状态是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标志。 - 被动错误状态
处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。 - 总线关闭态
总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
CAN 协议
帧的种类
数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有 11 个位的标识符(ID),扩展格式有 29 个位的 ID。
总线电平:显性电平和隐性电平。
显性电平逻辑值为 0,隐性电平逻辑值为 1。
总线上执行逻辑上的线与。显性电平比隐性电平更强。
所有类型帧数据都从 **MSB(最高位)**开始传输。
数据帧
数据帧由 7 个段构成,依次是:
帧起始 - 表示数据帧开始的段
仲裁段 - 表示该帧优先级的段。标准帧 ID(11 位 ID,ID28 ~ ID18) 和扩展帧(ID = 基本 ID:ID28 ~ ID18 + 扩展 ID:ID17 ~ ID0)的基本 ID 禁止高 7 位都为隐性。(禁止设定:ID=1111111XXXX)
控制段 - 表示数据的字节数及保留位的段。保留位(r0、r1)必须以显性电平发送,但接收方可以接收显性、隐形及任意组合的电平。数据长度码(DLC)0 ~ 8 对应数据字节数 0 ~ 8 字节。(接收方对 DLC = 9 ~ 15 的情况并不视为错误)
数据段 - 数据的内容,可发送 0~8 个字节的数据
CRC 段 - 检查帧的传输错误的段。CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。
ACK 段 - 表示确认正常接收的段。发送单元在 ACK 段发送 2 个位的隐形位。接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束(“发送 ACK” 或者 “返回 ACK”)。
帧结束 - 表示数据帧结束的段。由 7 个位的隐性位构成。
遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误标志 - 包括主动错误标志(6 个位的显性位,处于主动错误状态的单元检测出错误时输出的错误标志)和被动错误标志(6 个位的隐性位,处于被动错误状态的单元检测出错误时输出的错误标志)两种。
错误界定符 - 由 8 个位的隐性位构成。
过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载标志 - 6 个位的显性位。
过载界定符 - 8 个位的隐性位。
间隔帧
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
间隔 - 3 个位的隐性位。
总线空闲 - 隐性电平,无长度限制(0 亦可)。本状态下,可视为总线空闲,要发送的单元可开始访问总线。
延迟传送(发送暂时停止) - 8 个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
优先级的决定
在总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
- 数据帧和遥控帧的优先级
具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。 - 标准格式和扩展格式的优先级
标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。
位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
- 发送单元的工作
在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。 - 接收单元的工作
在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
错误的种类
错误共有 5 种,多种错误可能同时发生。
- 位错误
- 填充错误
- CRC 错误
- 格式错误
- ACK 错误
错误帧的输出
检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。
位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段,这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
- 同步段(SS)
- 传播时间段(PTS)
- 相位缓冲段 1(PBS1)
- 相位缓冲段 2(PBS2)
位同步