一、前言
项目做的是单板系统的监控/控制分离功能,由管理板来收集上报各个线卡板的单板状态,两者之间用到的通讯就是利用CAN协议栈去进行消息交互。这篇文档主要就是介绍zephyr封装的CAN接口所用的CAN协议栈内容,目前CAN的协议栈文档主流的有10来篇,包括ISO11898、ISO11519、ISO15765和ISO14229四个系列,不过毕竟CAN总线是针对汽车领域提出来的协议,很多协议内容我们这边并不关心,zephyr目前主要是用ISO11898系列以及ISO15765-2,这几篇协议文档主要是定义CAN的物理层、数据链路层、传输层和网络层四层内容的定义,包括了CAN总线的电气特性和网络传输策略。这篇文档就是着重讲解下zephyr涉及的CAN的协议栈内容,以及我个人的一些理解。
还有就是帖子引用的插图和描述有一些转自网友帖子,如原贴主人看见介意引用的话可留言我这边删除。
二、ISO11898系列(物理层、数据链路层)
ISO11898系列总共有4篇文档,分别介绍CAN:
Part 1: 数据链路层和物理层
Part 2: 高速率媒介接入单元
Part 3: 低速、容错、媒介依赖接口
Part 4: 时刻触发通讯
zephyr主要是用到ISO11898的第一部分以及基于ISO 11898(CAN)用于控制器 - 设备接口的工业通信子系统 协议EN 50325-4,下面我们先讲讲ISO11898的部分。当然,zephyr还支持CAN-FD,所以CAN-FD的部分也会在这一章节提到。
电气特性:
首先先介绍一下协议规定的CAN的物理特性。CAN 有两条通信线路,一条为CAN_HIGH,另一条为CAN_LOW,顾名思义,两条线路会存在电压差,存在电压差时CAN_HIGH表现为高电平,CAN_LOW表现为低电平,显性电平对应逻辑 0,此时CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1,此时CAN_H 和 CAN_L 之差为 0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在 CAN 总线的起止端都有一个 120Ω的终端电阻,来做阻抗匹配,以减少回波反射。具体如下如下图所示:
CAN总线的帧及组成:
CAN帧的各组成部分:
帧起始--表示数据帧开始的段。
仲裁段--表示该帧优先级的段。
控制段--表示数据的字节数及保留位的段。
数据段--数据的内容,一帧可发送 0~8 个字节的数据。
CRC 段--检查帧的传输错误的段。
ACK 段--表示确认正常接收的段。
帧结束--表示数据帧结束的段。
CAN的帧类型包括五种-----数据帧、远程帧、错误帧、过载帧、间隔帧
1.数据帧:用于发送单元向接收单元传送数据的帧,帧结构如下图所示,SOF为起始帧,在数据帧中表现为1位的显性电平(逻辑0),仲裁段包括ID和RTR,ID在遇到多节点同时发送时候仲裁使用,ID越小优先级越高,仲裁失败的节点立马由发送状态转为接听状态;RTR标记该帧是否为远程帧,为隐性电平(逻辑1)时为远程帧。IDE标识是否使用扩展字段,为隐性电平时有效,有效后数据帧将变为图中所示的扩展格式,ID将多出18位。DLC为数据字段长度。EOF为帧结束标识,占7位隐性电平。
2.远程帧:用于接收单元向具有相同 ID 的发送单元请求数据的帧,远程帧的帧ID不是发送该帧者的发送ID,而是接收者的发送ID。RTR为隐性电平。
3.错误帧:用于当检测出错误时向其它单元通知错误的帧,错误类型有五种:
CRC错误:发送节点计算得到的CRC值与接收到的CRC值不同发生该错误
格式错误:传输的数据帧格式与任何一种帧格式不符
应答错误:发送节点在ACK阶段没接收到应答信号
位发送错误:发送节点在发送时发现总线电平与发送电平不同发生该错误
位填充错误:通信线缆上传输信号违反“位填充”规则时发生该错误
出现以上任一一种错误时节点讲发送错误帧。帧格式如下:
主动错误与被动错误又存在以下关系:
4.过载帧:当某个接收节点没有准备好接收下一帧数据时将发送过载帧给发送节点。
5.间隔帧:用于将数据帧及远程帧与前面的帧分离开来的帧,但过载帧和错误帧前面不会插入间隔帧,间隔帧没有格式。
CANID理解:
CANID其实可以理解成一种分配资源,每个设备都分配一个或多个ID,之后节点发报文时候就带上这个ID,CAN发的都是组播报文,接收节点根据该报文带的ID看是不是自己接收ID,是的话就接收该报文,至于接收ID设置则是节点通过接收过滤器设置,符合过滤器过滤的ID对应报文就会被接收。所以一个节点可以有多个发送ID,也可以有多个接收ID。下面举个例子:
A节点有发送ID:0x1、0x2,接收ID:0x101、0x102;
B节点有发送ID:0x101、0x102,接收ID:0x1、0x2;
C节点有发送ID:0x3;接收ID:0x1;
当A节点发出ID为0x1的报文,此时因为B和C接收节点都有0x1,所以该报文B和C都会接收;当B节点发出ID为0x101的报文时,因为只有A节点有0x101的接收ID,所以该报文只有A节点接收;当C节点发出ID为0x3,因为A、B都没有该接收ID,于是该报文无人接收。
接收方接收CAN帧:
接收方通过设置接收过滤器,在过滤器中设置接想要接收的CAN帧ID,由过滤器来过滤总线上的报文,匹配到过滤器中CANID相同的报文立马接收传入节点的接收BUFF。
CAN帧的ACK机制:
CAN的发送是个双向互动的过程,发送节点在发送数据的同时会对总线上数据进行回读以及ACK Slot的判定,接收节点在发送节点发送过程中需要及时确认报文的正确性并令总线上的ACK SLOT位置拉为显性,以告知发送节点数据正常接收。
CAN-FD特性:
CAN-FD 继承了传统 CAN 的主要特性,CAN-FD 对带宽和数据长度做了优化,是下一代汽车总线。CAN-FD 相比 CAN 主
要有一下几个优势:
1、更高的传输速率
CAN-FD 可以以更高的速率传输数据,仲裁段(ID 和 ACK)的速率和 CAN一样最高 1Mbps,保持不变,这样可以保证总线健壮可靠。但是 CAN-FD 帧数据段最高速率可达到8Mbps,这个技术叫做数据段波特率可变,CAN-FD 中 FD 的全称就是 Flexible Data-Rate。
2、更长的数据帧
CAN 的一帧只能发送 8 字节数据,而 CAN-FD 一帧最高可以发送 64 字节的数据,大大的提高了数据传输效率,以前需要分几帧传输的报文,现在一帧就可以传输了。
3、帧格式不同。CanFD新增了FDF、BRS、ESI位:
FDF:表示 CAN 报文还是 CAN-FD 报文;
BRS:表示位速率转换,该位隐性时,速率可变(即 BSR 到 CRC 使用转换速率传输),该位为显性时,以正常的 CAN-FD 总线速率传输(恒定速率);
ESI:表示发送节点状态。
4、ID长度不同。CAN FD标准帧ID长度可扩展至12bit,CAN的标准帧ID为11bit。
帧结构:
帧起始
CAN与CANFD使用相同的SOF标志位来标志报文的起始。帧起始由1个显性位构成,标志着报文的开始,并在总线上起着同步作用。
仲裁域
与CAN不同,CAN FD取消了对远程帧的支持,用RRS位替换了RTR位,为常显性。IDE用于区分标准帧和扩展帧。
控制域
CANFD与CAN有着相同的IDE,res,DLC位。同时增加了FDF、BRS、ESI三个bit位。FDF为隐性时,表示为CAN FD报文;
BRS为为速率转换开发,当其隐性时,速率可变,当其显性时,以正常的CAN-FD总线速率传输(恒定速率);
ESI用于表示错误状态,主动错误发送显性位,被动错误发送隐性位。
数据域
CAN FD兼容CAN的数据格式,同时最大还能支持12, 16, 20, 24, 32, 48, 64byte。
CRC
CAN FD对CRC算法进行了改进,CRC对填充位也加入了计算。在校验和部分为避免有连续位超过6个,就确定在第一位以及以后每4位添加一个填充位加以分割,这个填充位的值是上一位的反码,作为格式检查,如果填充位不是上一位的反码,就作出错处理。CAN FD的CRC场扩展到了21位。
ACK
ACK紧跟着CRC结束标识位。不同的是,CAN FD支持2bits的ACK的识别。
帧结尾
与CAN一样,CAN FD的帧结尾也为连续7位的隐性位。
三、ISO15765-2(网络层和传输层)
协议规定CAN总线应该具备一下特性:
1.多主机优先级的总线访问
2.非破坏性的竞争仲裁
3.通过接收过滤器的组播帧传输
4.远程数据请求
5.配置灵活性
6.全系统数据一致性
7.错误检测和错误信号
8.自动重传冲裁失败或者发生错误的帧
9.区分节点的临时错误和永久故障,以及对有缺陷的节点自动关机
通信模型
1.单帧通信
数据不足一帧长度(小于7字节)即会发送单帧,此时就跟物理链路层发送CAN帧一样。
2.多帧通信
一般需要传输的数据会超过1帧的长度,这时候就要对数据进行切片多帧传输。多帧传输模型如下图,发送方先发送一帧首帧,高速对方这个报文的总长度并发送部分数据,之后接收方根据自己的接收能力发送一帧流控帧,流控帧包括帧间间隔st和下次发送方一次性可传输的数据帧数量bs(bs为0表示发送方可以一次性传输完毕)。
帧格式
1.单帧–SF
2.首帧–FF
3.流控帧–FC
4.连续帧–CF