CAN之数据链路层协议

胡诌一番

大多数书籍一上来就是什么计算机OSI模型,什么CAN模型对比OSI模型。各种协议摆出来一大堆,让人摸不着头脑,这种东西说实在没什么用,底层链路层协议全部通过硬件实现了,你仅仅需要了解然后学会配置(驱动硬件)即可,没必要花大篇幅去学习一大堆鬼东西。重点应该放在上层协议之上(例如应用层协议)。这些观点可以适用于TCP/IP协议栈的学习。
对于CAN主要理解以下两点:
1、CAN2.0-A和CAN2.0-B标准协议也就是所谓的链路层协议,这些都是通过硬件实现,咱们就大概了解协议,然后学会配置STM32或其他设备相应的寄存器来实现CAN标准协议(驱动程序)。
2、CAN应用层协议,这个才是重点,软件实现。应用层协议其实可以自己定义,但是为了和其他公司的产品兼容,咱们就必须使用一种国际上定义的标准应用层协议。这里有很多,我们就学习使用比较多的CANOpen协议。

CAN2.0标准协议及STM32硬件配置

逻辑电平

CAN有两根线,CANH和CANL,硬件通过识别这两根线上的电平来确定总线数值是显性数值”0”,还是隐形数值”1”。如何识别及电平关系不需要明白,硬件给你处理。但是这里必须清楚一点就是显性和隐形同时发送,最后总线数值为显性数值0。

CAN总线帧格式

数据就是通过这种格式按位发送出去。

总线上总共有以下5种不同类型的帧。

帧类型 帧用途
数据帧 节点传送和接收数据的帧
远程帧 用于接收节点向具有相同ID的发送节点请求数据的帧
错误帧 当检测到错误向其他节点通知错误的帧
过载帧 接收节点通知其他节点自己还没准备好接收帧
帧间隔 用于将数据帧和远程帧与前面的帧分离开

数据帧(重点)

CAN之数据链路层协议_第1张图片

  • 帧开始:标志数据帧和远程帧的开始,有一个单独的显性位(0)组成。一个节点只有在空闲时,才允许发送数据。所有节点必须同步总线跳变沿。
  • 仲裁场:标准格式和扩展格式。包括识别符和远程发送请求位(RTR)。识别符长度是11位,发送顺序是ID10-ID0。最高的7位(ID10-ID4)必须不能全为隐形(1)。RTR位,数据帧为显性,远程帧为隐形。这里的显和隐实际对应数据的0和1,送到CAN控制器之后自动将0和1转换成对应的显性电平和隐形电平。
  • 控制场:6个位组成,包含数据长度代码和两个将来作为扩展用的保留位,所有保留位必须位显性。数据长度代码指示数据场中字节数量,因为4位,所以允许发送数据0-8字节
  • 数据场:实际的数据字段。
  • CRC场:包括CRC序列和CRC界定符。这里具体怎么计算不需要清楚,因为硬件实现了,仅仅知道这就是校验码而已,用于在接收端校验接收的数据是否正确。
  • 应答场:2bit,应答间隙和应答界定符。发送方发送两个隐性位。这个不需要管
  • 帧结束:每一个数据帧都有结束标识序列。由7个隐性位。
  • 上述最重要的信息就是数据字节最长是8。

远程帧

CAN之数据链路层协议_第2张图片

错误帧

错误帧由两个不同的场组成,硬件实现和软件无关。

过载帧

暂时不考虑,这硬件实现。

帧间隔

暂时不考虑,硬件实现。

仲裁场两种格式

CAN之数据链路层协议_第3张图片
标准格式:11位标识符,其余和前面一样
扩展格式:11位基本ID,18位扩展ID。基本ID定义扩展帧基本优先权。SRR为替代远程请求位,是隐性位。了解即可,不必追究。

总线仲裁过程(重点)

CAN总线上节点没有主从之分,所有节点级别都一样,可以发送也可以接收。只要总线空闲,发送节点就可以发送数据,发送节点不会指定由哪个一个节点接收,而是由接收节点自己过滤选择是否接收含有该标识符ID的数据,就像收音机一样,广播台发出信号都可以被听众收到,但是听众可以选择自己喜欢的台。

  • 回读:节点发送数据的同时,同时也再读取数据,并与自己发送数据对比。

  • 线与:如果同时有几个节点往CAN总线上传递信息,采取线与机制,也就是说除非所有的节点都发送1,总线上才会是1,只要有一个节点发送0,总线上就是0。如果一个节点A发送了1,而其他节点发送了0,那么总线上是0,节点A通过回读就会发现总线上的电平与自己发送的不一致,从而采取相应的措施(退出仲裁,报错等)。需要注意的是1和0由CAN_H和CAN_L两条线差分电压得来,并不是一条线传递1, 另一条线传递0。

  • 仲裁:总线空闲,最先开始发送消息的节点获得发送权,当多个节点同时发送数据,那么需要仲裁,通过线与和回读功能比较数据的标识符(从仲裁段第一位开始仲裁),标识符小的获得仲裁,标识符大的推出仲裁,转变为接收,并且不会在总线再次空闲前发送报文,也就是说当总线空闲时候,推出仲裁的帧才重新发送数据。

  • 数据帧和远程帧优先级:假如一个发送节点发送了远程帧请求A发送数据并且同时A节点也正在发送数据,那么二者标识符相同,需要仲裁。RTR为显性位的数据帧具有优先权,可以继续发送。

  • 标准格式和扩展格式优先级:从仲裁位开始仲裁,标准格式RTR位显性,牛逼,具有优先权可以继续发送。

报文重发与位填充

这里说了很多,但是都是硬件已经帮助你完成了,这里可以不用了解。直接忽略过去。。。。。

STM32配置CAN

CAN协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制。(其他几种帧都是由CAN控制器硬件实现的,我们也管不了)。而数据帧和远程帧最大的区别在于:远程帧没有数据域。数据帧分为标准数据帧和扩展数据帧,它们之间最大的区别在于:仲裁场的不同。
这里直接参考《STM32 CAN发送和接收过滤详解》。

参考文献:

《手把手教你学CAN总线》
《CAN_BusSpecificationV2.0中文版》
《STM32CAN发送和接收过滤详解》
这里数据链路层就这个样子了。。。。。不需要再进一步深入了。。。。。。

你可能感兴趣的:(CAN)