良许Linux教程网 干货合集 通信教程 | CAN总线协议基础原理

通信教程 | CAN总线协议基础原理

本篇文章将讨论CAN总线和CAN协议,这两个名词往往经常被提到。CAN即是一种总线,同时也是一种协议。

CAN协议和CANOpen协议是两种不同的协议。通常而言,CAN协议属于硬件协议,而CANOpen协议则属于软件协议。

本文的主要目的在于介绍CAN网络,以帮助读者们更全面理解CAN总线协议,并更深入地了解底层CAN总线协议知识。

CAN网络

CAN网络可以被理解为多个CAN设备连接在同一条CAN总线上的网络构建。这些CAN设备被称为节点。下图展示了CAN网络的拓扑结构:

(这里可以插入相关图示)

在CAN网络中,节点们可以通过CAN总线相互通信和交换数据。CAN通信方式具有高可靠性与实时性的特点,非常适用于工业控制、汽车电子领域等。

CAN网络的拓扑结构可以采用许多不同的方案,包括星型、总线型、环形等各种拓扑形状。每种拓扑结构都具有其独特的优点与缺点,需要根据具体应用需求和系统设计选择适宜的拓扑结构。

下文将更深入地探讨CAN总线协议相关的知识,包括物理层、数据链路层、帧格式等内容,以帮助读者们更深入地了解CAN总线协议。

image-20231112200343189
image-20231112200343189

如上图,一个CAN节点主要包含三类:MCU应用程序、CAN控制器、CAN收发器

1. MCU应用程序

MCU应用程序我将其分为三块:业务逻辑代码、协议层代码、底层驱动代码

A.业务逻辑代码:是根据项目需求而定,也很好理解。比如我读取一个传感器数据,并对其做出相应逻辑处理。

B.协议层代码:比如后续要讲述的CANOpen。

C.底层驱动代码:配置CAN总线相应参数、控制收发的代码。

2.CAN控制器

CAN控制器内部结构还是挺复杂的,一般现在CAN控制器都是与处理器集成在一起

其实对于编程的人来说,无非也就是包含一些控制、状态、配置等寄存器。

比如我们看到有些STM32芯片带有CAN,也就是说CAN控制器已经集成在STM32芯片中了,我们只需要编程操作其中的寄存器即可。

3.CAN收发器

CAN收发器:将CAN收发引脚(CAN_TX和CAN_RX)的TTL信号转换成CAN总线的电平信号

PS:你可以把CAN总线通信认为是UART通过485进行通信:CAN控制器就如UART的控制器,而CAN收发器就如485转换芯片。

2ISO标准化的CAN协议

写这一章节的主要目的就是想让大家了解CAN总线位于OSI所在层次。

1.ISO/OSI基本参照模型

image-20231112200348875
image-20231112200348875

【注】

ISO:International Standardization Organization国际标准化组织;

OSI:Open Systems Interconnection开放式系统间互联;

2.CAN在OSI模型中的定义

image-20231112200354963
image-20231112200354963

【注】

LLC:Logical Link Control逻辑链路控制;

MAC:Medium Access Control媒介访问控制;

从上图可以知道CAN总线底层硬件的内容(CAN控制器、收发器)主要位于OSI的第1层和第2层。

3概述CAN总线协议

CAN总线协议:就是为了保证通信(收发)数据在CAN总线上能稳定传输而制订的一套协议。

CAN总线协议的内容很多,为方便初学者理解,本文先大概描述一下CAN总线协议,后续文章详细讲述CAN总线协议的内容。

1.总线信号

CAN总线为「两线」「差分」信号,用隐形代表逻辑1,显性代表逻辑0。如下图:

image-20231112200400545
image-20231112200400545

2.优先级

假如某一时刻,一个设备(节点)往总线发0,一个设备往总线发1。那么总线会呈现什么现象?

答案:最后总线呈现为显性,也就是0。

3.位时序

位时序逻辑将监视串行总线,执行采样并调整采样点,在调整采样点时,需要在起始位边沿进行同步并后续的边沿进行再同步。

简单的说就是对一个bit位分几段进行采样,目的就是提高数据传输稳定性。在STM32中底层驱动代码就需要进行位时序编程,在STM32参考手册中也会发现如下位时序图:

image-20231112200403745
image-20231112200403745

4.帧的种类和格式

帧的种类有多种:

数据帧:用于发送单元向接收单元传送数据的帧。

遥控帧:用于接收单元向具有相同 ID 的发送单元请求数据的帧。

错误帧:用于当检测出错误时向其它单元通知错误的帧。

过载帧:用于接收单元通知其尚未做好接收准备的帧。

帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧。

数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11个位的标识符ID,扩展格式有29个位的ID。

5.位填充

位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。如下图:

image-20231112200423923
image-20231112200423923

6.错误的种类

image-20231112200407057
image-20231112200407057

CAN总线协议内容很多,初学者可以先了解这些,希望对你有所帮助。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部