Jialong's Blog
沉潜 自由 追寻幸福
CAN总线
Controller Area Networking控制器局域网的详细介绍,包含该协议的物理层和数据链路层内容

概要

Controller Area Network

CAN总线由BOSCH公司开发,是一种多主控(Multi-Master)的现场总线系统,CAN网络的消息是广播式的,即同一时刻网络上所有节点侦测的数据是一致的,是一种基于消息广播模式的串行通信总线。

CAN总线的很多优点,使得它得到了广泛的应用,如传输速度最高到1Mbps, 通信距离最远到10km,无损位仲裁机制,多主结构。

CAN总线标准规定了物理层数据链路层,应用层标准由具体应用决定。

CAN物理层

连接在CAN总线上的设备叫做节点设备(CAN Node),CAN网络的拓扑一般为线型。线束最常用的是双绞线,线上传输为对称的差分电平信号

节点主要包括Host、控制器和收发器。

Host常集成有CAN控制器,CAN控制器负责处理协议相关功能,以减轻Host的负担。

CAN收发器将控制器连接到传输媒介。通常控制器和总线收发器通过光耦或磁耦隔离,这样即使总线上过压损坏收发器,控制器和Host设备也可以得到保护。

在发送数据时,CAN控制器把要发送的二进制编码通过CAN_Tx线发送到CAN收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low输出到CAN总线网络。接收数据过程,相反。采用差分信号,可以取得更好的电磁兼容效果。因此,CAN总线物理传输媒介只需要两根线。

下图为一CAN收发器应用的例子:

CAN总线示例

高速CAN总线最高信号传输速率为1Mbps,支持最长距离40m。ISO11898-2要求在高速CAN总线两段安装端接电阻RL(端接电阻一般为120Ω,因为电缆的特性阻抗为120 Ω,为了模拟无限远的传输线。)以消除反射。低速CAN最高速度只有125Kbps,所以ISO11898-3没有端接要求。

差分信号

CAN总线采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。在差分信号中,逻辑0和逻辑1是用两根差分信号线的电压差来表示。

当处于逻辑1,CAN_High和CAN_Low的电压差小于0.5V时,称为隐性电平(Recessive)

当处于逻辑0,CAN_High和CAN_Low的电压差大于0.9V,称为显性电平(Dominant)

CAN总线遵从“线与”机制:“显性”位可以覆 盖“隐性”位;只有所有节点都发 送“隐性”位, 总线才处于“隐性” 状态。这种“线与”机制使CAN总线呈现显性优先的特性。

CAN数据链路层

在SPI通信中,片选、时钟信号、数据输入及数据输出这四个信号都有单独的信号线。而CAN使用的是两条差分信号线,只能表达一个信号。简洁的物理层决定了CAN必然要配上一套更为复杂的协议。如何用一个信号通道实现同样甚至更强大的功能,答案就是对数据或操作命令进行打包。

通信机制

多主机(Multi-Master)

安全敏感的应用(如汽车动力)对通信系统的可靠性要求很高。将总线能否正常工作归结到单一节点是非常危险的,比较合理的方案是对总线接入的去中心化,即每个节点都有接入总线的能力。这也是CAN总线采用多主控(Multi-Master)线性拓扑结构的原因。

在CAN总线上,每个节点都有往总线上发送消息的能力,而消息的发送不必遵从任何预先设定的时序,通信是事件驱动的。只有当有新的信息传递时,CAN总线才处于忙碌的状态,这使得节点接入总线速度非常快。CAN总线理论最高数据传输速率为1Mbps,对于异步事件反应迅速,基本对于ms级别的实时应用没有任何问题。

寻址机制

CAN总线不设定节点的地址,而是通过消息的标识符(Identifier)来区别消息。这种机制虽然会增加消息的复杂度(增加标识符),但是节点在此情况下可以无需了解其他节点的状况,而相互间独立工作。在总线上增加节点时仅需关注消息类型,而非系统上其他节点的状况。这种以消息标识符寻址的方式,让总线上增加节点变得更加灵活。

总线访问 CSMA/CD+AMP

多路载波侦听+基于消息优先级的冲突检测和非破坏性的仲裁机制(CSMA/CD+AMP)

  • CSMA(Carrie Sense Multiple Access)指的是所有节点必须都等到总线处于空闲状态时才能往总线上发送消息;

  • CD+AMP(Collision Detection + Arbitration on Message Priority)指的是如果多个节点往总线上发送消息时,具备最高优先级的消息获得总线。

  • 多路载波侦听:网络上所有节点以多点接入的方式连接在同一根总线上,且发送数据是广播式的。网络上各个节点在发送数据前都要检测总线上是否有数据传输:若网络上有数据,暂时不发送数据,等待网络空闲时再发;若网络上无数据,立即发送已经准备好的数据。

  • 冲突检测:节点在发送数据时,要不停的检测发送的数据,确定是否与其他节点数据发送冲突,如果有冲突,则保证优先级高的报文先发送。

  • 非破坏性仲裁机制:通过ID仲裁,ID数值越小,报文优先级越高

发送低优先级报文的节点退出仲裁后,在下次总线空闲时自动重发报文。

高优先级的报文不能中断低优先级报文的发送。

报文接受过滤

CAN控制器大多具有根据ID过滤报文的功能,即只接收某些ID的报文。节点对接收到的报文进行过滤:比较消息ID与选择器(Accepter)中和接受过滤相关位是否相同。如果相同,接收;如果不相同,则过滤。

报文种类及结构

在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签。把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了。

各种各样的标签,起到了协同传输的作用。当整个数据包被传输到其他设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数据包就被称为CAN的数据帧。

为了更有效的控制通信,CAN一共规定了5中类型的帧,帧也称为报文。

帧用途
数据帧 用于发送单元向接收单元传输数据的帧
远程帧 用于接收单元向具有相同ID的发送单元请求数据的帧
错误帧 用于当检测出错误时,向其他单元通知错误的帧
超载帧 用于接收单元通知其尚未做好接受准备的帧
帧间隔 用于将数据帧及遥控帧与前面其他帧分离开的帧

数据帧

共分为7个段:

  • 帧起始(SOF):标识一个数据帧的开始,固定一个显性位。用于同步,总线空闲期间的任何隐性到线性的跳变都将引起节点进行硬同步
  • 仲裁段:内容为本数据帧的ID信息
  • 控制段:r1和r0为保留位,默认设置为显性位。DLC(Data Length Code)段用二进制编码表示本报文的数据段包含多少字节,由4位组成,DLC3-DLC0,表示的数字为0-8.
  • 数据段:数据帧的核心内容,有0-8个字节长度。
  • CRC段:报文包含了一段15位的CRC校验码,来检验是否出错。
  • ACK段:包含确认位和界定符。在发送节点发送时为隐形位,当接收节点收到正确报文时,将其覆盖为显性。
  • 帧结束段(EOF):由发送端发送7个隐形位表示结束。

同步

CAN总线使用位同步的方式来确保通信时序,以及对总线的电平进行正确采样。

位时序

同步

分为硬同步和重新同步。

参考

部分内容转载自:知乎-Choris-一口气从零读懂CAN总线


最后修改于 2021-07-12