一、CAN总线是什么?
在早期车上的电控单元较少的时候,ECU采用的是点对点(point-to-point)的连接方式,即需要进行通讯的ECU之间采用硬线进行直接连接,专线专用,如下图所示。
采用这种方式的缺点有如下几点:
- 随着ECU的个数增加,线束的数量会大大增加,从而导致成本的增加,重量增加,整车布线的复杂度也会大大增加。
- 点对点的通信方式不便于通信进行扩展。
为了解决上述问题,二十世纪八十年代初德国Bosch公司开发了一种多主机局部网络串行通信协议 – CAN(Controller Area Network),并最终成为国际标准(ISO11898-高速CAN标准,ISO11519–低速CAN标准),随之CAN 总线(CAN Bus)应运而生,如下图所示。
从图中可以看出来,所有的Ecu通过一条CAN总线来进行通信,对比图1可以看出,这种方式大大减少了成本也降低了整车布线的复杂度以及整车重量。同时,总线拓扑具有良好的扩展性,有其他需要搭载的节点可以直接接入到总线上,譬如可以接入一个诊断仪来分析总线的通信情况以及错误的侦察。
但是这种方式也有一个缺点,因为所有的数据传输都在一条总线上,所以总线的带宽成为网络通信的一个瓶颈。
普通CAN的通信特点(CAN-FD和CAN-XL分别可以达到2 Mbit/s和10 Mbit/s):
- 高速CAN传输速度最高到1Mbps,低速CAN传输速度最高到125Kbps;
- 采用差分数据线,抗干扰能力强;
- 按照id优先级排序进行仲裁等。
波特率和CAN 总线长度的关系:
波特率(kbps) | 1000 | 500 | 250 | 125 | 100 | 50 | 20 | 10 | 5 |
---|---|---|---|---|---|---|---|---|---|
最大长度(m) | 40 | 130 | 270 | 530 | 620 | 1300 | 3300 | 6700 | 10000 |
二、CAN节点的内部结构组成
实际上CAN网络的拓扑一般为线型。线束最常用的是双绞线,线上传输为对称的差分电平信号。
1.CAN节点的差分电平
总线可以具有两种逻辑状态之一:隐性(recessive )或显性(dominant)。
-
在隐性状态下,VCAN_H和VCAN_L固定为平均电压电平,由总线终端决定。V_Diff(V_Diff = VCAN_H - VCAN_L ) 小于最大阈值。隐性状态在总线空闲或隐性位期间传输。
-
显性状态由Vdiff大于最小阈值的差分电压表示。显性状态覆盖隐性状态,并在显性位期间传输。
按照ISO11898标准,隐性状态时,CAN_H与CAN_L相等,幅值范围为2V-3V;显性状态时,CAN_H比CAN_L高2V左右。差分信号V_Diff的电平要求为隐性状态-0.5V-0.05V,显性状态1.5V~3V。
2.CAN节点的内部结构
- Microcontroller:负责与其他节点应用层的交互,当youECU需要传递数据时,Microcontroller会将数据发送给CAN-Controller;
- CAN-Controller:负责进行报文的封装,封装后以二进制码的形式发送给CAN-Transceiver;
- CAN-Transceiver:负责将二进制信号转换成电信号,将CAN_H和CAN_L拉到对应的阈值;
- 终端电阻Rr:保证信号在传输过程中的阻抗连续性,消除反射波效应;
- CAN节点:各个不同的ECU;
- CAN_H和CAN_L双绞线。
三、CAN节点的寻址方式
CAN节点的寻址方式定义了数据从哪里来到哪里去,确定数据发送和接收之间的关系,CAN节点的寻址方式分为两种,分别是物理寻址和广播寻址。
1.物理寻址
物理寻址其实是一种点对点(1:1)的寻址,即有明确的发送方和接收方。发送报文的头部包含目的地址(Destination address)和源地址(Source address)。
2.广播寻址
广播地址是一种一对多(1:n)的通讯方式,由一个节点发送至所有挂载在总线上的节点。接收的节点可以通过过滤(Filter)的方式决定是否接收此条广播信息。其中Filter存在在CAN-Controller中。
四、CAN总线访问机制
通过上面的介绍我们可以知道,所有的CAN节点都连在总线上没有主从之分,只要总线空闲,任何节点都可以发送信息,并且同一个时段只允许一个节点发送信息。那要是有好几个节点同时发信息很容易就会发生冲突,那么这种情况又该怎么解决呢?
1.多主控制
在总线空闲时多个单元都可以发送消息,而两个单元以上同时开始发送消息时,根据标识符(identifier 简称ID)决定优先级。在有访问冲突时,根据每个结点ID(类似于人的身份证号一样,且每个ID都是唯一的)的优先级来进行仲裁。优先级高的节点先发送,优先级低的等优先级高的发送完再发送,这样也不会破坏每个节点要发送的信息。
1.1 Wired-AND buslogik
首先我们来看总线上的线与逻辑,1和0与上0都为0,1与上1才等于1。
Node A | Node B | Bus level |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
1.2 Arbitration logic
Transmitter | Bus | Interpretation |
---|---|---|
0 | 0 | continue |
0 | 1 | Error |
1 | 0 | Stop |
1 | 1 | Continue |
1.3 仲裁举例
假设有A,B,C三个节点同时发送信息,他们会通过11bit的ID来进行仲裁,从图中可以看到在第四位的时候出现了不一致,这时候通过线与逻辑,总线上表现出来的为0,这时候节点会有一个回读机制,按照上面第二个表格的仲裁逻辑,Node A在回读时发现自己发送的1,但是总线上为0,所以这时Node A会停止发送,由发送节点变为接收节点,开始接收总线上发送的数据。
Node B和C回读时发现自己发送0,总线上也是0,所以按照仲裁逻辑继续发送,直到下一位出现不一致。最后只有Node B继续发送。
B节点发送完之后,如果没有别的节点加入,A和C会再次转变为发送模式,进行新一轮的仲裁。如果有别的节点加入,A和C会和新加入的节点再次进行新一轮的仲裁。
总结:从上面的例子可以看出ID前面的0越多其优先级会更高,把二进制转换成10进制,11bit可以表示的范围为0-2047,所以可以看出ID越小,优先级越高。
五、CAN报文结构
1.帧类型和格式
1.1 数据帧和遥控帧
Frame Types | Identifier | Data Field |
---|---|---|
CAN Data Frame(Standard Format) | 11 Bit | 0 up to 8Byte |
CAN Data Frame(Extended Format) | 29 Bit | 0 up to 8Byte |
CAN Remote Frame(Standard Format) | 11 Bit | no existing |
CAN Remote Frame(Extended Format) | 29 Bit | no existing |
从表中可以看出:
1.数据帧和遥控帧的区别在与遥控帧不携带有效的数据,只是一个远程的发送请求;
2.标准帧和扩展帧的区别在于他们的ID长度不一样,扩展帧可以表示的ID更多。
1.2 过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
- 过载标志
6个位的显性位(6个0)
过载标志的构成与主动错误标志的构成相同(详见第六部分错误帧) - 过载界定符
8个位的隐性位(6个1)
过载界定符的构成与主动错误界定符的构成相同(详见第六部分错误帧)
1.3 错误帧
详见第六部分错误帧
1.4 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
(1)间隔(ITM)
3个位的隐性位(3个1)
(2)总线空闲(Bus Idle)
隐形电平,无长度限制(0到无穷)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3)延迟传送(Suspend transmission ,发送暂时停止)
8个位的隐性位(8个1)。
只在处于被动错误的单元刚发送一个消息后的帧间隔中包含的段。
2. 标准格式下的数据帧结构
(1)SOF – Start Of Frame
- 表示帧开始的段。
- 1个位的显性位(固定格式:0)。
(2)仲裁段(场) – Arbitration Field
- Identifier:标准格式ID有11位(扩展格式的ID有29位)。 从高位msb到低位lsb,依次发送。
- RTR(Remote Transmission Request):远程发送请求位。数据帧必须为显性0,遥控帧必须为隐性0。
SRR:替代远程请求位。隐性位为1。通过该位,解决标准帧与扩展帧冲突,标准帧优先于扩展帧 。 - IDE(Identifier Extension):识别符扩展位。标准格式属于控制场,为显性0。扩展格式属于仲裁场,为隐性1。当IDE为1时,后面还会跟着18Bit的ID扩展位。
(3)控制段 – Control Field
- r(Reserve Bit):保留位,必须为显性。
- r0(Reserve Bit):保留位,必须为显性。
- r1(Reserve Bit):保留位,必须为显性。
- DLC(Data Length Code):数据长度码4Bit,支持的最大有效字节数量为8个字节。
(4)数据段 – Data Field
由0~8个字节组成,首先发送MSB。
(5)CRC段 – Check Field
由15Bit的CRC顺序和1Bit的界定符组成。
- CRC:CRC的计算范围包括帧起始、仲裁段、控制段和数据段。
- DEL:界定符,固定格式,值为1
(6)ACK段 – ACK Field
由ACK槽和ACK界定符2个位组成。
- ACK:发送单元发送1个位的隐性位1,接收单元接收到正确消息的ACK槽发送显性位0,不正确则为隐形位1。
- DEL:界定符,固定格式,值为1
(7)EOF – End Of Frame
表示该帧结束,由7个隐性位组成,7个1。
(8)ITM – Intermission
在每个帧结束后有3Bit的ITM代表帧间隔,为3个1。
如果有连续11个1(DEL,EOF,ITM),则总线是空闲的!!!
**思考:**如果发的内容全部都是1,是不是也可能构成连续11个1呢?
实际上,这种情况是不会发生的。在CAN里面有一个位填充机制(Bit Stuffing)。
3.位填充(Bit Stuffing)
3.1 填充规则
- 只要总线上出现了5个连续相同的位,在下一位插入一个与其相反的位;
- 填充的范围从SOF到CRC;
- 如果在SOF到CRC段发现有6个连续相同的位,则总线发送的数据有问题。
(1)发送方的工作
在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续5 位,在下一个位(第6 个位)则要插入1 位与前5 位反型的电平。
(2)接收方的工作
在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续5 位,需要删除下一个位(第6 个位)再接收。如果这个第6 个位的电平与前5 位相同,将被视为错误并发送错误帧。
六、CAN传输中的数据保护
1.错误检测机制
1.1发送者
- Bit Check:发送者在回读时,看发送的数据和在总线上读到的数据是否一致。
- Stuff Check:填充位检查,如果在SOF到CRC段发现有6个连续相同的位,则总线发送的数据有问题。
- ACK Check:正确情况是发1读0,读到的是0说明CRC校验通过。读1,则CRC校验失败。
1.2接收者
- Bit Check:发送者在回读时,看发送的数据和在总线上读到的数据是否一致。
- Stuff Check:填充位检查,如果在SOF到CRC段发现有6个连续相同的位,则总线发送的数据有问题。
- Form Check:固定位都为1,例如:r,SOF,DEL,EOF,ITM。
- CRC Check:CRC算法校验。
2.错误信号
2.1.规则
当节点检测到错误时,需要立即向总线上发送错误帧来告诉其他的节点(除了CRC错误)。
2.2.错误帧
Error Frame = Error Flag(Active / Passive) + Error Delimiter
- 处于主动错误的节点 – Error-Active Node
- 处于被动错误的节点-- Error-Passive Node
3.错误界定
怎么确定某一个节点是属于主动错误的节点还是被动错误节点呢?
状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。
单元错误状态 | 发送错误计数值(TEC) | 接收错误计数值(REC) |
---|---|---|
主动错误状态 | 0 ~ 127 | 且 0 ~ 127 |
被动错误状态 | 128 ~ 255 | 或128 ~ 255 |
总线关闭态(Bus Off) | >=256 | _ |
错误计数规则:
- 当接收方检测到错误时,REC+1,除非
检测到的错误是发送活动错误标志或过载标志期间的位错误。 - 当接收方在发送错误标志后检测到显性位作为第一个位时,REC+8。
- 当发送方发送错误标志时,TEC+8。
- 如果发送方在发送活动错误标志或过载标志时检测到位错误,则TEC+8。
- 如果接收方在发送活动错误标志或过载标志时检测到位错误,则REC+8。
注意:更多错误计数规则见ISO-11898。
七、位时序和同步
由于CAN上的各个节点都连接在同一个总线上,根据其拓扑结构可以发现其通讯的方式属于异步通讯。那怎样实现对总线电平信号的正确采样以确保通讯正常呢?想必了解了位时序和位同步,大家会有答案。
1.位时序
1.1 波特率和比特率
波特率( Baudrate):在信息传输通道中,携带数据信息的信号单元叫码元,单位时间内通过信道传输的码元数称为码元传输速率,是衡量数据传送速率的指标,简称波特率。单位:波特,b/s(Baud per second)。
比特率:是指每秒传送的比特(bit)数。单位为 bps (Bit per second),比特率越高,每秒传送数据就越多。
比特率 = 波特率 * 单个调制状态对应的二进制位数
I=S*log2(N)
其中I为传信率,S为波特率,N为每个符号负载的信息量,以比特为单位。
2进制时,比特率和波特率是一样的。
8进制时,波特率就是比特率的3倍。
16进制时,波特率是比特率的4倍。
1.2 位组成
位时间:由发送单元在非同步的情况下发送1bit所需要的时间。
位时间(tBit) = 1 /波特率
根据CAN规范,每个位的时间内又可细分成4段:
- 同步段(SS)
- 传播时间段(PTS)
- 相位缓冲段1(PBS1)
- 相位缓冲段2(PBS2)
每个段又由最小的时间单位Time Quantum(Tq)组成。
1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序,1bit大约在8~25个时间量子(Tq)。
1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
段名 | 作用 | Tq数 |
---|---|---|
同步段(SS:Synchronization Segment) | 同步段用于同步总线上的各个CAN节点。 | 固定1Tq |
传播时间段(PTS:Propagation Time Segment) | 用于补偿网络内的物理延迟时间。这些延迟时间包括总线上的信号传播时间和CAN节点的内部延迟时间 | 1~8Tq |
相位缓冲段1(PBS1: Phase Buffer Segment 1) | 相位缓冲段1和2用于补偿边沿相位误差。这些段可以通过重新同步来延长或缩短。 | 1~8Tq |
相位缓冲段2(PBS2: Phase Buffer Segment 2) | 同上 | 2~8Tq |
采样点:读取总线电平,并将读到的电平作为位值的点。位置在PBS1 结束处。
tBit(位时间) = tSS(同步段时间)+tPS(传播段时间)+tPBS1(相位缓冲段时间1)+tPBS2(相位缓冲段时间2)
则上图中的 tBit = tSS(1Tq)+tPS(3Tq)+tPBS1(5Tq)+tPBS2(4Tq)= 13Tq
2.CAN的同步机制
CAN 协议的通信方法为NRZ(Non-Return to Zero)方式。各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。
但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬同步或者再同步的方法调整时序进行接收。
2.1 同步规则
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时(即,SOF时),则一定要进行硬同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要满足下面条件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
2.2 硬同步
接收单元在总线空闲状态检测出帧起始时(SOF)进行的同步调整。
当检测到隐性到显性的边沿时(SOF)视为起始(SS)
2.3 再同步
再同步补偿宽度(SJW:reSynchronization Jump Width):由于重新同步,PBS1可能会延长或PBS2可能会缩短。SJW给定了相位缓冲段的加长和缩短量的上限(1~4Tq)。
在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长PBS1 段,或缩短PBS2 段,以调整同步。但如果发生了超出SJW值的误差时,最大调整量不能超过SJW 值。
(1)隐性电平到显性电平的边沿出现在PTS和PBS1之间(SJW = 2)
隐性电平到显性电平的边沿有2Tq的延迟时,在PBS1后插入SJW的长度以调整同步。
(2)隐性电平到显性电平的边沿出现在PBS 2中时(SJW = 2)
检测出隐性电平到显性电平的边沿有2Tq的提前时,在PBS2中减小SJW的长度以调整同步。