CAN总线原理_学习

news/发布时间2024/5/8 0:09:41
  随着通信技术的发展,现今通信方式和协议五花八门,但CAN通信仍然是车载网络最安全可靠且应用最广的技术之一。
  过去,汽车通常采用常规的点对点通信方式将电子控制单元及电子装置连接起来,但随着电子设备的不断增加,导线数量也随之增多,采用CAN总线网络结构,可以达到信息共享、减少布线、降低成本以及提高总体可靠性的目标。
  总的来说CAN总线有以下几点优势:
①数据传输速度相对较高,可达到1Mbit/s。(CAN-FD和CAN-XL分别可以达到2Mbit/s和10Mbit/s。)
②采用差分数据线,抗干扰能力强;
③多主通信模式,大幅减少单点通信线束成本;
④具有错误侦听的自我诊断功能,通信可靠信较高。

  CAN协议和CANOpen协议是两套不同的协议。从软硬件层次来划分,CAN协议属于硬件协议,而CANOpen属于软件协议。

  本文将概述CAN网络,让大家对CAN总线协议有一个全局的概念,再到底层的CAN总线协议知识。

CAN网络

CAN网络可以理解为多台CAN设备连接在同一条CAN总线上组合成的网络,其中的CAN设备我们称之为节点。CAN网络拓扑结构如下图:

 如上图,一个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转换芯片。

如图1所示是一个CAN节点的示意图,整体包括了CAN收发器、CAN控制器和MCU。我们以节点发送报文为例,当我们使用上位机软件发送一段报文时,报文会通过MCU发送给CAN控制器。CAN控制器将这段报文解析成逻辑信号后,再发送给CAN收发器。CAN收发器根据CAN-bus标准将接收到的逻辑信号转换成电信号,再通过CAN_H和CAN_L两根总线将电信号传到总线上的其他节点上。

简单说就是MCU将报文发送给控制器,控制器将报文转换成符合规范的CAN报文后,通过CAN收发器以电信号的形式在总线上进行传输。

    ISO标准化的CAN协议
了解CAN总线位于OSI所在层次。

1.ISO/OSI基本参照模型

 【注】

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

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

2.CAN在OSI模型中的定义

 【注】

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

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

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

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

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

1.总线信号

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

 2.优先级

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

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

3.位时序

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

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

 

 4.帧的种类和格式

帧的种类有多种:

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

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

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

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

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

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

逻辑信号如何转换成报文?

CAN控制器是CAN-bus设备的核心元件,集成了CAN规范中数据链路层的全部功能,能够自动完成CAN-bus协议的解析。

当CAN收发器将逻辑信号传送给CAN控制器后,CAN控制器会将逻辑信号转换成符合CAN规范的CAN帧。而CAN帧的类型包括了数据帧、远程帧、帧间空间、错误帧和超载帧。

 5.位填充

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

 6.错误的种类

节点的错误状态有三种,主动错误状态、被动错误状态、总线关闭状态。
主动错误状态:节点处于主动错误状态可以正常通信,处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志。
被动错误状态:节点处于被动错误状态可以正常通信,处于被动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志。
总线关闭状态:节点处于总线关闭状态不能收发报文,只能一直等待,在满足一定条件时才能再次进入到主动错误状态正常收发报文。

 

CAN总线的软件报文

在上面这组报文中:

仲裁域,每组报文开头内容,前11位字符为标识符,定义了报文的优先级,这种报文格式称为面向内容的编址方案。在同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文。当几个站同时竞争总线读取时,这种配置十分重要。

在仲裁域的最后一位是远程传输请求位(RTR),代表信息帧是数据帧还是不包含任何数据的远地请求帧

控制域,前两位是保留位,作为扩展位,DLC表示一帧中数据字节的数目。

数据域,包含0~8字节的数据。

校验域,检验位错用的循环冗余校验域,共15位。

结束域,由七位隐性电平组成。

CAN总线是可靠性很高的总线,共有五种错误:

CRC错误:发送与接收的CRC值不同发生该错误;

格式错误:帧格式不合法发生该错误;

应答错误:发送节点在ACK阶段没有收到应答信息发生该错误;

位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误;

位填充错误:通信线缆上违反通信规则时发生该错误。

当发生这五种错误之一时,发送节点或接受节点将发送错误帧。

CAN节点计数器如何计数:

 

参考:https://blog.csdn.net/ybhuangfugui/article/details/122852410

https://cloud.tencent.com/developer/article/1635247

 https://blog.csdn.net/cai88453626/article/details/131877267

https://www.yoojia.com/ask/17-11637129403634925760.html

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Hommie

Hommie靶机IP:192.168.56.115端口扫描 nmap -Pn -sV -sC 192.168.56.115PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 | ftp-syst: | STAT: | FTP server status: | Connected to ::ffff:192.168.56.101 | Logged in as ftp | TYPE: AS…

回归问题求解 python---梯度下降+最小二乘法

MSE = 1/m * ∑i=1m(yi−y^i)2 a = [1., 2., 3., 4., 5., 6., 7., 8., 9.] b = [3., 5., 7., 9., 11., 13., 15., 17., 19.] points = [[a[i],b[i]] for i in range(len(a))]lr= 0.001 eps = 0.0001 m = len(points) last_error = float(inf) k = b = grad_k = grad_b =…

OO第一次博客作业

前言 前三次作业都是实现一个小型的答题判题程序,后一题都是在前一题的增加了特定的需求。 在这三次题目中,频繁的使用到了正则表达式,还使用到了map类,题量适中,在上一次的基础上进行迭代,难度也是一次比一次大,需求变得更加细致,对于程序健壮性要求更高,同时也要慢慢…

软件开发中的“左移”是什么意思?

我曾经有过一个经理,在讨论我们的项目时提到,我们需要尽可能地将我们的工作左移。 几个月后,在一次面试中,面试官问我是否知道“左移”是什么意思。 除非有人没告诉我一个秘密的软件舞蹈,我现在就来告诉你左移是什么意思。 (本文视频讲解:java567.com) 在软件开发中左移…

linux3-管道符、重定向、环境变量

1.>输出重定向1 [root@linuxprobe~]# man bash > readme.txt //将bash的使用手册写入readme.txt2 [root@linuxprobe~]# cat readme.txt3 BASH(1) General Commands Manual BASH(1)4 覆盖重定向5 [root@linuxprobe~]# echo "Welcome to LinuxProbe.Com" > re…

团队作业4 第七天

第七天会议任务分配:前端和后端:对所完成模块进行测试 修复发现的问题和bug。 还没有全部完成,后面再继续做困难:测试中可能发现较多之前未注意到的问题。 生产环境的配置和部署可能会遇到一些环境差异导致的问题。总结:模块的部分测试完成,问题和bug得到修复。 回顾了开…