CAN现场总线基础知识总结,看这一篇就理清了(CAN是什么,电气属性,CAN通协议等)

news2024/10/6 11:12:58

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 

《QT开发实战》

《嵌入式通用开发实战》

《从0到1学习嵌入式Linux开发》

《Android开发实战》

《实用硬件方案设计》

长期持续带来更多案例与技术文章分享;

欢迎商业项目咨询,10年+软硬全栈内功,助力解决您的尊贵需求。

原文链接:https://blog.csdn.net/w464960660/article/details/129127589

——————————————————————————————————

目录

0 引言

1 CAN是什么?

2 CAN的电气属性

3 CAN通信协议

3.1 数据帧

3.2 遥控帧

3.3 错误帧

3.4 过载帧

3.5 帧间隔

4 CAN通信速率

5 总结


0 引言

        CAN是一种应用广泛的现场总线,由于其高可靠性,多应用于工业自动化、船舶、汽车、医疗和工业设备等方面,如汽车上大量的传感器与模块都是通过CAN总线连接起来的。 本次博文根据瑞萨的《CAN入门书》,对CAN协议进行一个梳理总结,包括其概念、电气属性、协议、速率等,意在对CAN有一个基础性的认知,详细协议等可参见原书。

1 CAN是什么?

        CAN,是Controller Area Network的英文缩写,也就是控制局域网络,其最早由德国BOSCH开发,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。BOSCH博世主要是做汽车电子的,因此CAN一开始主要是为汽车电子开发的,目前已经是汽车网络的标准协议。当然,经过几十年的发展,CAN协议的高性能和可靠性已经得到了业界的认可,目前除了汽车电子外,也广泛应用于工业自动化、医疗、工业和船舶等领域。

        以汽车电子为例,汽车上的电子设备很多,空调、车门、发动机、大量传感器等,这些设备就是通过CAN总线连接形成一个网络,如下图所示:

        图中的各个单元通过CAN总线连接,每个单元都是独立的节点,同一个CAN网络中单元的通信速度一致,不同网络间速度可以不同。

CAN的主要特点如下:

  • 1)多主控制:总线空闲时,所有单元都可以发送消息,当两个以上单元同时开始发送消息时,根据标识符ID(并非发送的目的地址)决定优先级,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收。
  • 2)系统的柔软性:与总线相连的单元没有类似于“地址”的信息,因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
  • 3)通信速度快,距离远:最高 1Mbps(距离<40M),最远达10KM(速率<5Kbps)。
  • 4)具有错误检测、错误通知和错误恢复功能:所有单元都可以检测错误,检测出错误的单元会立即通知其他所有单元。正在发送消息的单元一旦检测出错误,会强制结束当前的发送,然后不断反复地重新发送此消息直到成功为止。
  • 5)故障封闭功能:CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等),若为后者,可将引起此故障的单元从总线上隔离出去。
  • 6)连接节点多:CAN 总线是可同时连接多个单元的总线,可连接的单元总数理论上没有限制,但实际上受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,单元数减少。

2 CAN的电气属性

        CAN总线使用两根线来连接各个单元:CAN_H、CAN_L,CAN控制器通过判断这两根线上的电位差来得到总线电平,分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时CAN_H电平比CAN_L 高,分别为 3.5V 和 1.5V,电位差为 2V。隐形电平表示逻辑“1”,此时 CAN_H 和 CAN_L 电压都为 2.5V 左右,电位差为 0V。  当CAN 总线上没有节点传输数据,即总线空闲时,总线电平一直处于隐性。

        CAN 节点单元连接到CAN总线时, CAN_H 接CAN_H、CAN_L 接 CAN_L,CAN 总线两端要各接一个 120Ω的端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。CAN2.0传输速度可达 1Mbps/S,最新的 CAN-FD 最高速度可达 5Mbps/S,甚至更高,传输速度和总线距离有关,总线距离越短,传输速度越快。

3 CAN通信协议

        通过CAN总线传输数据是需要按照一定协议进行,CAN 协议提供了 5 种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和间隔帧,用途如下:

3.1 数据帧

数据帧由7段组成:

  • 1)帧起始:表示数据帧开始的段;
  • 2)仲裁段:表示该帧优先级的段;
  • 3)控制段:表示数据的字节数及保留位的段;
  • 4)数据段:数据的内容,一帧可发送 0~8 个字节的数据;
  • 5)CRC段:检查帧的传输错误的段;
  • 6)ACK 段:表示确认正常接收的段;
  • 7)帧结束:表示数据帧结束的段。

        以上是数据帧标准格式和扩展格式两种帧结构,图中 D 表示显性电平 0、 R 表示隐性电平 1, D/R 表示显性或隐性,也就是 0 或 1。

(1)帧起始

        标准格式和扩展格式都是由一1位的显性电平 0 来表示帧起始。

(2)仲裁段

        仲裁段表示帧优先级,标准格式和扩展格式的仲裁段不同,从上图可见,标准格式的 ID 为 11 位,发送顺序是从 ID10 到 ID0,最高 7 位 ID10~ID4 不能全为隐性(1),也就是禁止0X1111111XXXXX这样的 ID。扩展格式的 ID 为 29 位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0,基本ID 与标准格式一样,禁止最高 7 位都为隐性。

(3)控制段

        控制段由 6 个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,r1 和 r0 为保留位,保留位必须以显性电平发送。 DLC 为数据长度,高位在前, DLC 段有效值范围为 0~8。

(4)数据段

        数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8 个字节的数据,从最高位(MSB)开始发送。

(5)CRC段

        CRC段保存CRC校准值,用于检查帧传输错误,标准格式和扩展格式相同。CRC 段由 15 位的 CRC 值与 1 位的 CRC 界定符组成。 CRC 值的计算范围包括:帧起始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用计算得到的 CRC 值与此CRC段进行比较,如果不一致的话就会报错。

(6)ACK段

        ACK 段用来确认接收是否正常,标准格式和扩展格式相同,ACK 段由 ACK 槽(ACK Slot)和 ACK 界定符两部分组成。 发送单元的 ACK,发送 2 个隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是所有接收单元中接收到正常消息的单元, 所谓正常消息是指不含填充错误、格式错误、 CRC 错误的消息,这些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。

(7)帧结束

        帧结束段,标准格式和扩展格式相同,帧结束段很简单,由 7 位隐性位构成。

3.2 遥控帧

接收单元向发送单元请求数据的时候用遥控帧,遥控帧由6个段组成:

1)帧起始:表示数据帧开始的段;
2)仲裁段:表示该帧优先级的段;
3)控制段:表示数据的字节数及保留位的段;
4)CRC段:检查帧的传输错误的段;
5)ACK 段:表示确认正常接收的段;
6)帧结束,表示数据帧结束的段。

        遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的 RTR 位为隐性的,数据帧的 RTR 位为显性,因此可以通过 RTR 位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此 DLC 表示的是所请求的数据帧数据长度,遥控帧的其他段参考数据帧,不再赘述。

3.3 错误帧

        当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分组成:

        错误标志有主动错误标志和被动错误标志两种,主动错误标志是 6 个显性位,被动错误标志是 6 个隐性位,错误界定符由 8 个隐性位组成。

3.4 过载帧

        接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定符构成:

        过载标志由 6 个显性位组成,与主动错误标志相同,过载界定符由 8 个隐性位组成,与错误帧中的错误界定符构成相同。

3.5 帧间隔

        帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的任何帧隔开,过载帧和错误帧前不能插入帧间隔。

        间隔由 3 个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表示总线空闲,发送单元可以访问总线。延迟发送由 8 个隐性位构成,处于被动错误状态的单元发送一个消息后的帧间隔中才会有延迟发送。

4 CAN通信速率

        CAN总线以帧的形式发送数据,到总线上的就是“0”和“1”这样的二进制数据,这里就涉及到了通信速率,即每秒钟发送多少位数据,CAN2.0 最高速度为1Mbps/S。对于CAN总线,一个位分为 4 段:

  • 1)同步段(SS)
  • 2)传播时间段(PTS)
  • 3)相位缓冲段 1(PBS1)
  • 4)相位缓冲段 2(PBS2)

        这些段由 Tq(Time Quantum)组成,Tq 是 CAN 总线的最小时间单位。帧由位构成,一个位
由 4 个段构成,每个段又由若干个Tq 组成,这个就是位时序。 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。 各段的作用和 Tq 数:

 1个位的构成示意图:

        上图中,采样点是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1结束处。根据这个位时序,我们就可以计算 CAN 通信的波特率了。

        前面提到的 CAN 协议具有仲裁功能,下面我们来看看是如何实现的。在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程:

        单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1 仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。

5 总结

        本次博文根据瑞萨的《CAN入门书》,对CAN协议进行一个梳理总结,包括其概念、电气属性、协议、速率等,意在对CAN有一个基础性的认知,详细协议等可参见原书。

作于202302211810,已归档

———————————————————————————————————

本文为博主原创文章,未经博主允许不得转载!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

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

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

相关文章

FPGA纯Vhdl实现MIPI CSI2RX视频解码输出,OV13850采集,提供工程源码和技术支持

目录1、前言2、Xilinx官方主推的MIPI解码方案3、纯Vhdl方案解码MIPI4、vivado工程介绍5、上板调试验证6、福利&#xff1a;工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了&#xff0c;MIPI解码难度之高&#xff0c;令无数英雄竞折腰…

Vue3电商项目实战-商品详情模块3【07-★规格组件-SKUSPU概念、08-★规格组件-基础结构和样式、09-★规格组件-渲染与选中效果】

文章目录07-★规格组件-SKU&SPU概念08-★规格组件-基础结构和样式09-★规格组件-渲染与选中效果07-★规格组件-SKU&SPU概念 官方话术&#xff1a; SPU&#xff08;Standard Product Unit&#xff09;&#xff1a;标准化产品单元。是商品信息聚合的最小单位&#xff0…

二月天-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-5】 二月天 【案例介绍】 1.任务描述 二月是一个有趣的月份&#xff0c;平年的二月有28天&#xff0c;闰年的二月有29天。本例要求编写一个程序&#xff0c;从键盘输入年份&#xff0c;根据输入的年份计算这一年的2月有多少天。在计算二月份天数时&#xff0c;可以使…

【微信小程序】--创建第一个小程序项目项目文件的作用(二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

华为OD机试 - 数组合并(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

[业务逻辑] 订单超时怎么处理

文章目录1.订单的过程分析2.JDK自带的延时队列 (单机)3.RabbitMQ的延时消息 (消息队列方案)4.RocketMQ的定时消息 (消息队列方案)5.Redis过期监听 (Redis方案)6.定时任务分布式批处理 (扫表轮训方案)7.总结1.订单的过程分析 一个订单流程中有许多环节要用到超时处理 买家超时未…

echarts 饼状图 label 既在内部显示数值(百分比),又显示外部指示线

需求 项目开发中&#xff0c;产品经理绘制的原型图中&#xff0c;需要前端实现一个饼状图&#xff0c;且既在饼图内部中 显示 百分比&#xff0c;又显示 外部指示线及数值&#xff0c;效果如下图所示&#xff1a; 查了下 Echarts 官网文档&#xff0c;需要配置 series 下的 la…

使用vs2022编译yolov5+tensorRT+cuda+cudnn代码进行混合编译

首先依赖有cuda、cudnn、tensorrt、protobuf&#xff0c;从Linux的代码直接移植过来这些库是没法使用的&#xff0c;需要下载对应win的下的版本&#xff0c;其中cuda、cudnn和tensorrt直接从官方下载即可&#xff0c;但是protobuf需要自己编译一下&#xff08;protobuf3.11.4&a…

unix高级编程-fork之后父子进程共享文件

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件. 这里我看到的是centos的操作&#xff0c;但我用的是debian系的ubuntu&#xff0c;百度了一下发现debian的在这里…

【数据挖掘实战】——基于水色图像的水质评价

项目地址&#xff1a;Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、水色分类 3、原始数据 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体流程 第1步&#xff1a;数据预处理——图像切割 第2步&#xff1a;特征提取 ​…

健身蓝牙耳机推荐,推荐五款适合健身的蓝牙耳机

出门运动健身&#xff0c;有音乐的陪伴是我们坚持运动的不懈动力&#xff0c;在健身当中佩戴的耳机&#xff0c;佩戴舒适度以及牢固程度是我们十分需要注意的&#xff0c;还不知道如何选择健身蓝牙耳机&#xff0c;可以看看下面这些运动蓝牙耳机分享。 1、南卡Runner Pro4骨传…

大bug!ChatGPT居然不懂最新的量子计算?

&#xff08;图片来源&#xff1a;网络&#xff09;近期&#xff0c;背靠微软的AI语言模型ChatGPT风靡全网&#xff0c;以社交媒体为传播媒介&#xff0c;仅5天&#xff0c;注册用户数就超过100万&#xff0c;2个月破亿。随后谷歌眼红不已&#xff0c;匆忙召开自研AI搜索工具Ba…

【Python】变量类型,赋值+多个变量赋值

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 好像还有一些小伙伴还不是很会python的基础鸭~ 没关系啦~这不是还有我小熊猫嘛 ~ 源码资料电子书:点击此处跳转文末名片获取 Python 变量类型 变量是存储在内存中的值&#xff0c; 这就意味着在创建变量时会在内存中开辟一个空间。 基于…

java面试题-JUC集合类

ConcurrentHashMap1.为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?首先&#xff0c;HashTable 是一种线程安全的哈希表&#xff0c;它内部使用的是同步锁来保证线程安全。在并发读写的场景下&#xff0c;同步锁会导致线程的阻塞&#xff0c;从而…

Linux 软件包安装

目录 通过源代码编译安装 通过RPM软件包安装 通过Yum软件仓库安装 配置本地Yum源 通过yum安装软件 通过Dnf软件仓库安装 Linux软件包安装有四种方式&#xff1a;源代码、RPM、Yum、Dnf安装四种方式 通过源代码编译安装 通过源代码编译安装可以根据需求定制软件&#xff…

Prefect 工作流中修改ray的地址

事情的起因 prefect 默认创建ray在127.0.0.1 上&#xff0c;我想在外网访问&#xff0c;想修改为0.0.0.0 尝试解决思路1&#xff08;可行&#xff09; 自己本地安装一个ray&#xff0c;但是连接不了redis重新安装redis&#xff0c;使用docker安装的docker 安装需要将redis.…

数据结构-算法的空间复杂度(1.2)

目录 1.空间复杂度 1.1 例子 1.2 空间的特殊性质 写在最后&#xff1a; 1.空间复杂度 空间复杂度也是一个数学表达式&#xff0c; 是对一个算法在运行过程中临时占用存储空间大小的量度。 他也是用大O渐进表示法。 1.1 例子 例1&#xff1a; 冒泡排序&#xff1a; v…

【C语言进阶】字符串函数与内存函数的学习与模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.字符串处理函数介…

【设计模式】对象行为型模式

行为创建型模式 系列综述&#xff1a; 来源&#xff1a;该系列是主要参考《大话设计模式》和《设计模式(可复用面向对象软件的基础)》&#xff0c;其他详细知识点拷验来自于各大平台大佬的博客。 总结&#xff1a;汇总篇 如果对你有用&#xff0c;希望关注点赞收藏一波。 文章目…