目录
2.1.2 事件驱动(11898-4另外增加了时间触发机制)
参考出处
CAN控制器的位同步过程_can位同步_DingUXiu的博客-CSDN博客
CAN 总线数据链路层 & 总线同步机制简析_通过中断或者can载波同步_HHHulk的博客-CSDN博客
一、CAN物理层
1.1 通讯节点
CAN总线上可以挂载多个通讯节点,节点之间的信号通过总线传输,实现节点间通讯。
CAN协议不对节点进行地址编码,而是对数据内容进行编码,所以节点个数理论上不受限制,只要总线的负载足够即可,而且可以通过中继器增强负载。
CAN通讯节点由一个CAN控制器(Controler)和CAN收发器(Transver)组成。
1.1.1 控制器(Controler)
根据需要接受的message数量,如果数量多,需要object storage,少则不需要。
Object Storage(对象存储)通常指的是用于存储CAN通信相关的配置、状态和数据的内存区域。这些内存区域被组织成一个或多个对象(Object),每个对象包含特定类型的信息。
1.1.2 CAN收发器(Transver)
本文将介绍低速can收发器,高速can收发器,以及它们对应的总线逻辑。
1.1.2.1 低速can收发器
低速CAN收发器是一种专门用于低速CAN(Controller Area Network)通信的收发器。低速CAN通常指的是传输速率较低的CAN网络,例如标准模式(100 kbit/s)和低速模式(10 kbit/s)。这些低速CAN通信通常用于汽车的辅助系统、工业自动化和其他一些对通信速率要求不高的应用。
①传输速率:0-125k。
②不需要终端电阻。
③差分电平:
11898-3 对应低速can收发器
1.1.2.2 高速can收发器
高速CAN收发器是一种专门用于高速CAN(Controller Area Network)通信的收发器。高速CAN通常指的是传输速率较高的CAN网络,例如快速模式(400 kbit/s)、高速模式(1 Mbit/s)和超高速模式(5 Mbit/s)。这些高速CAN通信通常用于汽车的主要网络(CAN-Bus)、工业控制系统和其他需要高数据传输速率的应用。
① 传输速率:0-1M。
② 需要120Ω终端电阻。
③ 差分电平:
11898-2 对应高速can收发器
④ 抗干扰能力:
8 kV ESD(Electrostatic Discharge)保护。
8 kV ESD(Electrostatic Discharge)保护指的是该收发器具备对静电放电的保护能力,能够抵御高达8千伏的静电放电。
推荐增加共模扼流圈(Common Mode Choke)。
共模扼流圈(Common Mode Choke)是一种被广泛用于高速CAN(Controller Area Network)通信的电子元件,用于滤除共模干扰和提高信号的抗干扰能力。
1.1.2.3 总线逻辑
关于电平,逻辑1是隐性,逻辑0是显性,而多节点同时发送时,遵行线and逻辑。
例如下图,全1(隐)则1,有0(显)就0。
1.2 CAN 协议中的差分信号
在 CAN 总线中,必须使它处于隐性电平 (逻辑 1) 或显性电平 (逻辑 0) 中的其中一个状态。假如有两个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。
1.2.1 I2C总线的简单特点介绍
I2C总线的特点包括以下几点:
-
双线制:I2C总线由两根线组成,分别为数据线(SDA)和时钟线(SCL)。SDA负责传输数据,而SCL用于传输时钟信号,控制数据的传输速率。
-
主从设备结构:I2C总线采用主从结构。在一个I2C通信中,通常有一个主设备(Master)和一个或多个从设备(Slave)。主设备负责控制整个通信过程,而从设备则根据主设备的指令来响应。
-
多设备共享总线:I2C总线允许多个设备共享同一组数据线和时钟线。每个设备都有一个唯一的地址,主设备通过这个地址来选择要与哪个从设备通信。
-
支持多种传输速率:I2C总线可以以不同的传输速率进行通信,通常有标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s)和超高速模式(5 Mbit/s)等。
-
起始和停止条件:数据传输始于主设备发送起始条件(Start),而在通信结束时,主设备发送停止条件(Stop)。在传输数据过程中,数据变化都在时钟信号的上升沿或下降沿进行。
-
应答机制:每个数据字节的传输都由接收设备(主设备或从设备)发送应答信号来确认是否正确接收了数据。
-
多主设备:I2C总线允许存在多个主设备,但在同一时刻只能有一个主设备控制总线。如果需要多主设备竞争总线控制权,则需要使用冲突检测和仲裁机制。
我觉得上面链接的up主关于I2C协议的介绍非常好,推荐大家去观看一下~
二、CAN协议层
2.1 communication(通信)
在CAN(Controller Area Network)通信协议中,"communication"(通信)指的是数据帧的传输和交换过程,以及通过CAN总线进行的设备之间的信息传递。
2.1.1 去中心化,分布式原则
总线空闲时间任一节点均可竞争发送消息,消息将被广播,由节点自己决定是否过滤。
2.1.2 事件驱动(11898-4另外增加了时间触发机制)
节点的发送和接收动作是由特定事件触发的,而不是基于固定的时间触发机制。
这种事件驱动的设计使得CAN通信非常适用于实时数据传输和控制应用,因为节点只在需要发送或接收数据时才会进行相关操作,而不会浪费时间和资源在空闲期间的通信上。
ISO 11898-4,全名为ISO 11898-4:2015,是国际标准化组织(ISO)发布的一项标准,定义了在控制器区域网络(CAN)通信中使用的物理层规范之一。
2.1.3 通信矩阵
在CAN(Controller Area Network)通信中,通信矩阵是一种表示不同CAN节点之间通信关系的概念。通信矩阵描述了各个CAN节点之间能够进行数据通信的情况,它是一种图表或矩阵形式,用于显示CAN网络中节点之间的通信连接。
观察上图,你会发现,同一时刻,某一个节点并不能又是接收方又是发送方。
2.2 CAN的报文种类及结构
CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。
2.2.1 报文的种类
原视数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾端加上CRC校验标签,应答标签和传输结束标签,把这些内容按照特定的格式打包好,就可以用一个通道表达各种信号了。
2.2.2 数据帧的结构
数据帧是在 CAN 通讯中最主要、最复杂的报文,用于主动传输数据。
接下来,我将按照顺序一一介绍这些帧的定义:
① sof 1bit
SOF段(Start OfFrame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,用于通知各个节点将会有数据传输,其他节点通过帧起始信号的电平跳变来进行硬同步。
② id(identifier) 11bit
定义消息优先级/总线竞争力,数字越低优先级越高。
当有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输。
仲裁段的内容主要为:
①本数据帧的ID信息(标识符)
②数据帧具有标准格式和扩展格式两种,区别在于ID信息的长度。标准格式的ID为11位,扩展格式的ID为29位,它在标准ID的基础上多出18位。
在CAN协议中,ID起着重要的作用——决定数据帧发送的优先级,也决定着其他节点是否会接收这个数据帧。CAN协议不对挂载它之上的节点分配优先级和地址,对总线的占有权也是由信息的重要性决定的。即对于重要的信息,会打包上一个优先级高的ID。如果总线上同时出现显性电平和隐形电平,总线的状态会被置为显性电平,CAN正是利用这个特性进行仲裁。
若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐形电平,则会失去对总线的占有权,进入接收状态。
在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元 1 发送的为隐性电平,而此时节点单元 2 发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元 2 竞争总线成功,这个报文得以被继续发送出去。
仲裁段ID的优先级也影响着接收设备对报文的反映。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会接收到其他节点发出的有效数据,因此,CAN控制器大多具有根据ID过滤报文的共嗯,他可以控制自己只接受某些ID的报文。
仲裁段除了报文ID外,还有RTR,IDE和SRR位。
③ RTR 1bit
RTR位(Remote Transmission Request Bit),译作远程传输请求位,它是**用于区分数据帧和遥控帧**的,当它为显性电平时表示数据帧,隐形电平时表示遥控帧。
④ SRR位 1bit
SRR位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR位。由于扩展帧中的SRR位为隐形位,RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
⑤ dlc 4bit
表示数据场的字节长度,数据段为数据帧的核心内容,它是节点要发送的原始信息。
⑥ crc场 16bit
为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,含1bit隐性位的界定符,从sof到数据场的所有数据进行encode,且又由发送方计算并添加到数据帧中。
一旦接收节点算出的CRC码与收到的CRC码不同,则他会发送反馈出错信息,利用错误帧请求它重新发送。
CRC部分的计算一般由CAN控制器硬件完成,出错时的处理由软件控制最大重发数。在CRC校验码滞后,有一个CRC界定符,它为隐形位,主要作用是把CRC校验码与后面的ACK段间隔起来。
⑦ ack场 2bit
ACK段包含一个ACK槽位,和ACK界定符位。类似12C总线,在ACK槽位中,发送节点发送的是隐形位,而接收节点在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开,
由接收方进行确认,收到消息给出一个显性位。
如果一个节点都没有确认收到消息,发送方监听此位为隐形位(1bit)就会报错。
⑧ IDE 1bit
IDE位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时为标准格式,隐形电平时为扩展格式,扩展帧的id可以有29位。
扩展帧和标准帧格式不同,不能存在于同一can网络内。
⑨ EOF 7bit
EOF段(End Of Frame),帧结束段由发送节点发送的7个隐形位(7bit)表示结束 。
⑩ ITM 3bit
帧间隔,实际不属于帧内的区域,先列出来,必须等待帧间隔才能发送消息。
⑪ remote frame远程帧
用于请求数据,很少用,格式如下:
⑫ error frame错误帧
CAN数据帧中的错误帧(Error Frame)是指在CAN(Controller Area Network)通信过程中发生了错误而被发送出来的一种特殊数据帧,格式如下:
三. 总线同步
首先,首次同步由sof发起。
为什么要同步?因为没有单独的时钟线,且因为是NRZ编码,不是曼侧斯特编码(自带时钟同步)。
NRZ编码的优点是简单且易于实现,因为它不需要时钟恢复,仅需要对信号的电平进行解码即可。然而,NRZ编码的一个缺点是当连续传输相同的二进制位时,会导致直流分量的存在,这可能会对信号传输的可靠性产生影响。
那什么是重同步呢?
重同步利用位填充机制(bit stuffing),它的原理是每五个同样极性的位后面会被插入一个反极性位,确保接收节点采集到足够的边沿进行重同步:
tips:利用隐形位到显性位的边沿进行重同步
新插入的反极性位也会被用于下一次插入计算,且位填充机制作用范围为(sof-crc)。
四. 总线竞争
总线竞争是为了解决多个节点在同一时间点发消息的问题,其中,在CAN通信协议是通过id来竞争优先权的。
每个节点在进行发送时都会对总线电平进行监控,以下是一个例子:
send 0 出现 1 :报错
send 0 出现 0 :继续
send 1 出现 1:继续
send 1 出现 0:竞争失败,转为接收方
那么,能够实现通过id来进行竞争的原因是什么呢?是因为总线遵循线与逻辑【0为显性,1位隐性】,且节点在发送时会监听总线电平,进行判断。
竞争失败者将会进行什么操作呢?
首先,针对行为上来说,竞争失败的节点会自动在检测到总线空闲的第一时间再次尝试发送,但这样也存在一定的风险,在网络负载率很高,也就是消息很多的时候,低优先级的消息可能会延迟很久才能发送成功。
以下是竞争流程图的图例:
五. 数据保护
5.1 物理设计方面
在物理设计上就要加强emc(是指电子产品或电气设备在规定的电磁环境中,按设计要求正常工作的能力。)
5.1.1 选择NRZ编码的原因
NRZ编码可以减小干扰发射,例如图示:
5.1.2 双绞线相关信息
双绞线canh canl差分信号消除共模干扰,且建议每米扭转30次
5.1.3 终端电阻相关信息
终端电阻消除电缆线高频传输时传输末端的反射,以下是tja1042的接线推荐:
把120的电阻拆开成两个,配合电容可以形成两路低通滤波器(允许低频通,高频被电容导入地)
5.2 总线逻辑错误检测机制 detection
总线逻辑包含五种检测机制,他们分别是:
5.2.1 stuffcheck
接收节点检测,检测是否有位填充错误,出现6个同极性位就报错。
5.2.2 formcheck
接受节点检测,检测crc界定符和ack界定符以及eof区域是否出现显性位。
5.2.3 bit monitorint
发送节点检测,发送显性位,但总线是隐性位就报错。
5.2.4 crc
接收节点检测,接收方会快速生成一个值,与发送方的crc段进行比对,不一致就报错。
5.2.5 ack check
发送方检测,接收方会在收到消息后在ack应答位给出一个显性电平,如果发送方检测到该位为隐性,则报错。
从区域上看如下:
5.3 总线逻辑错误处理机制 handling
data consistency,也就是数据一致性。
根据此特性,检测到错误的节点会让所有人都知道此刻有一个错误。
5.3.1 错误帧相关信息
关于errorflag段:
① 六个显性电平(制造一种位填充错误)。
② 第一个errorflag是由发现错误的节点发送的,他发送完后就继续发送错误界定符,直到总线出现连续的8个隐性位则错误帧完毕。
③ 第二个errorflag是有第一个errorflag引起,由其他节点发送,该区域可能会和第一个errorflag区域重叠,原因是第一个errorflag还没发完,总线就已经形成六个显性位,从未触发那些节点发送errorflag。
④ 错误界定符由8bit的隐性位构成。
5.3.2 错误跟踪机制 error tracking
为了避免总线被永久错误节点卡死,比如,这个节点由于本身的原因一直在报错,导致总线没法正常发送了,需要一种机制来进行鉴别并限制其功能,于是,我们便有了error tracking这样的错误跟踪机制。
它在每个controller里都会实现:
Error Active:默认初始状态,发现错误后会很积极主动地上报错误。
Error Passive:TEC or REC 计数超过127就进入此状态,此时,该节点发现错误后只会发送6个隐性位,不会把错误广播出去,并且,发送连续帧时,中间必须间隔8bit的延缓时间。
Fus Off:controller挂了,或者TEC大于255,就会进入这个状态,需要重启,或者等待128个11位隐性位电平。
如上图所示,发送错误计数器的情况如下:
① 成功发送一条消息 -1
② 检测到错误,如果是该节点是发送方,+8
接收错误计数器的情况如下:
① 检测到错误,如果该节点是接收方+1,如果是引起错误的接收方 +8
② 成功发送一条消息 -1
总结
这是我根据这些网址所整理的自己的笔记,如果有一些理解错误的地方请大佬们指点!!!