学习笔记 -- CAN系统基础

news2024/9/24 23:25:55

        一、CAN物理层

         一个双节点CAN网络示意图如下,两颗120Ω终端电阻并联呈现总线电阻60Ω。

       A、B两个节点的CAN收发器(Transceiver),只负责电平转换。当总线静默时,收发器内部的2.5V电源经15KΩ电阻把CAN-H和CAN-L都拉到2.5V,总线这个状态称之为隐性。当节点A想要驱动总线的时候(TX=0),它同时把内部的上下两个MOS管导通,整个网络的电流流向:节点A的5V电源经二极管、24Ω、两颗终端电阻并联、24Ω、二极管回到节点A的地,总线这个状态称之为显性。CAN总线上的电压实际上就是终端电阻的分压。从节点B来看,CAN-H就变成3.5V,CAN-L变成1.5V,拉出了总线 H - L = 2V 的差分电压,大于0.7V的判断阈值,节点B就认为收到了一个显性(RX=0)

        上图是TJA1050CAN收发器的Block Diagram,CAN收发器的CANH和CANL信号采用差分电平,具有很强的抗击共模噪声的能力。当两个晶体管都关断时,CANH和CANL上电压相同,都为 0.5VCC(CANH = CANL = 2.5V),此时为逻辑“1”(隐性状态Recessive) ;而当两个晶体管都打开时,CANH 和 CANL 上即存在一定的压差,且压差与负载电阻值相关,ISO 11898-2 要求此时 CANH 和 CANL 压差在 2V左右,此时为逻辑“0”(显性状态Dominant)。

        

       二、CAN数据链路层

        CAN总线定义四种帧类型,分别为数据帧、远程帧、错误帧和过载帧。

        (一)、CAN数据帧

        CAN数据帧结构上由7个段组成:帧起始、仲裁段、控制段、数据段、CRC段、ACK段和帧结束,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。

        1、CAN帧的格式

        标准格式的ID有11个位,从ID28到ID18被依次发送,禁止高7位都为隐性(禁止设定:ID=1111111XXXX)。扩展格式的 ID有29个位,基本ID从ID28到ID18,扩展ID由ID17到ID0 表示,基本ID和标准格式的ID相同。

        CAN数据帧各字段定义及长度分别为:

  • SOF:表示数据帧开始;(1 bit)
  • Identifier:标准格式11 bit,扩展格式29 bit包括Base Identifier(11 bit)和Extended Identifier(18 bit),该区段标识数据帧的优先级,数值越小,优先级越高;
  • RTR:远程传输请求位,0时表示为数据帧,1表示为远程帧,也就是说RTR=1时,消息帧的Data Field为空;(1 bit)
  • IDE:标识符扩展位,0时表示为标准格式,1表示为扩展格式;(1 bit)
  • DLC:数据长度代码,08表示数据长度为08 Byte;(4 bit)
  • Data Field:数据域,MSB优先传输;(0~8 Byte)
  • CRC Sequence:校验域,校验算法G(x) = x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1;(15 bit)
  • DEL:校验域和应答域的隐性界定符(Delimiter,DEL);(1 bit)
  • ACK:应答(ACK Slot),确认数据是否正常接收,所谓正常接收是指不含填充错误、格式错误、 CRC 错误。发送节点将此位为1,接收节点正常接收数据后将此位置为0;(1 bit)
  • DEL:ACK界定符(Delimiter,DEL),同样为隐性位,用于隔开;(1 bit)
  • SRR:替代远程请求位RTR,在扩展格式中占位用,必须为1;(1 bit)
  • EOF:连续7个隐性位(1)表示帧结束;(7 bit)
  • ITM:帧间空间,Intermission (ITM),又称Interframe Space (IFS),连续3个隐性位,但它不属于数据帧。帧间空间是用于将数据帧和远程帧与前面的帧分离开来的帧。数据帧和远程帧可通过插入帧间空间将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间空间。
        2、报文接收过滤

        CAN控制器大多具有根据ID过滤报文的功能,即只接收某些ID的报文。节点对接收到的报文进行过滤:比较消息ID与选择器(Accepter)中和接受过滤相关位是否相同。如果相同,接收;如果不相同,则过滤。

        消息在CAN总线上是广播式的,但并不是所有节点都会接收总线上所有消息。节点通过控制器中过滤码(Filter Code)和掩码(Mask Code),再检验总线上消息的标识符(29位),来判断是否接收该消息(Message Filtering)。

        对于掩码,“1”表示该位与本节点相关,“0”表示该位与本节点不相关

No.过滤码掩码备注
10x000010600x1FFFFFFF仅接收标识符为00001060的帧
20x000010600x1FFFFFF0接收消息标识符为00001060到 0000106F的帧
30x000010600x1FFFFFF8接收消息标识符为00001060到 00001067的帧
40x000010600x00000000节点接收总线上所有消息

 

        3、位填充

        CAN总线使用到的是非归零编码(NRZ),NRZ编码的优点是效率高,但却不易区分哪里是bit开始,哪里是bit结束。因此为确保在同步通信过程中有足够的电平跳变,规范中应用到位填充机制,即在每连续5个相同电平后插入 1个反相电平,接收节点在收到消息后自动将填充位删除。在帧内除了CRC界定符、ACK域和EOF外,其余部分均应用到位填充机制。在应用到位填充的域,检测到连续 6个显性位或隐性位均视为报错。检测到错误后,节点将发出主动错误标志。主动错误标志为连续6个显性位,它是不符合位填充规则的,因此检测到该电平的所有节点都会报错。

        位填充意味着实际传输的数据帧长度可能更长,下图示例位填充前后的数据帧的变化,紫色位是位填充增加的位,接收节点收到消息后会自动删除这些位。

        如上图,数据是0x01,二进制0000 0001,发送节点发到0000 0的时候发送节点会先插一个1,再发后续的001,成为0000 01001,共9bit长度,接收节点也会在第5bit的0之后预期一个无效的1,解码时抠掉。如果数据是0000 0100,第六位自带1,发送节点发到00000的时候也会先插一个1,再发后续的100,成为0000 01100,共9bit长度。

        标准格式CAN波形图如下,其中绿色的“1”为位填充。

        4、仲裁机制

        CAN-bus并没有规定节点的优先级,而是通过标识符ID来进行优先级的仲裁。

        CAN总线的信号电平具有线与特性,即显性电平(0)总是会掩盖隐性电平(1)。如果不同节点同时发送显性和隐性电平,总线上表现出显性电平(0),只有在总线上所有节点发送的都是隐性电平(1)时,总线才表现为隐性。

        CAN控制器在发送数据的同时会监测总线上的电平是否与发送数据对应的电平相同,如果不相同,则停止发送,进入只听模式。

        如果多个节点同时往总线上发送消息,总线的使用权是通过消息帧标识符的逐位仲裁机制决定的,在仲裁过程中消息是不会丢失的。这里的不会丢失的意思是指仲裁完成后,获得总线控制权的消息内容没有被仲裁过程篡改,将继续在总线上发送没有传输完的消息。

        在CAN总线上,标识符值越小,消息的优先级越高。标识符全零的消息,由于它将总线电平保持在显性的时间最长,因此优先级最高。

        5、ACK应答机制

        ACK在发送节点发送时,为隐性位。当一个接收节点接收的帧起始到CRC段之间的内容没有发生错误时,它将在ACK段发送一个显性电平。发送节点根据此显性电平判断发送成功。下图绿色的CAN TX信号,是接收节点在判断接收没有错误后发送的ACK应答显性电平。

        (二)、CAN错误帧

        CAN-bus错误类型:

        当出现以上任一种错误类型时,发送或接收节点将发送错误帧。错误帧由错误标志 + 错误界定符组成。错误标识分为主动错误标识和被动错误标识。

        发送节点发送了0或1的时候,会回读确认总线是否和自己的发送相符,比如在仲裁段抢优先级失败就会等下一帧再发;如果发到了数据段,按理说此时总线应该只有自己,如果突然发现回读的0/1与自己发的不同,比如受到了干扰,发送节点就会输出“主动错误标志”——连续6bit显性0,来主动抛弃后续报文,同时让接收节点知道这一帧有误。

        接收节点收到第6bit显性0的时候,因违背逢五补一的位填充规则,也会往总线上输出“主动错误标志”,所以会在总线上看到连续12bit的显性0,前6个来自发送节点,后6个来自接收节点。

        参考资料:

        一文读懂CAN系统架构和帧结构 - 知乎

        升维打击!用示波器排查CAN的各种错误帧

        以上资料及图片部分来源于网络,仅供个人学习用。如有侵权,请联系删除。

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

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

相关文章

前端(一):HTML+CSS

参考课程:23最新版web前端开发_哔哩哔哩_bilibili 文档:GitHub - codeNiuMa/HTML-md-file: 学习HTML课程时的资料 目录 1 HTML 1.1 骨架 DOCTYPE html标签 head标签 body标签 title标签 meta标签 1.2 标签标题h1 1.3 段落p 1.4 水平线 1.5 图片img 1.6 …

【Android12】Android Framework系列--AMS启动Activity分析

AMS启动Activity分析 通过ActivityManagerService(AMS)提供的方法,可以启动指定的Activity。比如Launcher中点击应用图标后,调用AMS的startActivity函数启动应用。 AMS提供的服务通过IActivityManager.aidl文件定义。 // frameworks/base/core/java/an…

【AI底层逻辑】——数学与机器学习:优雅的智慧之舞

目录 “宝藏网站” 聊聊数学 “华尔兹” “智慧之舞” 后续的章节我们将迎来新的篇章,新的切入点探索AI的奥秘,通过揭示高数、矩阵、概率论等数学知识与机器学习的关系来深入理解AI的奥秘! “宝藏网站” 开头先给大家上几个宝藏网站&am…

【离散数学】——期末刷题题库(欧拉图和哈密顿图)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

java中,用函数对象表示策略

简而言之,函数指针的主要用途就是实现策略(Strategy)模式。 Java没有提供函数指针,但是可以用对象引用实现相同的功能。调用对象上的方法通常是执行该对象上某项操作。 在Java中,使用函数对象(Function Object)表示策…

《数据结构、算法与应用C++语言描述》-机器调度-最长处理时间(LPT)

机器调度 完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_28LongestProcessingTime 问题描述 一个工厂具有 m台一模一样的机器。我们有n 个任务需要处理。设作业i的处理时间为 t i t_i ti​,这个时间包括把作业放入机器…

Amazon Aurora Limitless Database:数据库管理的全新境界

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 在当今数亿用户、PB级数据和数百万交易的业务环境中,数…

12.14_黑马数据结构与算法笔记Java

目录 120 二叉搜索树 min max 121 二叉搜索树 put 122 二叉搜索树 前任后任1 123 二叉搜索树 前任后任2 124 二叉搜索树 删除1 125 二叉搜索树 删除2 126 二叉搜索树 删除3 127 二叉搜索树 删除 递归1 128 二叉搜索树 删除 递归2 129 二叉搜索树 范围查询 130 二叉搜…

KUKA机器人如何隐藏程序或程序段?

KUKA机器人如何隐藏程序或程序段? 如下图所示,新建一个示例程序进行说明, 如下图所示,如果红框中的动作指令不想让别人看到,想隐藏起来,如何做到? 如下图所示,在想要隐藏的程序或程序段的前后,分别添加 ;fold 和 endfold指令(这里要注意是英文状态下的输入法), 如…

国标GB28181安防监控系统/磁盘阵列EasyCVR(V.3.4)新亮点:免保活功能

TSINGSEE青犀近日发布了EasyCVR安防管理平台的V.3.4版本,其中一大亮点就是很多朋友都在咨询的“免保活”功能,那么,什么是“免保活”功能?又该如何配置呢? 在EasyCVR平台有个【按需直播】按钮,顾名思义&…

如何部署Portainer容器管理工具+cpolar内网穿透实现公网访问管理界面

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

大象elephant目标检测数据集VOC+YOLO格式2300张

大象是长鼻目象科的哺乳动物,有两个属,是世界上最大的陆生动物。其像柱子一样的四肢和宽厚的脚掌可以稳稳支撑住庞大的身体。巨大的头上长有蒲扇状的大耳朵和长且有弹性的鼻子。象耳上有丰富的血管,可以有效散热。鼻子和上唇合而为一的象鼻由…

YB9225是一种固定工作频率的高效率电流模式升压转换器。

YB9225B 1.2 MHz。峰值5A 电流,升压转换器 概述 : YB9225是一种固定工作频率的高效率电流模式升压转换器。YB9225集成了一个非常低的 Rds-on NMOSFTET,以减少功率损耗和实现高效率。最高效率可达93% 。功率 MOSFET 的峰值电流限制在5 A。1.…

网站使用CDN后无法获取用户真实IP的解决方法

宝塔或Nginx环境 如果你使用的宝塔或Nginx,可以在宝塔面板或Nginx中,找到配置文件增加如下代码后,重载配置或者重启 Nginx 即可: #CDN获取真实ip set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; PHP语言函数方法…

36、什么是池化算法

池化算法也是 CNN 网络中非常常见的算法。 池化这一算法理解起来比较简单,从名字中或许可以看到一些东西:从一个像素池子中选取一些有代表性的像素出来。 常见的池化有最大池化和平均池化。最大池化就是从像素池子中选取最大值出来,而平均池化就是从像素池子中选取平均值出…

HTML---初识CSS

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS,开发者可以在不改变HTML标记结构的情况…

机器学习 | 机器学习基础知识

一、机器学习是什么 计算机从数据中学习规律并改善自身进行预测的过程。 二、数据集 1、最常用的公开数据集 2、结构化数据与非结构化数据 三、任务地图 1、分类任务 Classification 已知样本特征判断样本类别二分类、多分类、多标签分类 二分类:垃圾邮件分类、图像…

【数据结构入门精讲 | 第一篇】打开数据结构之门

数据结构与算法是计算机科学中的核心概念,也与现实生活如算法岗息息相关。鉴于全网数据结构文章良莠不齐且集成度不高,故开设本专栏,为初学者提供指引。 目录 基本概念数据结构为何面世算法基本数据类型抽象数据类型使用抽象数据类型的好处 数…

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

【SpringBoot】进阶之自定义starter(一起了解自定义starter的魅力)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringBoot开发》。🎯🎯…