CAN总线协议(Controller Area Network),控制器局域网总线,是德国BOSCH(博世)公司研发的一种串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。

CAN通讯是异步通讯,没有时钟信号线来保持信号接收同步,是半双工通信,无法同时发送与接收,在同一时刻,只能有一个节点发送数据,其余节点都只能接收数据。它有CAN_HIGH与CAN_LOW两条信号线组成。

闭环总线网络

ISO11898标准,闭环、短距离、高速、最高速度可达1Mbps,最长距离40m。

开环总线网络

ISO11519-2标准,开环、传输距离远、最高速度125Kbps,最远距离1km。

CAN总线信号----差分信号

CAN总线上信号表现为电压形式,通过CAN_H和CAN_L线上的电位差来表示CAN信号。

显性电平比隐形电平优先级要高(逻辑0比逻辑1优先级高)

ISO11898(高速)CAN的差分信号            

 不同标准的CAN信号差

CAN协议的波特率与位同步

由于CAN通讯协议并没有时钟信号线,所以各个节点之间要约定好特定的波特率进行通讯,特别的时候我们还需要使用位同步。

位时序:

位时序就是一个数据位的时序,位时序的大小=1/波特率

位时序分解图

波特率的计算:

CAN协议帧

CAN有5中协议帧类型,分别是数据帧、遥控帧、错误帧、过载帧、间隔帧。

数据帧

发送单元想接收单元传输数据的帧

遥控帧

接收单元向具有相同ID的发送单元 请求数据的帧

错误帧

当检测到错误时,向其他单元通知错误的帧

过载帧

通知其他发送端元:本节点没没做好接受准备

间隔帧

将数据帧及遥控帧与前面的帧分开

 

数据帧分为标准帧和扩展帧,下图是数据帧的类型及结构:

帧起始:有单个显性位组成,总线空闲时,发送节点发送起始帧,其他接收节点同步于该帧起始位。

帧结束:由7个连续的隐性位组成。

仲裁段:

  CAN-bus没有规定节点的优先级,但通过仲裁段 ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。标准ID为11位,扩展ID为29位。

  标准ID的仲裁段由 11位ID + 1位RTR组成。RTR是远程帧发送标识位,RTR为显性表示此帧为数据帧,为隐性表示此帧为远程帧。

  扩展ID的冲裁段由 11位ID + 1位SRR + 1位IDE + 18位ID + 1位RTR 组成。SRR是远程帧请求位。IDE是标识符扩展位,IDE为显性表示该帧为标准数据帧,为隐性表示该帧为扩展数据帧。

  仲裁方式:

    假设节点A、B、C都发送都发送了标准数据帧,他们竞争总线的过程如下图所示:

 仲裁机制

    从该过程得出结论:帧ID值越小,优先级越高

控制段:

  控制段共6位。

  标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成。

  扩展帧控制段则由保留位r1、r0和DLC组成。保留位用隐性电平填充。

数据段:

  一个数据帧传输的数据量为0-8个字节。传输时MSB先传输。

CRC段:

  由CRC校验值+1位CRC界定符组成。CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。一般情况下,CRC校验由CAN控制器的硬件完成,不需要由mcu的软件代码实现。

ACK段:

  由ACK值+1位ACK界定符组成。当一个 接收节点 接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。(所以数据帧里的ACK 是接收节点的)

 

CNA的过滤模式

 

   列表模式和掩码模式

 

    列表模式:

 

      把你关注的CAN ID填到列表中,接收的时候只关注列表中的CAN ID,如果CAN ID不在列表中则不接收该ID报文。

 

    掩码模式:

 

      只关注CAN ID中的指定位,不符合指定位则不接受该CAN ID报文。掩码模式计算过程,类似下图:

 

列表模式和掩码模式的对比

 

模式

过滤

数量

列表模式

能精确过滤每个指定的CAN ID

有数量限制

掩码模式

取决于屏蔽码,无法精确到每一个CAN ID,部分不期望的ID有时候也会收到

取决于屏蔽码,最多无上限