CAN协议基础知识解析
- 1.CAN简介
- 2.CAN总线拓扑
- 3.CAN协议特点
- 3.1.多主控制;
- 3.2.消息发送;
- 3.3.系统柔软性;
- 3.4.通信速度;
- 3.5.远程数据请求;
- 3.6.错误的检测、通知以及恢复功能;
- 3.7.故障封闭;
- 3.8.连接。
- 4.CAN协议基本概念
- 5.CAN协议
- 5.1帧种类
- 5.2数据帧
- 5.3遥控帧
- 5.4错误帧
- 5.5过载帧
- 5.6帧间隔
- 5.7优先级判断
- 5.8位填充
- 5.9错误的种类
- 5.10错误帧输出
1.CAN简介
CAN,全称为:Controller Area Network,全称是一种串行通信协议。开发该协议的目的是为了减少线束数量,通过多个LAN进行大量数据的高速通信。该协议由电气商博世公司于1986年开发,并在之后通过ISO11898和ISO11519进行标准化,在欧洲等地流传较广。
如下图所示,是基于CAN协议的车载网络构想示意图
2.CAN总线拓扑
CAN协议使用了两根线,根据两根线的电位差判断总线电平,总线电平分为显性电平和隐形电平。通过一次次的电平变化合成一段数据,将数据发给接收方。
以下为CAN的连接示意图
3.CAN协议特点
CAN协议的主要特点如下:1.多主控制;2.消息发送;3.系统柔软性;4.通信速度;5.远程数据请求;6.错误的检测、通知以及恢复功能;7.故障封闭;8.连接
3.1.多主控制;
CAN总线在空闲状态时,总线上挂载的所有单元都可以发送消息,即多主控制,当某个单元发送的消息最先访问总线时,该单元获得发送权。但是,当多个单元的信号同时发送到总线时,更具发送的优先级ID进行判断,高优先级ID的单元先获得发送权。
3.2.消息发送;
在CAN协议中,所有消息都是以固定的格式组成发送。如第一点所说,所有与总线相连的单元都可以开始发送新 消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
3.3.系统柔软性;
总线上挂载的单元没有地址信息,在总线上挂载新的单元时,其他已挂载的单元的软硬件和应用层不需要进行修改。
3.4.通信速度;
在同一条总线下的所有单元,都需要设定在同一个通信速度下。如果有一个单元设定的通信速度和其他单元不一致,该单元输出的信号就会出现错误,进而影响整个网络。
不同网络可以使用不同的通信速度。
3.5.远程数据请求;
单元通过发送遥控帧请求其他单元发送数据。
3.6.错误的检测、通知以及恢复功能;
所有的单元都可以检测错误(错误检测功能)。
检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送 此消息直到成功发送为止(错误恢复功能)。
3.7.故障封闭;
CAN可判断出错误的类型是总线上暂时的数据错误还是持续的数据错误。即当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
3.8.连接。
CAN总线可以挂载多个单元,理论上挂载单元的数量没有限制,实际上挂载单元的数量受电气负载和时间延迟限制。降低通信速度可以增加挂载单元的数量,反之减少。
4.CAN协议基本概念
对于ISO/OSI基本参照模型,可分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层七层。其中物理层、数据链路层属于硬件,网络层、传输层、会话层、表示层、应用层属于软件。
CAN协议涵盖了传输层、数据链路层、物理层。
模型如下所示:
CAN在物理层:处理位编码方式、位时序、同步方式。对于位编码方式,采用NRZ方式编码,6位的插入填充位;对于位时序,用户可自行选择位的采样数;对于同步方式,根据同步段(SS)实现同步,可以进行再同步。物理层定义了信号实际的发送方式、位时序、位的编码方式及同步的步骤。但具体地说,信号电平、通信 速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义。这些必须由用户根据系统需求自行确定。
CAN在数据链路层:数据链路层主要是将物理层收到的信号进行转换组成,并提供传输控制的流程,数据链路层分为MAC层和LLC层,MAC层为媒介访问控制,也是CAN的核心部分,LLC层为逻辑链路控制。在MAC层,通信方式为半双工通信;应答为ACK\NOACK;所有单元都可检测错误;出现CRC错误、填充位错误、位错误、ACK错误、格式错误都会进行错误通知;可自动判别暂时错误和持续错误,排除故障节点,即故障扩散抑制功能;可根据仲裁,让高优先级ID的单元继续被发送;使用多点发送方式;每条消息可以帧化为:数据帧、遥控帧、错误帧、过载帧四种。在LLC层,可再次发送消息,即错误恢复功能;可通知接收准备尚未完成,即过载功能;可点到点连接、广播、组播,即对接收消息的选择过滤。
CAN在传输层:可永久再尝试,即再发送控制。
5.CAN协议
总线上的电平分为显性电平和隐形电平。判断依据来自两根线的电位差,显性电平的逻辑为0,隐形电平的逻辑为1;且显性具有优先意义,当只有一个单元输出时,且输出的是显性电平,总线即为显性电平。而只有当所有单元都输出隐形电平时,总线才为隐形电平。
5.1帧种类
通信由5种帧组成:数据帧、遥控帧、错误帧、过载帧、帧间隔。
数据帧:发送单元向接收单元发送数据;
遥控帧:接收单元向具有相同ID的发送单元请求数据;
错误帧:检测出错误时向其他单元通知错误;
过载帧:接收单元通知其尚未做好准备;
帧间隔:将数据帧以及遥控帧与前面的帧分开。
5.2数据帧
发送单元向接收单元发送数据,数据帧由七段组成:帧起始(占1位)、仲裁段(标准格式占12位:11位ID+1位RTR;拓展格式占32位:11位基本ID+1位SRR+1位IDE+18位拓展ID+1位RTR)、控制段(标准格式占6位:1位IDE+1位r0+4位DLC;拓展格式占6位:1位r1+1位r0+4位DLC)、数据段(0-64位Data)、CRC段(占16位)、ACK段(占2位)、帧结束(占7位)。
帧起始:标书数据帧开始的段;
仲裁段:表示优先级;
在此段,标准格式和拓展格式有所不同,标准格式占12位,拓展格式占32位,且二者都需要注意一点:在基本ID位里面高7位不能全为隐形。
控制段:表示数据的字节数和保留位;
对于需要发送的消息,保留位必须是显性电平,但接收方的保留位可以是任意电平,DLC(即数据长度码):数据字节必须为0-8字节,但接收方对DCL=9-15的情况也不会认为是错误。具体DLC和字节的关系如下所示:
数据段:发送0-8个字节的数据;
从高位开始输出。
CRC段:检查帧的传输错误;
由15个CRC顺序和1个CRC界定符组成,CRC顺序计算范围包括帧起始、仲裁段、控制段、数据段,接收方也会进行同样的CRC计算,双方CRC不一致就会进行报错。
ACK段:表示正确接收;
由ACK槽和ACK界定符组成。对于发送单元,两个ACK位都发隐形电平;对于接收单元,接收正确,ACK槽发显性位,通知发送单元正常接受结束,即返回ACK。需要注意的是,发送单元不发送ACK,发送ACK的是所有既不处于总线关闭态也不处于休眠态的接收单元。所以返回ACK不包含填充错误、格式错误、CRC错误之类的消息。
帧结束:表示数据帧结束
表示结束,由7个隐形位组成。
5.3遥控帧
接受单元向发送单元请求发送数据的帧,遥控帧没有数据帧的数据段,所以遥控帧由六段组成:帧起始(占1位)、仲裁段(和数据帧一样,标准格式12位,拓展格式32位)、控制端(和数据帧一样,标准格式6位,拓展格式6位)、CRC段(占16位)、ACK段(占2位)、帧结束(7位)。
遥控帧和数据帧相差不多,需注意遥控帧和数据的不同:遥控帧的RTR位为隐形,没有数据段;没有数据段的数据帧和遥控帧可以通过RTR位进行区别。遥控帧的数据长度码以所请求数据帧的数据长度码表示,即对方发什么这边就是什么。
上面提到了没有数据段的数据帧,该帧可用于各单元的定期连接的情况。
5.4错误帧
检测出错误时向其他单元通知错误,由错误标志和错误界定符组成。
错误标志:由主动错误标志和被动错误标志组成,主动错误标志为6个位的显性位,被动错误标志为6个位的隐形位。例:当处于主动错误状态时,就会发送主动错误标志
错误界定符:有8个隐形位组成
5.5过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载标志:由6个显性位组成。
过载界定符:由8个隐形位组成。
5.6帧间隔
帧间隔用于分隔数据帧和遥控帧。数据帧和遥控帧可通过插入帧间隔将其与前面的任何帧分开,但过载帧和错误帧不能插入帧间隔。构成如下:
间隔:为3个隐形位;
总线空闲:隐形电平,长度无限制,在该状态下视为总线空闲。
延迟传送:8个隐形位,只在处于被动错误状态的单元刚发送一个消息后的帧间隔内包含的段,起到发送暂停的作用。
5.7优先级判断
在总线空闲态,最先开始发送消息的单元获得发送权。多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。即高优先级ID获得发送权。
需注意前面讲的数据帧和遥控帧的判定,当拥有相同ID的数据帧和遥控帧竞争时,可通过仲裁段的RTR为进行判定,RTR位显性的数据帧获得优先权。如下所示:
标志格式的数据帧与具有相同ID的拓展数据帧竞争时,标准格式的RTR位为显性位的具有优先权。
5.8位填充
为了防止突发错误而设定的功能,即当出现五个连续一样的电平之后,第六个电平必须与前五个电平相反,例:前五个位是隐形电平,第六位就必须是显性电平。
发送单元工作时,发送数据帧和遥控帧时,在SOF到CRC段出现五个连续一样的电平之后,第六个电平必须与前五个电平相反;
接收单元工作时,接收数据帧和遥控帧时,在SOF到CRC段出现五个连续一样的电平之后,将第六位删除再接收,如果第六位还和前五位电平相同,视为错误并发送错误帧。
5.9错误的种类
错误分为位错误、填充错误、CRC错误、格式错误、ACK错误。如下所示:
注意:在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
在仲裁段作为填充位输出隐形电平,但检测出显性电平时,视为填充错误。发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误。
5.10错误帧输出
将出现的错误进行错误标志输出并通报错误。处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志,发送单元发送完错误帧后,继续发送数据帧或遥控帧。
文章参考瑞萨的CAN入门整理
/*
* 作者:PrairieOne
* csdn:PrairieOne
* 邮箱:prairieone1024@163.com
* 嵌入式技术交流群:738655377
*/
遇事不决,可问春风!