一文读懂CAN总线及通信协议

news2024/11/16 7:24:06

CAN总线的汽车

 

CAN概念

CAN控制器域网 (Controller Area Network, CAN) 的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898),是ISO国际标准化的串行通信协议。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。

CAN的两个ISO国际标准:

1)ISO11898 :定义了通信速率为 125 kbps~1 Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米。

2)ISO11519:定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米。

CAN种类

1)高速CAN:

a.根据线缆的长度提供从5Kbit/s到1Mbit/s的波特率。

b.高速CAN网络在每个网络端点端接一个120欧姆的电阻。

c.电平静默为2.5V,上下限是3.5V和1.5V。

2) 容错CAN:

a.提供5Kbit/s到125Kbits/s的波特率。

b.显性时则为1V和4V。

3)单线CAN:

a.提供5Kbit/s到125Kbits/s的波特率。

b.单线CAN的波特率一般为33.3KHz。

汽车CAN网络

 

汽车CAN网络

汽车CAN总线

 

CAN组成

CAN总线的一个主要由帧信息帧ID帧数据组成。

1)帧信息:分四类,标准数据帧(汽油车、电机)、标准远程帧(少见)、扩展数据帧(广大柴油车、部分汽油车)、扩展远程帧(少见)。

2)帧ID:是CAN的一种“地址”。CAN有个特点是竞争机制帧ID越小越有占用总线资源的权利,越会优先发送。

        


CAN ID

DBC文件:车辆行业中,如果对车辆CAN总线上的每个帧ID及每个帧数据都做出了标准的解释,形成了的文件就是DBC文件。

3)帧数据:和串口相比,CAN的帧数据只有8个字节,即64个位,不会再多了。但CAN FD作为新型总线解决了仅有8字节这个问题。

4)终端电阻:CAN和RS485一样,要在终端减少差分信号的反射,如不在两个终端加电阻,信号会反弹回来影响通讯。终端电阻在CAN总线上要有两个,阻值为120欧姆,并联,最远的终端一边一个。如果有多个节点的话,终端电阻应适当加大。

5)波特率:常见的车辆波特率有500K,250K,125K,100K。

CAN总线标准

ISO标准

 

CAN标准分为底层标准(物理层和数据链路层)和上层标准(应用层)两大类

  • ISO 11898-1 – CAN协议
  • ISO 11898-2 – CAN高速物理层
  • ISO 11898-3 – CAN低速可容错物理层
  • ISO 11898-4 – 时间触发CAN
  • ISO 11898-5 – “低功率模式高速介质存取单元” – 目前处于起草阶段
  • ISO 11519-2 – 已过时,被11898-3取代。
  • ISO 14230 – “关键字协议2000” – 定义非CAN串行线路诊断的若干部分。
  • ISO 15765 – CAN总线上定义诊断的标准 – 本质上是CAN总线上的关键字协议2000。
  • J1939 – 卡车和客车领域应用最广泛的基于CAN的高层协议,由SAE定义。J1939分成几个部分,描述物理层、数据链路层、网络管理和大量预定义的报文。
  • ISO 11783 – 与J1939相似,但用于农业领域(诸如拖拉机)
  • ISO 11992 – 定义卡车和拖车之间的接口
  • NMEA 2000 – 基于J1939的协议,用于海事领域。由NMEA委员会定义。

如果没有详细说明谈论中所使用哪种标准,通常其默认是指ISO 11898-1定义的数据链路层协议和ISO 11898-2定义的物理层。

底层标准:

CAN底层标准都基本一样,涵盖OSI模型中的物理层和数据链路层,与ISO/OSI模型的对应关系如下图所示:

对应关系

 

  • ISO 11898-1:数据链路层协议,描述CAN总线的基本架构,定义不同CAN总线设备在数据链路层通信方式
  • ISO 11898-2:高速CAN总线物理层协议,最高数据传输速率 1Mbps,应用为两线平衡式信号(CAN_H, CAN_L)
  • ISO 11898-3:定义低速CAN总线(LS-CAN, Fault-Tolerant CAN)物理层标准,数据传输速率在 5Kbps ~ 125Kbps 。Fault-Tolerant是指总线上一根传输信号失效时,依靠另外的单根信号也可以通信
  • ISO 11898-4:定义CAN总线中的时间触发机制(Time-Triggered CAN, TTCAN),定义与ISO 11898-1 配合的帧同步实体,实现汽车ECU之间基于时间触发的通信方式。

上层标准:

不同应用领域或制造商有不同的做法,没有统一的国际标准

上层协议对比

 

CAN的帧种类(四种帧类型)

1)数据帧

用于发送单元向接收单元传送数据的帧。

数据帧的帧结构图:

数据帧

 

SOF:表示数据帧开始;(1 bit),发出一个显性位边沿,网络节点以此开始同步

ID:标准格式11 bit,扩展格式29 bit包括Base ID(11 bit)和Extended IDr(18 bit),该区段标识数据帧的优先级,数值越小,优先级越高;

RTR:远程传输请求位,0时表示为数据帧,1表示为远程帧,也就是说RTR=1时,消息帧的Data Field为空;(1 bit)

IDE:(1 bit)标识符扩展位,0时表示为标准格式,1表示为扩展格式;扩展帧和标准帧格式不同,不能存在于同一can网络

DLC:数据长度代码,0-8表示数据长度为0~8 Byte;(4 bit)

Data Field:数据域;(0~8 Byte)

CRC (15 bit):

  • 校验域,从sof到数据场的所有数据进行encode
  • 由发送方填
  • 校验算法G(x) = x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1;(15 bit)

DEL:校验域和应答域的隐性界定符;(1 bit)

ACK:(1 bit)

  • 应答域,确认数据是否正常接收,所谓正常接收是指不含填充错误、格式错误、 CRC 错误。
  • 发送节点将此位为1,由接收方进行确认,收到消息给出一个显性位0
  • 如果一个节点都没有确认收到消息,发送方监听此位为隐形位就会报错

SRR:替代远程请求位,在扩展格式中占位用,必须为1;(1 bit)

EOF:连续7个隐性位(1)表示帧结束;(7 bit)

ITM(3 bit):

  • 帧间空间,Intermission (ITM),又称Interframe Space (IFS),连续3个隐性位,但它不属于数据帧。
  • 帧间空间是用于将数据帧和远程帧与前面的帧分离开来的帧。数据帧和远程帧可通过插入帧间空间将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间空间。

2)远程帧

用于接收单元向具有相同标识符的发送单元请求数据的帧。

远程帧与数据帧的帧结构类似,区别:

  • 1、数据帧的 RTR 值为“0”,远程帧的 RTR 值为“1”。
  • 2、远程帧没有数据块。
  • 3、远程帧的 DLC 块表示请求发送单元发送的数据长度。

格式图

远程帧

 

当总线上具有相同标识符的数据帧和远程帧同时发送时,由于数据帧的 RTR 位是显性的,数据帧将在仲裁中赢得总线控制权。

3)错误帧

用于当检测出错误时向其它单元通知错误的帧。

错误帧的帧结构由错误标志和错误界定符构成。

错误标志:6bit,

错误标志

 

错误界定符:由8bit的隐性位构成。

4)过载帧

接收单元通知发送单元它尚未完成接收准备。

发送过载帧的两种情况:

1、接收单元条件的制约,要求发送节点延缓下一个数据帧或远程帧的传输。

2、帧间空间(Intermission)的 3 bit 内检测到显性位。

每个节点最多连续发送两条过载帧,过载帧由过载标志和过载界定符(8 个隐性位)构成。

过载帧

 

数据帧和远程帧比较:

比较

 

CAN总线仲裁

仲裁优先级:标识符值越小,消息的优先级越高

线与逻辑:只有节点发送的全是隐性,总线电平才表现为隐性

所有发送节点在发送数据的同时,也检测总线上的电平状态,逐位对比总线上电平与自身发送的电平。

  • 1)发 0 出现 1 :报错。
  • 2)发 0 出现 0 :继续。
  • 3)发 1 出现 1: 继续。
  • 4)发 1 出现 0: 竞争失败,转为接收方。

发送自检

 

如下图,竞争失败的C节点会自动在检测到总线空闲的第一时间再次尝试发送。

CAN 节点A和C同时发送数据帧,CAN总线根据优先级仲裁,C失去权力

 

CAN条件接收

在CAN总线上消息是广播式的,节点可以通过设置控制器中过滤码(Filter Code )和掩码(Mask Code),再检验总线上消息的标识符,来判断是否接收该消息,对于掩码,“1”表示该位与本节点相关,“0”表示该位与本节点不相关。

CAN-BUS数据流程

 

STM32的can过滤码

 

位填充

CAN总线采用NRZ编码,没有单独时钟线,优点是效率高,但却不易区分哪里是bit开始,哪里是bit结束。因此为确保在同步通信过程中有足够的电平跳变,规范中应用到位填充机制,即在每连续 5个相同电平后插入1个反相电平,接收节点在收到消息后自动将填充位删除。

数据帧位填充比较图

 

在帧内除了CRC界定符、ACK域和EOF外,其余部分均应用到位填充机制,在应用到位填充的域,检测到连续6个显性位或隐性位均视为报错。

CAN错误检验

CRC错误

1)在发送消息时,发送节点会根据特定的多项式计算出由数据帧SOF位到数据域最末位的Checksum值,并将该值放在数据帧的CRC域,随着数据帧广播到总线上。

2)接收节点在收到数据后,应用同样的多项式计算Checksum值,并与收到的Checksum值对比。如果两者一致,正常接收;如果不一致,则舍弃该消息,并发送错误帧请求发送节点重传消息。

应答错误(ACK Error)

接收方会在收到消息后在ack应答位给出一个显性电平,如果发送方检测到该位为隐性,则报错。

格式错误(Form Error)

检测出与固定格式的位段相反的格式时所检测到的错误,如检测crc界定符和ack界定符以及eof区域是否出现显性位。

位错误(Bit Error)

比较输出电平和总线电平(不含填充位),当两电平不一样时所检测到的错误。如发送显性位,但总线是隐性位就报错。

填充错误(Stuff Error)

在需要位填充的段内,连续检测到 6 位相同的电平时所检测到的错误。

CAN总线错误检测机制

CAN总线上的每个节点控制器都会检测消息是否出错,如果节点发现消息出错,它将发送错误标志,从而打断总线上正常的数据传输。总线上其它没有发现原始消息错误的节点,在收到错误标志后将采取必要的措施,比如舍弃当前总线上的消息。

CAN节点内部有两种错误状态计数器 :

  • 1)TEC /Transmit Error Counter,发送错误状态计数器,出现一次错误该计数器值 +8
  • 2)REC /Receive Error Counter,接收错误状态计数器,出现一次错误该计数器值 +1
  • 3)消息成功发送或接收一次,对应的 TEC 或 REC 值相应 -1

                                                        错误计数

CAN规范定义了节点的 3 种错误状态:

  • 1) 主动错误:正常状态,在此状态下,节点可以发送所有类型的帧,包括错误帧;发现错误后会很积极主动地上报错误。
  • 2)被动错误:节点可以发送除错误帧以外的所有帧;TEC or REC 计数超过127就进入此状态;此时,该节点发现错误后只会发送6个隐性位,不会把错误广播出去。并且,发送连续帧时,中间必须间隔8bit的延缓时间。
  • 3)总线关闭:节点被控制器从总线上隔离;或者TEC大于255,就会进入这个状态,需要重启,或者等待128个11位隐性位电平。

CAN总线错误检测机制

 

CAN总线协议入门.pdf

CAN总线C源码与资料.rar

CAN总线C源码与资料,can分析仪总线电机同步启动源程序

CAN总线协议应用手册.pdf

CAN总线协议应用手册

can-utils.zip

CAN工具,包含显示,记录,生成和重放CAN流量的基本工具,CAN内核网关配置,CAN总线测量和测试,ISO-TP工具,日志文件转换器,串行线路规范配置,CMake项目生成器等源代码

CAN Bus Shield - MCP2515&MCP2551.zip

基于arduino的can 总线协议源码和应用案例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anchor-free应用一览:目标检测、实例分割、多目标跟踪

作者|杨阳知乎 来源|https://zhuanlan.zhihu.com/p/163266388 本文整理了与Anchor free相关的一些工作。一方面是分享近期在目标检测领域中一些工作,另一方面,和大家一起梳理一下非常火热的网络模型CenterNet、FCOS,当…

Linux网络-数据链路层,MAC帧解析

目录 数据链路层VS网络层 以太网概念 以太网的帧格式(报文格式)(也可以称之为MAC帧) MAC地址的概念 MAC帧格式 局域网通信原理 MTU MTU说明 MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 数据链路层VS网…

【Linux】应用层协议:HTTP和HTTPS

每个人都可以很喜欢每个人,但喜欢治不了病,喜欢买不了东西,喜欢不能当饭吃,喜欢很廉价… 文章目录 一、HTTP协议1.URL1.1 URL的组成1.2 urlencode && urldecode 2.HTTP协议格式2.1 http请求和响应的格式2.2 通过代码来进行…

[Eigen中文文档] 求解稀疏线性系统

文档总目录 本文目录 稀疏求解器列表内置直接求解器内置迭代求解器外部求解器的包装器 稀疏求解器概念计算步骤基准测试例程 英文原文(Solving Sparse Linear Systems) 在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示&#xff0c…

零基础速成simulink代码生成——结合CANOE的DBC文件CAN报文代码生成 移植到硬件4

零基础速成simulink代码生成——结合CANOE的DBC文件CAN报文代码生成 移植到硬件4 本次我们将讲解如何将代码放到嵌入式硬件上运行,本次例子将dbc文件导入simulink中,生成代码,不需要我们自己实现数据库的内容。 导入DBC文件 新建一个simulink模型 MCU_CAN.slx simulink具…

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、OpenCV和OpenGL的区…

SpringBoot常用操作

SpringBoot常用操作 SpringBoot启动过程 1. 生成一个SpringApplication的对象1. webApplicationType 推测web应用类型(NONE、REACTIVE、SERVLET)2. 从spring.factories中获取BootstrapRegistryInitializer对象3. initializers 从spring.factories中获…

A brief taste of JIFA

JIFA 是阿里贡献给 Eclipse 的一个适用于 Java 应用的问题诊断应用。 它以图形化的方式展示 Heap Dump AnalysisGC Log AnalysisThread Dump Analysis 因为云环境/生产环境的一些限制,应用的问题可能不能被就地分析,所以Jifa provides a web solution…

关于运动模糊问题的分析及处理方法

1、问题背景 前段时间有做一个化妆镜项目,就是一面镜子上装有一个摄像头,用户对着镜子化妆时,可同时用来采集人脸信息,分析人脸用的。客户反馈抓拍静止的人脸图像时,画面正常,而当人脸稍微运动时&#xff…

java springboot整合MyBatis实现分页查询以及带条件的分页查询

之前的文章 java springboot整合MyBatis做数据库查询操作操作了springboot整合MyBatis,然后简单做了个按id查询的操作 那么 我们按上文搭建起的环境继续 我们直接在staffDao接口中声明一个分页函数 Select("select * from staff limit #{page},#{pageSize}&q…

【Vue】Vite 组件化开发

文章目录 组件化开发一、组件化开发思想二、Vue 组件的构成2.1 组件组成结构2.2 组件 template 节点2.2.1 在 template 中使用指令2.2.2 在 template 中定义根节点 2.3 组件的 script 模板 三、组件的基本使用3.1 组件的注册3.1.1 全局组件注册3.1.2 局部组件注册 3.2 组件样式…

ffmpeg命令参数

主要参数 -i 设定输入流 -f 设定输出格式(format) -ss 开始时间 -t 时间长度视频参数 -vframes 设置要输出的视频帧数 -b 设定视频码率 -b:v 视频码率 -r 设定帧率 -s 设定画面的宽与高 -vn 不处理视频 -aspect aspect 设置横纵比4:3 或16:9 或1.333或…

软件项目管理 第三章软件项目的启动过程课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第三章 软件项目的启动过程 课后习题参考答案 1.选择题 (1)乙方在项目初始阶段的主要任务不包含以下哪一项(D)。 A. 项目分析 B. 竞标 C. 合同签署 D. 合同管理 (2)项目章程中不…

Spring Boot Configuration Annotation Processor not configured 问题解决

目录 问题抛出: ConfigurationProperties 问题抛出: 进行Spring Boot配置文件部署时,发出警告Spring Boot Configuration Annotation Processor not configured,但是不影响运行。 不过有时候springboot项目出错了并且排除了所有…

【裸机开发】中断系统 —— 中断向量表(设置中断向量偏移的原因)

之前的LED驱动不存在中断,也就不包含中断的初始化。如果程序包含了中断,我们应还需要初始化哪些内容?要解决这个问题,我们需要先了解一个中断系统包含了哪些内容。 ① 中断向量表:描述中断对应的中断服务函数&#xf…

C++笔记之stack、queue、priority_queue、deque

code review! C笔记之stack、queue、priority_queue、deque 文章目录 C笔记之stack、queue、priority_queue、deque一.cppreference介绍1.stack2.queue3.priority_queue4.deque 二.容器适配器三.stack详解1.创建一个不包含任何元素的 stack 适配器,并采用默认的 de…

Debian 12中再次安装R软件

上篇博客(地址:https://blog.csdn.net/my1114/article/details/131347147?spm1001.2014.3001.5501)中所述的,在Debian12中按默认方式编译安装R软件,有一定的局限性。 如下图所示: 因此,本…

Redis入门(2)-字符串

String是Redis最基础、最常见的类型,string类型的value中可存放任意数据,包括数值型、二进制的图片、音频、视频、序列化对象等。一个String类型的value最大是512M. 1.getset k v 若key存在返回之前的值,若不存在返回nil 2.strlen key 返…

【面试】标准库相关题型(三)

文章目录 1. unordered_map底层实现原理1.1 散列表1.2 STL 中的 unordered_map 的实现1.3 unordered_map 2. 迭代器底层实现原理及种类2.1 主要作用2.2 底层原理2.3 迭代器类型属性 3. 迭代器失效3.1 容器类别3.2 失效情况3.3 C11容器类别 4. STL容器的线程安全4.1 背景知识4.2…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能,而不会影响到主要的代码…