CAN通信简介
说明:用CAN很久,却没整理过基础知识。从网络收集CAN相关资料,做下整理。图片和内容主要来源于参考资料,并做了精简。
CAN是什么?
CAN控制局域网(Controller Area Network),是ISO串行通信协议,主要应用于电梯、汽车等对稳定性、安全性要求较高的行业。
CAN发展历史:
- 1983,BOSCH开始开发CAN总线;
- 1986,SAE会议正式发布CAN;
- 1987,Intel/Philips推出第一款CAN控制器IC;
- 1991,奔驰500E第一款基于CAN量产车型,同年Bosch发布CAN 2.0A(标准数据帧)、CAN 2.0B(扩展数据帧);
- 1993,ISO发布CAN总线标准ISO 11898,分三部分:-1:数据链路协议;-2:HSCAN物理层协议,速率125kbps~1Mbps;-3:低俗CAN物理层协议,速率,<125kbps。
- 2011,开发CAN FD;
- 2015,ISO11898-1加入CAN FD。
本文主要讲解传统CAN 2.0B(不包括CAN FD)。
CAN特点
CAN连接拓扑
车上每个CAN节点对应一个ECU,软件通过CAN Controller控制硬件,CAN Transceiver(收发器)将MCU串口信号转换为差分信号连接到整车CAN总线。
下图是一个典型的车载CAN节点连接拓扑:
CAN收发器
MCU如何与CAN总线连接并通信?
答案是通过CAN Controller控制(通常MCU内置)与CAN模块通信,产生/接收CAN串行信号,而CAN Controller需要通过CAN收发器与总线连接、通信。
CAN收发器将总线信号(差分信号)转换为串口信号。常用CAN收发器,如NXP TJA1042 50。其他可参见这篇文章:NXP TJA1040, TJA1042, TJA1050 TJA1051, TJA1057, TJA1044, TJA1055区别
基本特点
1)总线访问采用基于优先权的多主方式。
信息内容通过CAN ID标识,不包括节点的物理地址,其他节点收到后,根据CAN ID决定是否处理(多主方式);
CAN ID还决定优先级:ID越小,优先级越高。低优先级CAN节点,在总线忙时,自动停止发送;总线空闲后,自动重新发送。
2)非破坏性的基于线路竞争的仲裁机制。
采用带冲突检测的载波监听多路访问方法,能无破坏性仲裁解决冲突。仲裁机制保证不会丢失信息,也不会浪费时间。优先级最高的节点获得访问总线权利。
3)利用接收滤波对帧实现多点传送(CAN ID filter)。
接收器无需辨别谁发送信息,发送器无需关注发送给谁,接收器的滤波机制会识别。
4)支持远程数据请求。
通过送出一个远程帧,需要数据的节点可以请求另一个节点向自己发送相应的数据帧。
5)配置灵活。
添加CAN节点时,如果不是数据帧的发送器,或者不需要接收CAN矩阵(车厂提供)规定以外的数据,则无需做任何软硬件改动。
6)数据在整个系统范围内具有一致性。
一帧可以同时被所有节点接收,也可以同时不被任何节点接收。
7)有错误检查和通报功能。
支持以下几种错误检测:
- 位检测;
- 15bit CRC校验;
- 5bit宽度位填充;
- 帧校验。
8)仲裁失败或故障,帧自动重发。
9)能区别临时故障、永久故障,自动断开故障节点。
CAN协议版本
CAN 2.0与CAN FD
CAN 1.0 2.0 FD,是Bosch发布的CAN标准。
传统CAN:CAN 1.0, 2.0(2.0A,2.0B)。1.0分两种:1.0A,1.0B;2.0也分两种:2.0A,2.0B。
CAN 1.0A和1.0B是第一代CAN协议。具体资料没找到,细节不详。
CAN 2.0A和2.0B是第二代CAN协议,其中,2.0A:位速率最大1 Mpbs,数据段最多8byte。CAN 2.0B:在2.0A基础上,添加了29bit CAN ID的扩展帧支持。
可参考瑞萨的经典入门书籍:《CAN总线入门》。
CAN FD:全称CAN with Flexible Data Rate(可变数据速率),数据段最多64byte,数据段位速率可与其他位段不同,最大可支持12Mbps(理论)。兼容CAN 2.0,能与CAN 2.0设备共存。
ISO CAN
ISO CAN是ISO发布的CAN标准,有ISO 11898和ISO 11519-2这两种标准,数据链路层定义相同,但物理层不同。
1)ISO 11898:速率125kbps~1Mbps的HS CAN(High Speed CAN)标准。追加新约后,成为ISO 11898-1。
2)ISO 11519:速率<125kbps的LS CAN(Low Speed CAN)标准 。ISO 11519-2是ISO 11519-1追加新约后的版本。
2种标准在物理层的不同:通信速度、总线最大长度、连接单元数、总线电平等(详见P14 《CAN总线入门》)。
其他CAN标准
除ISO,SAE等组织也对CAN进行了标准化,应用于不同行业,如SAE J1939-11、SAE J1939-12、SAE J2284、CANopen等。
CAN协议
物理层
下面所讲的CAN主要是符合ISO 11898的HS CAN。
CAN由双绞线传输信号,2根线分别称为CAN_H、CAN_L。
LS CAN物理层:
- 隐性电平
CAN_H=1.75V CAN_L=3.25V,逻辑信号为逻辑1 - 显性电平
CAN_H=4V, CAN_L=1V,逻辑信号为逻辑0
CAN协议版本
CAN 2.0与CAN FD
CAN 1.0 2.0 FD,是Bosch发布的CAN标准。
传统CAN:CAN 1.0, 2.0(2.0A,2.0B)。1.0分两种:1.0A,1.0B;2.0也分两种:2.0A,2.0B。
CAN 1.0A和1.0B是第一代CAN协议。具体资料没找到,细节不详。
CAN 2.0A和2.0B是第二代CAN协议,其中,2.0A:位速率最大1 Mpbs,数据段最多8byte。CAN 2.0B:在2.0A基础上,添加了29bit CAN ID的扩展帧支持。
可参考瑞萨的经典入门书籍:《CAN总线入门》。
CAN FD:全称CAN with Flexible Data Rate(可变数据速率),数据段最多64byte,数据段位速率可与其他位段不同,最大可支持12Mbps(理论)。兼容CAN 2.0,能与CAN 2.0设备共存。
ISO CAN
ISO CAN是ISO发布的CAN标准,有ISO 11898和ISO 11519-2这两种标准,数据链路层定义相同,但物理层不同。
1)ISO 11898:速率125kbps~1Mbps的HS CAN(High Speed CAN)标准。追加新约后,成为ISO 11898-1。
2)ISO 11519:速率<125kbps的LS CAN(Low Speed CAN)标准 。ISO 11519-2是ISO 11519-1追加新约后的版本。
2种标准在物理层的不同:通信速度、总线最大长度、连接单元数、总线电平等(详见P14 《CAN总线入门》)。
其他CAN标准
除ISO,SAE等组织也对CAN进行了标准化,应用于不同行业,如SAE J1939-11、SAE J1939-12、SAE J2284、CANopen等。
CAN协议
物理层
下面所讲的CAN主要是符合ISO 11898的HS CAN。
CAN由双绞线传输信号,2根线分别称为CAN_H、CAN_L。
LS CAN物理层:
- 隐性电平
CAN_H=1.75V CAN_L=3.25V,逻辑信号为逻辑1 - 显性电平
CAN_H=4V, CAN_L=1V,逻辑信号为逻辑0
HS CAN物理层:
- 隐性电平
CAN_H=2.5V=CAN_L 逻辑信号为逻辑1 - 显性电平
CAN_H=3.5V CAN_L=1.5V 逻辑信号为逻辑0
CAN总线仲裁:CAN ID越小,优先级越高(优先传输)。由于CAN ID网络传输为msb(高位优先),因此按ID bit28..bit10..bit0顺序传输,也就是显性电平(逻辑0)优先级越高。
帧类型
CAN消息是按帧传输的,有5种类型帧,其用途如下:
1)数据帧,用于发送单元向接收单元传送数据的帧
2)遥控帧,用于接收单元向具有相同ID的发送单元请求数据的帧
3)错误帧,用于当检测出具有相同ID的发送单元请求数据的帧
3)过载帧,用于接收单元通知其尚未做好接收准备的帧
4)帧间隔,用于将数据帧及遥控帧与前面的帧分离开来的帧
数据帧、遥控帧有标准格式(std)和扩展(ext)2种格式。标准格式id 有11bit,扩展格式id有29bit。
数据帧
数据帧(经典CAN帧,CAN FD帧)由以下7个字段组成:
- 帧起始(SOF):表示数据帧开始的段
- 仲裁段(Arbitration Field):表示该帧优先级的段
- 控制段(Control Field):表示字节数及保留位的段
- 数据段(Data Field):数据段内容,可发送0~8byte数据
- CRC段(CRC Field):检查帧的传输错误的段
- ACK段(ACK Field,应答域):表示确认正常接收的段
- 帧结束(EOF):表示数据帧结束的段
帧格式:
1)帧起始 SOF
1bit显性位。
2)仲裁段
RTR:指示该帧是遥控帧or数据帧。显性电平(0)代表数据帧,隐性电平(1)代表遥控帧。
IDE:指示标准帧or扩展帧。显性电平代表标准帧,隐性电平代表扩展帧。
- 仲裁机制
仲裁决定了优先级。当总线空闲时,最先开始发送消息的单元获得发送权。当多个单元同时发送时,各单元从仲裁的第1bit开始仲裁,连续输出显性电平(;逻辑0)最多的单元连续发送,即ID更小的优先级更高;而仲裁失利的单元进入监听模式,等待总线空闲后再重新发送。
3)控制段
标准帧由IDE、r0、DLC组成,扩展帧由r1、r0、DLC组成。
IDE对应前面扩展格式的仲裁段的IDE,指数该帧是否为扩展帧。
r0、r1是保留位,以显性电平(0)发送。
DLC数据长度码,指示数据段有多少byte数据内容。DLC需为08,但接收方对915不报错(需丢弃)。
4)数据段
用于存放数据。标准帧和扩展帧均为0~8byte,由DLC指示其有效字节数。从MSB开始输出。
5)CRC段
用于检测帧传输错误。由CRC校验码、CRC界定符组成。
CRC根据多项式生成CR值,计算范围包括:帧起始、仲裁段、控制段、数据段。接收端以同样方法计算CRC并比较,如果不一致就报错。
传统CAN使用CRC-15算法,多项式为
x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + x^0
CAN FD根据数据长度不同,使用2种算法:>16byte 使用CRC-21;<=16byte 使用CRC-17。
// CRC-17
x^17 + x^16 + x^14 + x^13 + x^11 + x^6 + x^4 + x^3 + x^1 + x^0
// CRC-21
x^21 + x^20 + x^13 + x^11 + x^7 + x^4 + x^3 + x^0
6)ACK段
用于确认帧是否正常接收。由ACK slot + ACK界定符组成。
当一个接收节点接收到帧起始到CRC段之间内容没有错误时,将在ACK段发送一个显性电平(0)。
ACK期间:
- 发送节点 发送2bit隐性位。
- 接收节点 接收到正确消息后在ACK slot发送1bit显性位,通知发送单元帧被正常接收。即“发送ACK”或“返回ACK”。
总线线与:隐性电平 & 显性电平 = 显性电平
tips:既不处于总线关闭,也不处于休眠状态的所有接收单元,接收到(发送单元发送的)正常消息时,都会发送ACK。正常消息指不含填充错误、格式错误、CRC错误的消息。
7)帧结束
表示帧结束。由7bit连续隐性位(逻辑1)组成。
遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由6个段组成,没有数据帧的数据段,其他同。
-
遥控帧与数据帧的不同:
1)遥控帧RTR为隐性位(逻辑1),没有数据段;
2)没有数据段的数据帧和遥控帧,可通过RTR位区分; -
遥控帧没有数据段,DLC表示所请求数据帧的数据长度码。
-
没有数据段的数据帧用途:可用于各单元的定期连接确认/应答、仲裁段(CAN ID)本身有实质性信息。
错误帧
用于接收和发送消息时,检出错误通知。由错误标志、错误界定符构成。
1)错误标志
- 主动错误标志:6bit 显性位(1);
- 被动错误标志:6bit 隐性位(0);
2)错误界定符:8bit 隐性位。
过载帧
用于接收单元通知其尚未完成接收准备。由过载标志和过载界定符构成。
1)过载标志:6bit 显性位。与主动错误标志构成相同。
2)过载界定符:8bit 隐性位。与错误界定符构成相同。
帧间隔
用于分隔数据帧、遥控帧的帧。数据帧、遥控帧可通过插入帧间隔,将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不难插入帧间隔。
组成:
1)间隔:3bit 隐性位(1);
2)总线空闲:隐性电平,无长度限制。本状态下,发送单元可访问总线;
3)延迟传送(发送暂时停止):8bit 隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
位填充
位填充是为防止突发错误而设定的功能。当同样电平持续5bit时,添加1bit的反型电平。
对发送单元:在发送数据帧、遥控帧时,SOF~CRC之间,相同电平如果持续5bit,那么下1bit则插入1bit与前5bit反型的电平。
对接收单元:在接收数据帧和遥控帧时,SOF~CRC之间,相同店铺如果持续5bit,则删除下1bit再接收。如果第6bit与前5bit电平相同,则被视为错误并发送错误帧。
错误种类
5种错误可能同时发生:
- 位错误
- 填充错误
- CRC错误
- 格式错误
- ACk错误
1)位错误
发送单元/接收单元 比较输出电平、总线电平(不含填充位),当两电平不一样时所检测到的错误。
2)填充错误
发送单元/接收单元 在需要位填充的段内,连续检测到6bit相同电平时检测到错误。
检测对象:数据帧SOFCRC;遥控帧SOFCRC
3)CRC错误
接收单元 从接收到的数据计算出CRC结果,与接收到的CRC不同的错误。
检测对象:数据帧CRC、遥控帧CRC。
4)格式错误
接收单元 检测出与固定格式位段相反的格式
检测对象:
数据帧CRC界定符、ACK界定符、EOF;
遥控帧CRC界定符、ACK界定符、EOF;
错误界定符;
过载界定符;
5)ACK错误
发送单元 在ACK slot中检测出隐性电平。(即消息没有被正常接收)
检测对象:数据帧ACK slot;遥控帧ACK slot。
错误帧输出
检测出满足错误条件的单元,输出错误标志通报错误。
处于主动错误状态的单元输出端错误标志为主动错误标志,被动错误状态的输出被动错误标志。
发送单元发送完错误帧后,再次发送数据帧或遥控帧。
输出时序:
位错误、填充错误、格式错误、ACK错误,从检测出错误后的下1bit开始输出错误标志;
CRC错误,从ACK界定符后的下1bit开始输出错误
参考
瑞萨 《CAN总线入门 》
CAN通信讲解
详解CAN/CAN FD通信中的循环冗余校验(CRC)方法