9 CAN总线

9.1 CAN简介

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商BOSCH(博世)公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。

9.1.1 CAN基本参数

表9.1-1 CAN基本参数列表

ISO11898 ISO11519-2
最大传输速率 1Mbps 125Kbps
最大传输距离
40m/1Mbps
1km/40kbps
节点数 理论上没有限制
连接方式 半双工
接线数 2
工作方式 差分(平衡)

9.1.2 CAN 的特点

(1) 多主控制
    在总线空闲时,所有的单元都可开始发送消息(多主控制)。 最先访问总线的单元可获得发送权(CSMA/CA 方式*1)。 多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
(2) 消息的发送
     在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新 消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
(3) 系统的柔软性
     与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
(4) 通信速度
    根据整个网络的规模,可设定适合的通信速度。在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
(5) 远程数据请求
    可通过发送“遥控帧” 请求其他单元发送数据。
(6) 错误检测功能、错误通知功能、错误恢复功能
    所有的单元都可以检测错误(错误检测功能)。检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
(7) 故障封闭
    CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部 故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
(8) 连接
    CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元 数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接 的单元数减少。

9.2 CAN的ISO标准

    CAN 协议如表 3 所示涵盖了 ISO 规定的 OSI 基本参照模型中的传输层、数据链路层及物理层。 CAN 协议中关于 ISO/OSI 基本参照模型中的传输层、数据链路层及物理层,具体有哪些定义如表9-2 所示。

表9.2-2 ISO/OSI 基本参照模型

图9.2-1 ISO/OSI 基本参照模型和 CAN 协议

    数据链路层分为 MAC 子层和 LLC 子层,MAC 子层是 CAN 协议的核心部分。数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行。 在物理层定义了信号实际的发送方式、位时序、位的编码方式及同步的步骤。但具体地说,信号电平、通信速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义*1。这些必须由用户根据系统需求自行确定。

9.2.1  ISO11898 标准和 ISO11519-2 标准比较

CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同。

(1) 关于 ISO11898 
    ISO11898 是通信速度为 125kbps-1Mbps 的 CAN 高速通信标准。目前,ISO11898 追加新规约后,成为 ISO11898-1 新标准。
(2) 关于 ISO11519
    ISO11519 是通信速度为 125kbps 以下的 CAN 低速通信标准。ISO11519-2 是 ISO11519-1 追加新规约后的版本。
表 9.2-2 ISO11898 和 11519-2 物理层的主要不同点

9.3 CAN物理层

9.3.1 CAN拓扑结构

    CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

图9.3-1 CAN连接图

9.3.2 硬件构成

如图图9.3-1所示:CAN总线的硬件构成是由MCU + CAN控制器 + CAN收发器构成。一些单片机内部集成了CAN控制器,因此可以直接连接CAN收发器。(如集成CAN控制器的单片机如NXP半导体的P87C591)常用的CAN控制器芯片如:SJA1000、SIT1057、GCA1000T等。常用的CAN收发器芯片如表9.3-1所示。

表9.3-1

图9.3-2 CAN收发器电路1

图9.3-3 CAN收发器电路2

9.3.3 CAN协议电平

和RS485一样,CAN总线使用双绞线进行差分电压传输,两条信号线被称为CAN高(CAN_H)和CAN低(CAN_L)。

图9.3-4 ISO11898、ISO11519-2 的物理层特征

如上图所示:对于ISO11898协议来说,两条线静态时均为2.5V左右,此时状态表示为逻辑1,也被称作隐性。当两条线电压值出现差异时,通常CAN_H=3.5V和CAN_L=1.5V,此时状态表示为逻辑0,也称作显性。即:

差分电压CAN_diff = 0V,表示逻辑“1”,为隐性;

差分电压CAN_diff = 2V,表示逻辑“0”,为显性;

显性电平用逻辑“0”表示,隐性电平用逻辑“1”表示,之所所以0为显性,其实这是因为CAN总线采用“线与”规则进行冲突仲裁,即当多个CAN信号同时发送时,有的发1有的发0,而只要有0,当前总线就是0(1&0 = 0),看上去就是1被0覆盖了。另一方面,从电位看,高电位为0,当1和0同时发送时,总线处于高电位,显现出来的是0,所以把0规定为显性。

9.4 CAN协议层

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

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

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

表9.4-3

9.4.1  数据帧的结构

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

图9.4-1 数据帧结构

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

(1) 帧起始

SOF 段 (Start OfFrame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

(2) 仲裁段

当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。

仲裁段的内容主要为本数据帧的 ID 信息 (标识符),数据帧具有标准格式和扩展格式两种,区别就在于 ID 信息的长度,标准格式的 ID 为 11 位,扩展格式的 ID 为 29 位,它在标准 ID 的基础上多出 18 位。在 CAN 协议中, ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的 ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得 CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁。

若两个节点同时竞争 CAN 总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。见图 ,在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元 1 发送的为隐性电平,而此时节点单元 2 发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元 2 竞争总线成功,这个报文得以被继续发送出去。

图9.4-2

仲裁段 ID 的优先级也影响着接收设备对报文的反应。因为在 CAN 总线上数据是以广播的形式发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN

控制器大多具有根据 ID 过滤报文的功能,它可以控制自己只接收某些 ID 的报文。回看数据帧格式,可看到仲裁段除了报文 ID 外,还有 RTR、IDE 和 SRR 位。

(a) RTR 位 (Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。

(b) IDE 位 (Identifier ExtensionBit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

(c) SRR 位 (Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

(3) 控制段

在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段 (Data Length Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8。

(4)数据段

数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成,MSB 先行。

(5) CRC 段

为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。

(6)ACK 段

ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。

(7) 帧结束

EOF 段 (End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

9.4.2 远程帧

通过发送远程帧,作为某数据接收器的站通过其资源节点对不同的数据传送进行初始化设置。远征帧由6个不同的位场组成,即帧起始、仲裁场、控制场、CRC场、应答场、帧结束。

与数据场相反,远程帧的RTR位是“隐形”的。远程帧没有数据场,数据长度码的数值是不受制约的(可以标注位容许范围值0 - 8里的任何值),此数值是相对与数据帧的数据长度码。远程帧组成如下图所示:

图9.4-3 远程帧组成

9.4.3 错误帧

错误帧由监控到总线错误的节点发送。它由两个不同的场组成,如图9-4所示:第一个场是不同节点提供的错误标志的叠加综合,第二个场是错误界定符。被动错误的节点要求总线至少有3个位时间长度的总线空闲才能正确地种植错误帧。

图9.4-4 错误帧格式

CAN协议规定两种的错误标志:主动的错误标志和被动的错误标志。

(a)主动的错误标志:由6个连续的显性位组成。

(b)被动的错误标志:由6个连续的隐性位组成。

9.4.4 过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。

(1)过载标志:6个位的显性位。过载标志的构成与主动错误标志的构成相同。

(2)过载界定符:8个位的隐性位。过载界定符的构成与错误界定符的构成相同。

图9.4-5 过载帧的构成

9.4.5 帧间隔

帧间隔是用于分割数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。

图9.4-6 帧间隔构成

(1)间隔:3个位的隐性位。

(2) 总线空闲:隐性电平,无长度限制(0亦可)。本状态下可视为总线空闲,要发送的单元可开始访问总线。

(3)延迟传送(发送暂时停止):8个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。

参考内容:

1.CAN入门书.pdf

2、秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_Wireless_Link的博客-CSDN博客

3、CAN总线原理-精华整理 - 知乎

嵌入式常用通讯协议2(CAN协议)相关推荐

  1. 常用应用层协议及HTTP协议

    文章目录 简介 HTTP HTTP协议特点 HTTP的组成结构 HTTPS HTTP2.0 HTTP 3.0 简介 应用层协议是用于精确定义不同主机件通信的规则,传输层提供端到端的数据逻辑传输,应用层 ...

  2. 嵌入式以太网第三部分——以太网协议实现

    目录: 1:概述 2:MAC地址设置 3:以太网协议 4:PING指令测试 1.概述 1.1:以太网是实现LAN的一种技术,它允许嵌入式系统连接到一个LAN中,并可通过使用网关经Internet连接到 ...

  3. 【信息系统项目管理师】常用网络标准与网络协议

    软考信息系统项目管理师(高级)必背之常用网络标准与网络协议 1  OSI七层模型 2  TCP/IP 3  协议类型 4  以太网规范 5  常用网络标准与网络协议总结 如果文章对你有帮助,记得点赞, ...

  4. java xmpp即时通讯_基于XMPP协议即时通讯工具开发总结

    一.概要 转眼毕业了,毕业设计的课题是"基于XMPP协议的通讯工具",开发平台式android,实现了基本的离线消息,文字聊天,表情聊天,文件传输,语音聊天的功能. 本文主要介绍开 ...

  5. 新能源储能仪表推荐-ACR10R-D16TE4 防逆流仪表通讯接线及Modbus-RTU协议通讯表说明

    1. 通讯接线 该仪表提供异步半双工 RS485 通讯接口,采用 MODBUS-RTU 协议,各种数据信息均可在通讯线路上传送.理论上在一条线路上可以同时连接多达 128 个仪表,每个仪表均可设定其通 ...

  6. C#上位机开发源码基于RS485通讯总线的ModbusRtu协议,支持用户权限管理

    C#上位机开发源码 上位机项目源代码 采用基于RS485通讯总线的ModbusRtu协议,支持用户权限管理.sqlite数据库.实时曲线.历史曲线.历史报表.导出Excel.主界面布局可调带记忆等功能 ...

  7. Dubbo常用协议之Dubbo协议与Hessian协议解析

    前言 Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议.不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议. Dubbo协议 Du ...

  8. 现场解析服务化 即时通讯方案丨网络协议,应用层协议的选择

    90分钟解析服务化 即时通讯方案,(不要错过) 1. 网络协议选择 udp/tcp 2. 应用层协议选择 protobuf/xmpp/mqtt 3. 数据库表的设计 视频讲解如下,点击观看: [Lin ...

  9. 威纶和s7200通讯线_S7-200作为从站用一个通讯口同时与组态王和维纶触摸屏通讯,用PPI协议,可以吗?...

    说明:1.PLC为CPU224XP; 2.两个通讯口,一个要与流量计通讯,走modbus RTU协议 解决方案:1.PPI多主站,组态王和触摸屏都作为主站,PLC作为从站.不知硬件怎么配置,软件怎么配 ...

  10. 串行通讯RS485 Modbus RTU协议控制

    一.内容简介 本文主要介绍欧姆龙CP1E做上位与SMC的LECP6电缸 之间串行通讯RS485 Modbus RTU协议程序控制说明. 二.设备简介         硬件:CP1E.CP1W-CIF1 ...

最新文章

  1. 鲲鹏高校行太原站来袭,两大课程一站式掌握未来潮流
  2. 无人机将在未来的智慧城市中扮演重要角色
  3. 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 写出或更新配置文件 | 读取配置文件 )
  4. android注册界面高级,Android用户注册界面简单设计
  5. c语言linux TCP长连接 socket收发范例 断开自动重连
  6. STM32H743+CubeIDE-CanFestival实现两个CANopen Master同时独立运行
  7. 类库如何读取配置文件(app.config)?
  8. Java对MySql数据库进行备份与还原
  9. LayaAir UI 组件 # Clip 切片、ComboBox 下拉框
  10. 2022 基于SpringBoot/SSM的数据库查询平台
  11. C语言中 abs、cabs、labs和fbs的区别
  12. next主题搭建相册(无需安装插件,代码即可实现)
  13. M*LMM缩略图文件管理模式模块开发(一个含有listview和gridview浏览模式的文件管理器)
  14. Qt常用轮子合集(带使用Demo)
  15. stata:应用stata学习计量经济学原理 practice 6 边际效用 Marginal effect
  16. HTMLcss怎样让文字覆盖在图片上面,图片上加字
  17. 基于JAVA餐厅座位预约系统设计与实现 开题报告
  18. 飞思卡尔仿真,MC9S08DZ60,MC9S12XEP100RMV1
  19. 基于Java+SpringBoot+Vue前后端分离学生信息管理设计实现
  20. 制作一个简易的自主夹取机械臂

热门文章

  1. 一文彻底搞懂 CTR 建模
  2. AD9如何设置原点位置
  3. 先测试再开发?TDD测试驱动开发了解一下?
  4. IDE、SCSI、SATA、USB、并口和串口
  5. mysql怎么导出insert语句_mysql导出insert语句
  6. Python3+selenium+BaiduAI识别并下载花瓣网高颜值妹子图片
  7. 如何修改 WordPress 的用户默认头像?
  8. 图吧主机linux,图吧的日常 篇一百零六:图吧垃圾佬的LINUX体验(UBUNTU)
  9. python调用通达信函数用户指标_通达信公式之间如何调用,如何引用通达信tdxwave指标...
  10. JS 正则表达式 手机号码正则