【转】CAN总线学习笔记(1)- CAN基础知识

2023-05-16

依照瑞萨公司的《CAN入门书》的组织思路来学习CAN通信的相关知识,并结合网上相关资料以及学习过程中的领悟整理成笔记。好记性不如烂笔头,加油!


1 CAN的一些基本概念

1.1 什么是CAN总线

CAN 是 Controller Area Network 的缩写,是 ISO 国际标准化的串行通信协议。通俗来讲,CAN总线就是一种传输数据的线,用于在不同的ECU之间传输数据。
CAN总线有两个ISO国际标准:ISO11898 和 ISO11519。其中:

  • ISO11898 定义了通信速率为 125 kbps~1 Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米。
  • ISO11519 定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米。
    Tips: <总线的传输速率>:又称为总线的通信速率,指的是位速率。或称为比特率(和波特率不是一回事),表示的是:单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。

1.2 CAN的拓扑结构

下图中,左边是高速CAN总线的拓扑结构,右边是低速CAN总线的拓扑结构。
CAN拓扑结构
如图中所示,CAN总线包括CAN_H 和 CAN_L 两根线。节点通过CAN控制器CAN收发器连接到CAN总线上。

Tips :通常来讲,ECU内部集成了CAN控制器和CAN收发器,但是也有没集成的,需要自己外加。

1.3 CAN信号表示

在CAN总线上,利用CAN_H和CAN_L两根线上的电位差来表示CAN信号。CAN总线上的电位差分为显性电平隐性电平。其中显性电平为逻辑0隐性电平为逻辑1
ISO11898标准(125kbps ~ 1Mbps)和ISO11519标准(10kbps ~ 125kbps)中CAN信号的表示分别如下所示:
CAN信号表示

1.4 CAN信号传输

发送过程:
CAN控制器将CPU传来的信号转换为逻辑电平(即逻辑0-显性电平或者逻辑1-隐性电平)。CAN发射器接收逻辑电平之后,再将其转换为差分电平输出到CAN总线上。
CAN信号传输
接收过程:
CAN接收器将CAN_H 和 CAN_L 线上传来的差分电平转换为逻辑电平输出到CAN控制器,CAN控制器再把该逻辑电平转化为相应的信号发送到CPU上。
CAN接收器
概括的讲:

  • 发送方通过使总线电平发生变化,将其信息传递到CAN总线上。
  • 接收方通过监听总线电平,将总线上的消息读入自己的接收器。

2 CAN通信的特点

2.1 多主工作方式

所谓多主工作方式,指的是:总线上的所有节点没有主从之分,大家都处于平等的地位。反应在数据传输上,即是:在总线空闲状态,任意节点都可以向总线上发送消息。

Tips: <总线空闲状态>:当总线上的上出现连续的11位隐性电平,那么总线就处于空闲状态。也就是说对于任意一个节点而言,只要它监听到总线上连续出现了11位隐性电平,那么该节点就会认为总线当前处于空闲状态,它就会立即向总线上发送自己的报文。
至于为什么连续出现11位隐性电平,就可以判定+总线处于空闲状态,这个问题可以结合CAN协议的帧结构来进行理解。

在多主工作方式下:

  • 最先向总线发送消息的节点获得总线的发送权;
  • 当多个节点同时向总线发送消息时,所发送消息的优先权高的那个节点获得总线的发送权。
    例如:Node_A和Node_B同时向总线发送各自的消息Msg_1和Msg_2,如果Msg_1的优先级比Msg_2高,那么Node_A就获得了总线的发送权。

2.2 非破坏性位仲裁机制

在CAN协议中,所有的消息都以固定的帧格式发送。当多个节点同时向总线发送消息时,对各个消息的标识符(即ID号)进行逐位仲裁,如果某个节点发送的消息仲裁获胜,那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态。
例如:Node_A和Node_B同时向总线发送各自的消息Msg_1和Msg_2,那么对Msg_1的ID号ID_1和Msg_2的ID号ID_2进行逐位仲裁,如果仲裁结果是:ID_1的优先级比ID_2高,那么Msg_1在仲裁中获胜,于是发出Msg_1这条报文的节点Node_A就获得了总线的发送权。同时,Msg_2在仲裁中失败,于是Node_B就转换到监听总线电平的状态。

这种仲裁机制既不会造成已发送数据的延迟,也不会破坏已经发送的数据,所以称为非破坏性仲裁机制。这种仲裁方式的实现机制参见本系列笔记的第二篇CAN协议数据帧与遥控帧中的介绍。

2.3 系统的柔性

CAN总线上的节点没有“地址”的概念,因此在总线上增加节点时,不会对总线上已有节点的软硬件及应用层造成影响。

2.4 通信速度

在同一条CAN线上,所有节点的通信速度(位速率)必须相同,如果两条不同通信速度总线上的节点想要实现信息交互,必须通过网关。
例如:汽车上一般有两条CAN总线:500kbps的驱动系统CAN总线和125kbps的舒适系统CAN总线,如果驱动系统CAN总线上的发动机节点要把自己的转速信息发送给舒适系统CAN总线上的转速表节点,那么这两条总线必须通过网关相连。

2.5 数据传输方式

CAN总线可以实现一对一,一对多以及广播的数据传输方式,这依赖于验收滤波技术。验收滤波技术的实现机制参见本系列笔记的第二篇CAN协议帧结构中的介绍。

2.6 远程数据请求

某个节点Node_A可以通过发送“遥控帧”到总线上的方式,请求某个节点Node_B来发送由该遥控帧所指定的报文。具体实现方式参见本系列笔记的第二篇CAN协议帧结构中的介绍。

2.7 错误检测、错误通知、错误恢复功能

  • 所有的节点都可以检测出错误(错误检测功能);
  • 检测出错误的节点会立即通知总线上其它所有的节点(错误通知功能);
  • 正在发送消息的节点,如果检测到错误,会立即停止当前的发送,并在同时不断地重复发送此消息,直到该消息发送成功为止(错误恢复功能)。

2.8 故障封闭

节点能够判断错误的类型,判断是暂时性的数据错误(如噪声干扰)还是持续性的数据错误(如节点内部故障),如果判断是严重的持续性错误,那么节点就会切断自己与总线的联系,从而避免影响总线上其他节点的正常工作。

CAN通信的上述特点都是基于CAN协议所定义的多种帧结构来实现的,因此,在下一篇笔记对CAN的帧结构有了了解之后,再做进一步的详细解释。

3 CAN通信网络结构

3.1 OSI基本参照模型

实际上,CAN总线网络底层只采用了OSI基本参照模型中的数据链路层、传输层。而在CAN网络高层仅采用了OSI基本参照模型的应用层
CAN网络层次结构

3.2 CAN协议网络层次

在CAN协议中,ISO标准只对数据链路层和物理层做了规定。对于数据链路层和物理层的一部分,ISO11898和ISO11519-2的规定是相同,但是在物理层的PMD子层和MDI子层是不同的。
高速CAN和低速CAN的物理层差异
在CAN总线,每一层网络中定义的事项如下:
每一层中定义的事项

 

 

星星有个梦:你好,想跟大佬您请教下,can发送完数据后,是否会保持最后一次发送的数据波形,还是说can_h,can_l会合并在一起,恢复到发送数据前的初始状态;目前本人这边出现的情况是,临时用一个测试程序调试can驱动,结果发送完4帧数据后,发送结束了,但示波器测还有信号,现在想确定这个是正常情况,还是驱动里对发送数据没处理好.

发送完后不可能维持之前的状态,一定是进入总线空闲状态也就是隐性电平,不然任何之前的状态都有可能是显性状态后面节点发不出东西。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转】CAN总线学习笔记(1)- CAN基础知识 的相关文章

  • 如何将float转换为string

    可能有好多人 xff0c 包括C语言老手都不知道如何将float数据转换为string xff0c 我就是这样 xff0c 今天查了一下MSDN xff0c 才知道C提供了 gcvt函数实现这个功能 xff0c 收获着实不小 xff0c 为
  • SVN中update to revision与revert to revision的区别

    转载请注明 xff0c 来自 xff1a http blog csdn net skyman 2001 update to revision和revert to revision很像 xff0c 都会融合你本地未提交的修改 它们2个的区别是
  • OpenGL中不用AUX库来加载BMP图片作为纹理

    大家在OpenGL中一般是用aux库的auxDIBImageLoad 函数来加载BMP格式的图片来作为纹理 xff0c 这个确实是比较简单易用 xff0c 但aux库的性能不佳 xff0c 经常会出问题 xff0c 稳定性较差 所以一般最好
  • 程序员会设计后是一种什么样的感觉

    我是一个iOS开发的程序员 xff0c 也是一个自由职业者 平时靠接一些外包和做自己的产品为生 做了这么多年 xff0c 给我的感觉是 xff1a 如果你只会写程序 xff0c 那么做自由职业者的空间要小很多 01 我为什么要学设计 做自己
  • poll函数详解

    1 poll函数概述 select 和 poll 系统调用的本质一样 xff0c poll 的机制与 select 类似 xff0c 与 select 在本质上没有多大差别 xff0c 管理多个描述符也是进行轮询 xff0c 根据描述符的状
  • PID超详细教程——PID原理+串级PID+C代码+在线仿真调参

    目录 前言 仿真调参环境 案例引入 小球位置控制 抛开案例 更专业地理解PID 由虚到实 代码编写 最后一步 PID参数调整 总结 使用PID的步骤 更进一步 串级PID 前言 很多人应该都听说过PID xff0c 它的运算过程简单 xff
  • 滤波器和衰减器的电路设计

    一 滤波器影象参数法的设计 滤波器是一种典型的选频电路 xff0c 在给定的频段内 xff0c 理论上它能让信号无衰减地通过电路 xff0c 这一段称为通带外的其他信号将受到很大的衰减 xff0c 具有很大衰减的频段称为阻带 xff0c 通
  • Odroid XU4学习笔记

    Odroid XU4学习笔记 xff08 一 xff09 20161127 写文档的最初目的是自己在学习过程中踩了很多坑 xff0c 只为记录下 xff0c 避免自己以后或者他人重蹈覆辙 一 相关资源 用户手册 xff1a http mag
  • Mac JetBrains工具 2018破解方法 PhpStorm 2018、 WebStorm 2018、DataGrip2018、PyCharm2018

    1 自行安装PhpStorm WebStorm DataGrip PyCharm 2 下载破解补丁 xff0c 2018版下载地址 链接 xff1a https pan baidu com s 1TZ kXvkgF2t3hKusQl5TDQ
  • 树莓派UPS供电(附图、视频、代码)

    通过XiaoJi UPS做供电 xff0c 通过Arduino做控制 通过XiaoJi UPS来感知车辆是否处于启动状态 xff08 电瓶供电 xff09 xff0c 如果在启动状态转为熄火状态 xff0c 则XiaoJi UPS指定针脚会
  • freeRtos源码解析(二)–任务调度

    freeRtos源码解析 二 任务调度 一 启动任务调度器 启动任务调度器之后 xff0c CPU正式进入任务模式调度各任务 xff08 CPU在中断模式和任务模式之间不断轮转 xff09 freeRtos任务调度依赖于内核的三个中断 xf
  • Ubuntu Windows双系统切换技巧

    平时在宿舍或者在家需要用到实验室的电脑 xff0c 远程的时候切换系统是个麻烦的事情 还要担心实验室断电之后 xff0c 电脑关机了 没人帮忙开机 所以有了此文 1 远程唤醒电脑 如果你的主板支持定时开机 xff0c 那么这个问题就比较简单
  • Ubuntu18.04+ZED SDK安装+ZED Python API+zed ros wrapper安装 手把手详细教程

    1 安装前准备 1 ubuntu显卡驱动要有 xff0c 没有的可以搜索如何安装ubuntu显卡驱动 xff0c 教程很多 xff0c 这里不再详细说明 2 ROS需要提前安装好 xff0c 可以搜索ubuntu如何安装ROS 我这里安装的
  • 五种常见的聚类算法总结

    目录 一 关于聚类的基础描述 1 1 聚类与分类的区别 1 2 聚类的概念 1 3 聚类的步骤 二 几种常见的聚类算法 2 1 K means聚类算法 1 K means算法的流程 xff1a 2 xff09 K means算法的优缺点及算
  • 非科班如何自学深度学习转行

    前言 xff1a 博主已经学废了 xff0c 代码代码不行 xff0c 理论理论不行 xff0c 所以想把走过的路给大家讲讲经验 xff0c 仅供参考 研一前 xff1a 编程基础 xff1a Python为主 xff0c 一般的深度学习代
  • Pointpillars三维点云实时检测

    目录 一 项目方案 二 项目准备工作 1 安装并配置好Openpcdet的环境 2 安装好ROS melodic 三 项目工作空间创建及代码配置 四 具体代码修改与讲解 launch pointpillars launch的修改 launc
  • 神经网络模型的过拟合和欠拟合问题

    一 过拟合和欠拟合问题 过拟合定义 xff1a 模型在训练集上表现良好 xff0c 但在测试集上表现不好 过拟合原因 xff1a 1 原始特征过多 xff0c 存在一些噪声特征 xff0c 而模型过于复杂 xff0c 学习能力过强 xff0
  • 如何读取或转换PCD点云文件

    目录 一 Python方式 1 Open3D 2 直接用python读取并保存成bin格式 3 pypcd 二 C 43 43 方式 一 Python方式 1 Open3D 读取pcd文件 因为我的点云是ZED相机获得的 xff0c 所以是
  • Ubuntu不同版本的python如何进行切换

    ubuntu系统自带的有python2 7和python3 6 xff0c 也可以下其他的 运行下面的程序 xff0c 为python赋予优先使用等级 sudo update alternatives install usr bin pyt
  • 如何计算旋转框的IOU

    一 先将两个框转换为角点形式 一般我们得到的是中心点 xff0c 宽高 xff0c 和旋转角度 通过矢量旋转公式得到角点形式 二 判断四个角点是否在对方的框里 xff0c 并保存在里面的角点 A的角点向B的相邻的两条边投影 任意的B的两条边

随机推荐

  • centerpoint论文和代码解读

    目录 一 序论 二 论文结构 三 代码 论文地址 xff1a https arxiv org pdf 2006 11275 pdf 代码地址 xff1a tianweiy CenterPoint github com 一 序论 centor
  • 关于严蔚敏教授的数据结构一书中return ok ,OK为1不为0的问题

    在主函数即Main 函数中的return 需要返回0 xff0c 表示成功完成本函数 但是在严教授的书中所写的多数函数 xff0c 是status函数类型 xff0c 也就是说并不是主函数 xff0c 是子函数 xff0c 原则上子函数的r
  • MTN模型LOSS均衡相关论文解读

    目录 一 综述 二 依据任务不确定性加权多任务损失 三 依据不同任务的梯度大小来动态修正其loss权重GradNorm 四 根据LOSS变化动态均衡任务权重Dynamic Weight Average xff08 DWA xff09 五 R
  • 安装ceres库的避坑指南(附官方文档)

    目录 写在前面 1 Failed to connect to ceres solver google com port 443 解决办法 xff1a 更换源 2 OpenSSL SSL read Connection was reset e
  • 一文搞清apt与apt-get的异同

    本文翻译自Difference Between apt and apt get Explained It 39 s FOSS 译者注 xff1a 本人尽量以通俗易懂的方式展现原文的内容 xff0c 限于经验和水平 xff0c 错误之处欢迎指
  • SLAM≠机器人自主定位导航

    SLAM技术作为机器人自主移动的关键技术 xff0c 让很多人都误解为 xff1a SLAM 61 机器人自主定位导航 其实 xff0c SLAM 机器人自主定位导航 xff0c 不解决行动问题 SLAM如其名一样 xff0c 主要解决的是
  • slam是什么意思?一文带你读懂SLAM

    SLAM是Simultaneous localization and mapping缩写 xff0c 意为 同步定位与建图 xff0c 主要用于解决机器人在未知环境运动时的定位与地图构建问题 xff0c 为了让大家更多的了解SLAM xff
  • 自带SLAM和定位,不需要里程计的全新建图传感器—— SLAMTEC Mapper来了

    这些年 xff0c 我们引领并见证了激光传感器行业的快速发展 xff0c 是时候 xff0c 我们来搞点新的名堂了 xff01 下面 xff0c 有请今天的主角SLAMTEC Mapper 正式登场 xff01 Slamtec Mapper
  • ROS机器人编程学习(六)——ROS工具

    第6章 ROS工具 本章介绍了ROS的实用工具 RViz 和 rqt RViz是ROS的三维可视化工具 xff0c 便于三维视图的构建和显示 rqt是GUI开发工具 xff0c 便于图像查看 xff0c 重点介绍了rqt plot rqt
  • ZED2双目相机+IMU标定

    本文主要使用了kalibr工具标定ZED2双目相机 43 IMU xff0c 并运行VINS Fusion 阐述了标定板的选择方法 xff0c 以及标定中的注意事项 ZED2双目相机 43 IMU联合标定 1 安装标定工具2 选择标定板3
  • ZED2相机运行VINS-Fusion和ORB-SLAM3

    ZED2相机运行VINS Fusion和ORB SLAM3 1 关于zed2标定2 运行VINS Fusion3 运行ORB SLAM3 1 关于zed2标定 我最开始被zed2的标定问题折磨了好久 xff0c 用kalibr工具标定出来的
  • 用自己的设备跑各种VI-SLAM算法(1)——VINS/PL-VINS/ROVIO/MSCKF

    用自己的设备跑各种VI SLAM算法 xff08 1 xff09 1 VINS Fusion2 PL VINS3 ROVIO4 MSCKF 本人用的设备是一个海康单目相机和一个MTI惯导 xff0c 已经预先用kalibr工具标定了内外参
  • 【语言-汇编】自然常数(e)的计算

    原理介绍 它就是当 时函数 值的极限 即 xff1a 同时它也等于 计算结果 编译平台 xff1a Microsoft Visual Studio 2010 项目 xff1a Win32项目 空项目 CPU xff1a Intel R Co
  • 从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导

    本节学习IMU预积分 xff0c 推导离散时间下的IMU预积分公式 xff0c 并解读相应代码 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff1a
  • 从零学习VINS-Mono/Fusion源代码(六):后端优化

    本节解析VINS后端优化 xff0c 包括优化变量 残差约束的构建 xff0c ceres求解器等 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff
  • TX2配置RealSense D455相机SDK和ros驱动

    TX2配置RealSense D455相机SDK和ros驱动 1 SDK安装2 RealSense ros安装3 bug及解决3 1 realsense viewer显示usb2 13 2 Could not found ddynamic
  • C++中:和::的含义与区别

    前言 xff1a 相信大多数读者和我一样在C 43 43 中总是分不清 xff1a 和 xff1a xff1a 的区别 xff0c 现在 xff0c 咱们就彻底解决它 一 1 类作用域操作符 指明了成员函数所属的类 如 xff1a M f
  • Nuttx驱动(一)简介

    第一次写Nuttx系统的驱动 xff0c 用惯了rt thread FreeRTOS等RTOS或裸机的驱动编写 写Nuttx驱动感觉好蹩脚 xff0c 顺便记录一下 xff08 by the way 先完成 xff0c 再完善 xff09
  • Nuttx驱动(二)实例

    接上一篇文章 xff0c 这篇主要是nuttx驱动编写实践部分 基础部分请移驾 Nuttx驱动 xff08 一 xff09 简介 Nuttx驱动例程 在该例程中 xff0c 假设有这么一个设备 xff1a 有3个IO输出和一个IO输入的RG
  • 【转】CAN总线学习笔记(1)- CAN基础知识

    依照瑞萨公司的 CAN入门书 的组织思路来学习CAN通信的相关知识 xff0c 并结合网上相关资料以及学习过程中的领悟整理成笔记 好记性不如烂笔头 xff0c 加油 xff01 1 CAN的一些基本概念 1 1 什么是CAN总线 CAN 是