Qt CAN编程1- CAN总线整体介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt CAN编程1- CAN总线整体介绍相关的知识,希望对你有一定的参考价值。
参考技术A 控制器局域网(CAN)是一种车辆总线标准,旨在允许微控制器和设备在没有主机的情况下在应用程序中相互通信。它是一种基于消息的协议,最初是为汽车内的多路电气布线设计的,但也用于许多其他情况。
CAN Bus API提供了一些通用的API来访问CAN设备:
多家供应商为CAN设备提供了各种API进行访问。该 QtSerialBus 模块支持CAN总线插件的设置如下:
如果Qt提供的插件不适合所需的目标平台,则可以实施定制的CAN总线插件。该实现遵循实现Qt插件的标准方法。自定义插件必须部署到 $QTDIR/plugins/canbus 。
每个插件必须定义一个Key值,该Key值用于加载插件。这是通过一个小的json文件完成的。例如,socketcan插件使用以下 plugin.json 内容:
该Key值必须与CAN总线适配器的接口名称一起传递给 QCanBus :: createDevice() 。 QCanBus 使用 QCanBusFactoryV2 接口加载和实例化插件,每个插件必须将其实现为中央入口点。接口充当工厂,其唯一目的是返回 QCanBusDevice 实例。上面提到的接口名称是通过 QCanBusFactory :: createDevice() 工厂方法传递的。以下是 socketcan 插件的工厂实现:
下一步是提供 QCanBusDevice 的实现。至少必须实现以下纯虚函数功能:
在 open() 和 close() 方法分别配合 QCanBusDevice :: connectDevice() 和 QCanBusDevice :: disconnectDevice() 使用。检查功能文档以了解实施细节。
QCanBusDevice :: writeFrame() 负责进行完整性检查,例如 QCanBusFrame 的有效性以及设备是否仍处于连接状态。假设检查通过,它将帧写入CAN总线。成功后,它将发出 QCanBusDevice :: framesWritten() 信号;否则,将使用适当的错误消息调用 QCanBusDevice :: setError() 。此功能也可以用于实现异步写入操作。插件实施者有责任在适当的时间发出适当的信号。
最后但并非最不重要的一点是, QCanBusDevice :: interpretedErrorFrame 提供了一种方便的方法来将CAN总线错误帧的内容转换为人类可读的错误字符串。
CAN编程介绍
14.1 CAN编程介绍
14.1.1 CAN是什么?
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。
最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置 ECU 之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
一个由 CAN 总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件 的电气特性所限制。例如,当使用 Philips P82C250 作为CAN收发器时,同一网络中允许挂接110个节点。
CAN可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN的抗电磁干扰能力。
14.1.2 CAN的起源
CAN最初出现在 80 年代末的汽车工业中,由德国 Bosch 公司最先提出。当时,由于消费者对于汽车功能的要求越来越多,而这些功能的实现大多是基于电子操作的,这就使得电子装置之间的通讯越来越复杂同时意味着需要更多的连接信号线。
提出 CAN 总线的最初动机就是为了解决现代汽车中庞大的电子控制装置之间的通讯,减少不断增加的信号线。于是,他们设计了一个单一的网络总线,所有的外围器件可以被挂接在该总线上。
1993 年,CAN已成为国际标准ISO11898(高速应用)和 ISO11519(低速应用)。 CAN 是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。
当信号传输距离达到 10Km 时,CAN 仍可提供高达 50Kbit/s 的数据传输速率。由于 CAN 总线具有很高的实时性能,因此,CAN 已经在汽车工业、航空工业、工业控制、安全防护等领 域中得到了广泛应用。
14.1.3 CAN传输模型
CAN 通讯协议主要描述设备之间的信息传递方式。CAN 层的定义与开放系统互连模型(OSI)一致。每 一层与另一设备上相同的那一层通讯。实际的通讯发生在每一设备上相邻的两层,而设备只通过模型物理层的物理介质互连。
CAN 的规范定义了模型的最下面两层:数据链路层和物理层。下表中展示了 OSI 开放 式互连模型的各层。应用层协议可以由 CAN 用户定义成适合特别工业领域的任何方案。已在工业控制和制造业领域得到广泛应用的标准是 DeviceNet,这是为 PLC 和智能传感器设计的。在汽车工业,许多制造商都应用他们自己的标准。
OSI开发系统互联模型:
序号 | 层次 | 描述 |
---|---|---|
7 | 应用层 | 最高层。用户、软件、网络终端等之间用来进行信息交换 |
6 | 表示层 | 将两个应用不同数据格式的系统信息转化为能共同理解的格式 |
5 | 会话层 | 依靠低层的通信功能来进行数据的有效传递 |
4 | 传输层 | 两通讯节点之间数据传输控制。操作如:数据重发,数据错误修复 |
3 | 网络层 | 规定了网络连接的建立、维持和拆除的协议。如:路由和寻址 |
2 | 数据链路层 | 规定了在介质上传输的数据位的排列和组织。如:数据校验和帧结构 |
1 | 物理层 | 规定通讯介质的物理特性。如:电气特性和信号交换的解释 |
虽然CAN传输协议参考了OSI 七层模型,但是实际上CAN协议只定义了两层“物理层”和“数据链路层”,因此出现了各种不同的“应用层”协议,比如用在自动化技术的现场总线标准DeviceNet,用于工业控制的CanOpen,用于乘用车的诊断协议OBD、UDS(统一诊断服务,ISO14229),用于商用车的CAN总线协议SAEJ1939。
CAN传输协议:
序号 | 层次 | 描述 |
---|---|---|
7 | 应用层 | 主要定义CAN应用层 |
2 | 数据链路层 | 数据链路层分为逻辑链接控制子层LLC和介质访问控制子层MAC。MAC 子层是 CAN 协议的核心。它把接收到的报文提供给 LLC 子层,并接收来自 LLC 子层的报文。 MAC 子层负责报文分帧、仲裁、应答、错误检测和标定。MAC 子层也被称作故障界定的管理实体监管LLC 子层涉及报文滤波、过载通知、以及恢复管理。LLC = Logical Link ControlMAC = Medium Access Control |
1 | 物理层 | 物理层,为物理编码子层PCS该层定义信号是如何实际地传输的,因此涉及到位时间、位编码、同步。 |
14.1.4 CAN网络拓扑
CAN总线是一种分布式的控制总线。CAN总线作为一种控制器局域网,和普通以太网一样,它的网络很多CAN节点构成。其网络拓扑结构如下图所示:
CAN网络的每个节点非常简单,均由一个MCU(微控制器)、一个CAN控制器和一个CAN收发器构成,然后使用双绞线连接到CAN网络中。
14.1.5 CAN物理特性
CAN总线遵循国际标准ISO11898,如ISO11898-1,ISO11898-2,ISO11898-3,ISO11898-4标准。
CAN总线:
序号 | 标准 | 描述 |
---|---|---|
1 | ISO11898-1 | 数据链路层和物理层信号 |
2 | ISO11898-2 | 高速接入单元 |
3 | ISO11898-3 | 低速容错接入单元 |
4 | ISO11898-4 | 时间触发通讯 |
5 | ISO11898-5 | 低功耗的接入单元 |
6 | ISO11898-6 | 选择性唤醒的高速接入单元 |
CAN 能够使用多种物理介质,例如双绞线、光纤等。最常用的就是双绞线。信号使用差分电压传送,两条信号线被称为“CAN_H”和“CAN_L”。静态时CAN_H和CAN_L均是 2.5V 左右,此时状态表示为逻辑“1”,也可以叫做 “隐性”。用 CAN_H 比 CAN_L 高表示逻辑“0”,称为“显形”,此时,通常电压值为:CAN_H = 3.5V 和 CAN_L = 1.5V 。
目前实际常用的CAN收发器有如下几种型号:
序号 | 型号 | 描述 |
---|---|---|
1 | PCA82C250 | 高速 CAN 收发器 |
2 | PCA82C251 | 高速 CAN 收发器 |
3 | PCA82C252 | 容错 CAN 收发器 |
4 | TJA1040 | 高速 CAN 收发器 |
5 | TJA1041 | 高速 CAN 收发器 |
6 | TJA1042 | 高速CAN 收发器 |
7 | TJA1043 | 高速 CAN 收发器 |
8 | TJA1050 | 高速 CAN 收发器 |
9 | TJA1053 | 容错 CAN 收发器 |
10 | TJA1054 | 容错 CAN 收发器 |
目前实际常用的CAN控制器有如下几种型号:
序号 | 型号 | 描述 |
---|---|---|
1 | SJA1000 | 独立CAN控制器 |
2 | MCU内部控制器 | 目前市面上如STM32系列,S32K系列,IMX6系列等等很多单片机内部集成了CAN控制 |
14.1.6 CAN报文帧
14.1.6.1 CAN报文格式
标准 CAN 的标志符长度是 11 位,而扩展格式 CAN 的标志符长度可达 29 位。CAN 协议的 2.0A 版本 规定 CAN 控制器必须有一个 11 位的标志符。同时,在 2.0B 版本中规定,CAN 控制器的标志符长度可以是 11 位或 29 位。遵循 CAN2.0B 协议的 CAN 控制器可以发送和接收 11 位标识符的标准格式报文或 29 位标识符的扩展格式报文。
标准帧&扩展帧对比:
帧格式 | 标准帧 | 扩展帧 |
---|---|---|
规范 | CAN2.0A | CAN2.0B |
CAN ID(标识符)长度 | 11 bits | 29 bits |
CAN ID(标识符)范围 | 0x000~0x7FF | 0x00000000~0x1FFFFFFF |
14.1.6.2 CAN报文帧类型
CAN报文类型又分如5种帧类型:
- 数据帧:主要用于发送方向接收方传输数据的帧;
- 遥控帧:主要用于接收方向具有相同ID的发送方请求数据的帧;
- 错误帧:主要用于当检测出错误时向其他节点通知错误的帧。
- 过载帧:主要用于接收方通知其他尚未做好接收准备的帧。
- 间隔帧:主要用于将数据帧及遥控帧与前一帧分隔开来的帧。
其中数据帧是使用最多的帧类型,这里重点介绍以下数据帧。
数据帧如下图所示:
由上图所示,数据帧包括:
(1)帧起始。表示数据帧开始的段。
(2)仲裁段。表示该帧优先级的段。
(3)控制段。表示数据的字节数及保留位的段。
(4)数据段。数据的内容,一帧可发送0~8个字节的数据。
(5)CRC段。检查帧的传输错误的段。
(6)ACK段。表示确认正常接收的段。
(7)帧结束。表示数据帧结束的段。
具体介绍可以查看”CAN2.0A”、”CAN2.0B”详细介绍。
我们主要关注我们编程所需要关注的几个段:
ID: CAN报文ID;
IDE: 为0是标准帧,为1是扩展帧;
RTR: 为0是数据帧,为1是远程帧;
DLC: CAN报文数据长度,范围0~8字节;
Data:数据,0~8个字节;
未完待续...关于CAN,还有很多内容(70多页),剩下内容:
加微信13923404017,免费获取完整版;
以上是关于Qt CAN编程1- CAN总线整体介绍的主要内容,如果未能解决你的问题,请参考以下文章