CAN协议详解-01

2023-11-17

CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下:

 

CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。

我们来贴图一个车载网络构想图

 

1.2 CAN 物理层

与 I2C、SPI 等具有时钟信号的同步通讯方式不同,CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。我们来看一个示意图

 

1.2.1 闭环总线网络

CAN 物理层的形式主要有两种,图中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻。

 

1.2.2 开环总线网络

图中的是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻。

 

1.2.3 通讯节点

从 CAN 通讯网络图可了解到,CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。

CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。其中CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及 CAN_Low 是一对差分信号线,使用比较特别的差分信号,下一小节再详细说明。

当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线 CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到控制器中。

例如,STM32 的 CAN 片上外设就是通讯节点中的控制器,为了构成完整的节点,还要给它外接一个收发器,在我们实验板中使用型号为 TJA1050 的芯片作为 CAN 收发器。 CAN 控制器与 CAN收发器的关系如同 TTL 串口与 MAX3232 电平转换芯片的关系, MAX3232 芯片把 TTL 电平的串口信号转换成 RS-232 电平的串口信号,CAN 收发器的作用则是把 CAN 控制器的 TTL 电平信号转换成差分信号 (或者相反) 。

目前有以下CAN电平转换芯片(不全)

 

我们来用TJA1050来看下原理图:

 

1.2.4 差分信号

差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示

逻辑 0 和逻辑 1。见图,它使用了 V+ 与 V-信号的差值表达出了图下方的信号。

 

相对于单信号线传输的方式,使用差分信号传输具有如下优点:

• 抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的共模噪声可以被完全抵消。

举一个例子,正常的单线假设逻辑1是3.3V,逻辑0假设是0V,但是如果有噪声,把3.3V弄成了0V(极端),把0V弄成了-3.3V,此时就逻辑错误,但是有Can高/Can低一般都作用于两根线,所以两个虽然都有噪声影响,但是差值还是不变的

• 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。

举一个例子,假设一根是10V,一根是-10V,单跟都会对外部造成电磁干扰,但是CAN可以把线拧在一起,跟编麻花一样,可以互相抵消电子干扰

• 时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。

由于差分信号线具有这些优点,所以在 USB 协议、485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。

1.2.5 CAN 协议中的差分信号

CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定,见表及图。以高速 CAN 协议为例,当表示逻辑 1 时 (隐性电平) ,CAN_High 和 CAN_Low 线上的电压均为 2.5v,即它们的电压差 VH-V:sub:L=0V;而表示逻辑 0 时 (显性电平) ,CAN_High 的电平为 3.5V,CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-V:sub:L=2V。例如,当 CAN收发器从 CAN_Tx 线接收到来自 CAN 控制器的低电平信号时 (逻辑 0),它会使 CAN_High 输出3.5V,同时 CAN_Low 输出 1.5V,从而输出显性电平表示逻辑 0 。

 

 

在 CAN 总线中,必须使它处于隐性电平 (逻辑 1) 或显性电平 (逻辑 0) 中的其中一个状态。假如有两个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。

由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。

1.3 CAN 协议层

1.3.1 CAN 的波特率及位同步

由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地, CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

1.3.2 位时序分解

为了实现位同步,CAN 协议把每一个数据位的时序分解成如图 所示的 SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。为方便表示,图 中的高低电平直接代表信号逻辑 0 或逻辑 1(不是差分信号)。

 

该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq, PBS1段占 5Tq, PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

各段的作用如介绍下:

• SS 段 (SYNC SEG)

SS 译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS 段的大小固定为 1Tq。

• PTS 段 (PROP SEG)

PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小可以为 1~8Tq。

• PBS1 段 (PHASE SEG1),

PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1 段的初始大小可以为 1~8Tq。

• PBS2 段 (PHASE SEG2)

PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2 段的初始大小可以为 2~8Tq。

1.3.3 通讯的波特率

总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个 Tq,就可以确定 CAN 通讯的波特率。

例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit=19us,从而每秒可以传输的数据位个数为:1x10次方/19 = 52631.6 (bps)

这个每秒可传输的数据位的个数即为通讯中的波特率。

1.3.4 同步过程分析

波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就需要用到数据位内的 SS、PTS、PBS1 及 PBS2 段了。根据对段的应用方式差异, CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:

(1) 硬同步

若某个 CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号 (即下一小节介绍的帧起始信号),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。见图 ,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 SS 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

 

(2) 重新同步

前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步 (帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。重新同步的方式分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。第一种相位超前的情况如图 ,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步。

 

第二种相位滞后的情况如图 ,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步。

 

在重新同步的时候,PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度SJW* (reSynchronization Jump Width)”。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了最大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加大,但通讯的速度会下降

1.3.5 CAN 的报文种类及结构

在 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线,I2C 协议包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。

1.3.5.1 报文的种类

在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。

为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如表

 

1.3.5.2 数据帧的结构

数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,见图

 

数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。

2.1 CAN 控制内核

框图中标号处的 CAN 控制内核包含了各种控制寄存器及状态寄存器,我们主要讲解其中的主控制寄存器 CAN_MCR 及位时序寄存器 CAN_BTR。

2.1.1 主控制寄存器 CAN_MCR

主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式,它使用以下寄存器位实现控制。

2.1.2 位时序寄存器 (CAN_BTR) 及波特率

 

 

代码清单 CAN 初始化结构

 

CAN 发送及接收结构体

 

CAN 筛选器结构体

 

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

CAN协议详解-01 的相关文章

  • 华为ipd产品开发流程_IPD模式下的产品开发流程

    IPD产品开发流程体系 IPD产品开发流程体系来源于美国PRTM公司的 产品生命周期优化法 该体系集成了多个迄今为止最好的产品开发实践方法 也就是其来源于实践活动 反过来去指导实践 据PRTM公司统计 通过成功实施IPD 产品投入市场时间缩
  • Java中对象比较的三种方式

    一 针对对象值是否相等的比较 和 equals 的区别 当我们提到比较值的时候 大多数人都会想到 因为在一般情况下 人们对于比较的概念中 数字比较的应用场景出现频率是最多的 首先我们创建一个类 之后新建这个类的对象来进行比较验证 class
  • DDR中的ZQ校准

    转载自https www xuebuyuan com 3233906 html What s the ZQ Calibration command it used to calibrate DRAM Ron ODT values In no
  • Maven程序 tomcat插件安装与web工程启动

    第一步 在mvnrepository库中找到tomcat插件 1 打开mvnrepository官网 搜索 tomcat maven 向下滑动找到 org apache tomcat maven 点进去 2 在这里点第一个 Apache T
  • 基于Matlab的随机森林算法实现(附算法介绍及代码详解)

    本算例完整代码领取方式在文末展示 一 内容提要 在地学领域中 岩性的准确识别对于储层评价来说至关重要 因此 今天笔者想要分享的是随机森林算法在岩性识别中的应用与代码实现 科普中国 科学百科定义 随机森林 Random forest 指的是利

随机推荐

  • 一文学会目前最火热的大数据技术

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由michelmu发表于云 社区专栏 Elasticsearch是当前主流的分布式大数据存储和搜索引擎 可以为用户提供强大的全文本检索能力 广泛应用于日志检索 全站搜索等领域 L
  • C程序运行步骤

    1 首先输入和编辑源程序 生成 c文件 2 对源程序进行编译 编译的作用首先是对源程序进行检查 判定他有无语法方面的错误 生成 obj文件 3 然后进行连接处理 把编译后的模块连接装配起来 再与函数库 例如scanf printf 连接成一
  • Web开发权威指南笔记(一)

    书 Web开发权威指南 美 Chris Aquino Todd Gandee著 为1st实战项目Ottergram练习以及代码整理 全为个人借鉴本书产出 若需要转载请联系通知我 谢谢 最终成果展示 第一章 配置开发环境 文档与参考资料 De
  • 手把手教你从零开发到上线一个答题微信小程序项目实战教程之01.开发环境搭建,微信小程序helloworld

    上线项目演示 微信搜索 放马来答 或扫以下二维码体验 项目大纲 1 开发环境搭建 微信小程序helloworld 2 题目分类页 3 答题页mock数据 4 答题页请求真实数据 pay 5 答题页记录错题 6 结果得分页 pay 7 展示错
  • springmvc url地址配置

    springmvc url地址配置 RequestMapping 注解的概念 通过 RequestMapping将请求地址与方法进行绑定 可以在类级别和方法级别声明 类级别的注解负责将一个特定的请求路径映射到一个控制器上 将url和类绑定
  • django-admin.py startproject HelloWorld创建文件提示invalid syntax

    直接用win R 输入cmd 输入python 然后输入django admin py startproject HelloWorld创建文件提示invalid syntax 解决方法 直接在cmd下执行语句 即可生成Helloworld项
  • MybatisPlus入门和分页和条件查询里面的条件和null值的处理方式和查询投影和查询条件设置和id生成相关和逻辑删除

    MybatisPlus 简化了mybatis之前的在springboot整合MyBatis时需要自己写sql语句在接口中 现在只需要让接口继承BaseMapper lt 实体类 gt 然后在测试类中接口 增删改查方法 即可 不用像sprin
  • MMEditing代码阅读笔记一:main()函数中的build_model()

    MMEditing代码阅读笔记一 main 函数中的build model 小白一枚 编程功底很弱 接触MMEditing这套代码 刚开始小眉头一皱 鼠标见点来点去不知道咋个回事 网上又没有关于MMEditing代码阅读的相关阐述 眉头更皱
  • LEFT JOIN右表为空也查出数据

    SELECT A B type FROM Table A A LEFT JOIN Table B B ON A id B id WHERE B type 1 改为 SELECT A B type FROM Table A A LEFT JO
  • 在WinForm中屏蔽中文输入法

    在WinForm的开发中 有时有些特殊的要求 例如 在某个Form上彻底屏蔽中文输入法 使之不能切换到中文输入 不能进行中文输入 这个问题看上去简单 实现起来并没有想象中的简单 下面 把我做的几个实验依次列举 就会发现 其实实现起来还是有一
  • websocket菜鸟教程(1.1)

    创建自己的websocket服务 先了解node js websocket 的基本使用https www npmjs com package nodejs websocket 第一步先安装 npm install nodejs websoc
  • mysql5.6安装步骤详细_详解MySQL5.6安装步骤

    是开放源码的小型关系型数据库管理系统 目前MySQL被广泛应用于在Internet上的中小型网站中 但是对于刚接触MySQL数据库服务器的朋友来说 是非常陌生的 那么现在爱站小编为大家详解MySQL5 6步骤 1 点击下载好的安装文件 出现
  • console控制台错误及处理过程

    1 ERROR Failed to execute goal org apache maven plugins maven compiler plugin 2 5 1 compile default compile on project l
  • 为什么组件中的data是一个函数而不是一个对象?

    JS中的对象是引用类型的数据 当多个实例引用同一个对象时 只要有一个实例对这个对象进行操作 其他实例中的数据也会发生变化 而在vue中 更想要每个组件都有自己的数据 不会互相干扰 所以组件的数据不能写成对象的形式而要是函数的形式 数据以函数
  • Ubuntu下非常给力的下载工具

    Windows下的下载工具 迅雷 之所以下载速度快 乃是它能搜索资源 为己所用 而不是仅仅从原始地址这单一资源处下载 Ubuntu下也有类似的工具 那就是aira2 aira2是一个命令行下载工具 可以配合其他图形界面的下载软件使用 我用的
  • HyperLogLog数据结构

    基数计数 cardinality counting 通常用来统计一个集合中不重复的元素个数 例如统计某个网站的UV 或者用户搜索网站的关键词数量 数据分析 网络监控及数据库优化等领域都会涉及到基数计数的需求 要实现基数计数 最简单的做法是记
  • python读取csmar_如何优雅的把CSMAR(国泰安)数据导入R

    前言CSMAR 国泰安 数据库是经济金融相关的科研工作者用到的最多的数据库之一 它提供了丰富全面的上市公司财务及金融数据 以及一些行业宏观层面的数据 但是 它并没有像WRDS 沃顿研究数据服务 等数据库提供丰富接口 如SAS R等 供下载
  • 论文阅读笔记之——《Multi-level Wavelet-CNN for Image Restoration》及基于pytorch的复现

    本博文是MWCNN的阅读笔记 论文的链接 https arxiv org pdf 1805 07071 pdf 代码 https github com lpj0 MWCNN 仅仅是matlab代码 通过参考代码 对该网络在pytorch框架
  • C语言库函数——快排函数qsort()

    目录 一 函数原型 二 函数介绍 三 函数使用 常见写法 比较函数 四 函数实例 1 int型数组 2 double型数组 3 char型数组 4 字符串 5 结构体 一级结构 二级结构 一 函数原型 void qsort void bas
  • CAN协议详解-01

    CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519以及ISO11898 是国际上应用最广泛的现场总线之一 差