CAN硬件协议详解

一、基本理论:

1、CAN的总线结构:

        CAN总线 网络结构 有 闭环和开环 两种形式;无论实际的网络多复杂,都离不开这两种基本结构。

        闭环结构的CAN总线网络,总线的两端各并联一个120Ω的电阻,两根差分信号线形成了回路;这种CAN总线网络由ISO 11898标准定义,是 高速、短距离 的CAN网络,通信速率为125kbit/s~1Mbit/s;当以1Mbit/s的速率通信时,总长度最长40米。结构示意图:

        开环结构的CAN网络总线,两根信号线独立,各自串接一个2.2kΩ的电阻;这种CAN总线网络由ISO11519-2标准定义,是 低速、远距离 传输的CAN网络,通信速率最高为125kbit/s;在40kbit/s的通信速率下,传输最远距离可达1000米。结构示意图:

/

2、CAN总线的电平信号格式:

        CAN的两根信号线 CANH-CANL 之间的电压差表示CAN信号的电平,与传输数据的逻辑信号1和0对应;对应于 逻辑1称为隐性 电平,对应于 逻辑0称为显性 电平。如下图所示,上半部分为实际CANH和CANL的电平,下半部分是对应的逻辑电平:

        对于 逻辑0和逻辑1 ,开环结构和闭环结构 的CAN网络中的 CANH和CANL 的电压值不一样,隐性电平和显性电平的电压差也不一样。这两种网络结构下的CAN总线信号典型的电压如下表所示:

/

3、CAN网络典型电路结构:

        在CAN总线网络结构中,CAN总线上的一个终端设备称为节点,在CAN网络中,没有主设备和从设备的区别。一个CAN节点设备 的硬件部分,一般由 CAN控制器(外设)和CAN收发器(PHY) 组成;CAN控制器 负责CAN总线的逻辑控制,实现CAN传输协议;CAN收发器 主要负责MCU逻辑电平与CAN总线电平之间的转换。CAN收发器 需要根据 CAN总线结构来选择,闭环结构 与 开环结构 不同。

/

4、CAN总线的特点:

        1、实时性:CAN总线具有优越的实时性能,适用于需要及时传输数据的应用;如汽车控制系统、工业自动化等。仲裁机制和帧优先级 的设计保证了低延迟和可预测性。

        2、多主机系统:CAN支持多主机系统,多个节点可以同时发送和接收数据;这种分布式的网络结构使得系统更加灵活,适用于复杂的嵌入式网络。CAN总线上的节点既可以发送数据又可以接收数据,没有主从之分;但在同一个时刻,只能由一个节点发送数据,其他节点只能接收数据。

        3、差分信号传输:CAN使用差分信号传输,通过两个线路(CAN_L 和 CAN_H)之间的电压差来传递信息;这种差分传输方式提供了良好的抗干扰性能,使得CAN总线使用于工业环境等有电磁干扰的场合。

        4、仲裁机制:CAN总线采用 非破坏性仲裁机制,通过 比较消息标识符的优先级来决定哪个节点有权继续发送数据;这种机制确保了总线上数据传输的有序性,避免冲突。

        5、广播通信:CAN总线采用广播通信的方式,即发送的数据帧可以被网络上所有的节点接收(但不一定处理)。

        6、多种帧类型:CAN总线上的节点没有地址的概念(CANOpen则利用COD_ID来实现了节点地址概念);CAN总线上的数据是以帧为单位传输的,帧又分为 数据帧、遥控帧等多种帧类型。

        7、线与逻辑(实现仲裁的原理):CAN总线具有“线与”的特性;也就是 当由两个节点同时向总线发送信号时,一个是发送显性电平(逻辑0),另一个是发送隐性电平(逻辑1),那么电路最终将呈现为显性电平。这个特性被利用实现 总线的仲裁机制,也就是总线上哪个节点优先占用总线发送数据。

        8、特定标识符(COB_ID):每一个帧有一个标识符(Identifier)ID。单单对于CAN总线来讲,ID不是地址,它表示传输数据的类型,也可以用于总线的仲裁时确定优先级。

        9、滤波特性:每个CAN节点都接收数据,但可以根据数据帧的ID号进行过滤。只有节点需要的数据才会被接收并进一步处理,不需要的数据会被自动丢弃。

/

5、CAN的位时序和波特率:

        CAN网络通信为异步通信,需要规定一个通信的波特率,各个节点都以相同的波特率进行数据通信。位时序是指 一个节点采集CAN总线上的一个位数据的时序;位时序同步图如下:

        图中的 标称位时间(NBT)指的是 传输一个位的数据 时间;用于确定CAN总线的波特率,这个事件被分为3段:

        1、同步段(SYNC_SEG):在这个时间段内,总线上应该发送一次位信号的跳变;如果节点在同步段检测到总线上的一个跳变沿,就表示节点与总线是同步的;同步段长度固定一个tq(时间片)。

        2、位段1(BS1):定义了采样点的位置;在BS1结束的时间点对总线采样,得到的电平就是这个位的电平。BS1的初始长度有1~16个tq,但它的长度可以在同步的时候被自动加长,以弥补各节点频率差异导致的正相位偏移。

        3、位段2(BS2):定义了发送点的位置,BS2的初始长度是1~8个tq;再同步时可以自动缩短,以补偿负相位偏移。

        CAN控制器可以自动对位时序进行再同步,再同步时自动调整BS1和BS2的长度;位段加长或缩短的长度称为 再同步跳转宽度;其取值一般在1~4个tq之间。

        单片机中的CAN控制器时钟配置???tq(time quantum)被称为时间片,tq由CAN控制器的时钟频率fcan决定。在STM32F407中,两个CAN控制器在APB1总线上,CAN控制器有预分频器,APB1总线的时钟信号PCLK1经分频后得到fcan。

/

二、CAN总线协议结构:

1、OSI模型:

        CAN协议涵盖了OSI规定的OSI基本参照模型当中的 传输层、数据链路层以及物理层。OSI基本参考表如下:

        CAN协议中关于 ISO/OSI基本参照模型中的 传输层、数据链路层和物理层,具体的定义如下图:

        其中,数据链路层 分为 MAC层和LLC层;MAC子层是CAN协议的核心部分。

2、ISO标准化的CAN协议:

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

        关于ISO11898协议,其规定的通信速率为125kbps~1Mbps。关于ISO11519-2标准,其规定的通信速率为125kbps。如下图所示:

三、CAN各种类型的帧详解:

1、帧的种类:

        CAN网络通信是通过5种类型的帧进行的:数据帧、遥控帧、错误帧、过载帧、帧间空间;其中,数据帧和遥控帧 有标准格式和扩展格式 两种,标准格式有11位的标识符(GOB-ID),扩展帧则为29位的ID;各种帧的用途如下表所示:

///

2、数据帧:

        数据帧由7个段构成,具体格式如下图所示:

        帧起始:表示数据帧开始的段,包含1个位的显性电平(逻辑“0”)。

        仲裁段:表示该帧优先级的段(大端位序),标准帧和扩展帧,此结构有所不同;如下图:

        控制段:表示数据的字节数以及保留位(r0 r1)。控制段由 6个位 组成,用于表示 数据段的字节数;标准帧和扩展帧格式不同,如下图:

        数据段:数据内容载体,可发送0~8个字节的数据。数据发送格式MSB(最高位)开始输出,标准帧和扩展帧都是一样的格式;如下图:

          CRC段:检查帧传输错误的段。由 15个位的CRC和1个位的界定符 构成,其中,界定符为 隐形电平(逻辑“1”);如下图所示:

        ACK段:表示确认正常接收的段。ACK段有2个位,用于确认 数据帧接收是否正常,由 ACK槽和ACK界定符 构成;如下图所示:

        帧结束:表示该帧结束的段。由7个隐性电平位构成,如下图:

///

3、遥控帧:

        接收单元向发送单元请求发送数据所用的帧;遥控帧 由 6个段组成,是 没有数据段 的数据帧。具体格式如下图:

        数据帧与遥控帧的对比:

///

4、错误帧:(后面有详细解释)

        用于在接收和发送消息时,检测出错误通知错误的帧;错误帧由 错误标志和错误界定符 构成,错误帧的具体如下图:

        错误标志:错误标志包括 主动错误和被动错误 两种,主动错误为 6个显性位,被动错误为 6个隐性位。

        错误界定符:错误界定符由 8个隐性 位组成。

        主动错误 与 被动错误 的区别:主动报错,就是出现错误时,节点设备主动发送6个显性位(强行占用总线)的错误帧通知其他节点设备,我错了;被动错误,就是节点发生错误时,不会主动报错,而是等待别的节点发现它出错了,然后发出被动错误帧。

///

5、过载帧:

        过载帧用于 接收单元通知其尚未完成接收准备 的帧;过载帧由 过载标志和过载界定符 构成。过载帧可以理解为特殊的主动错误帧。如下图所示:

        过载标志:由 6个位的显性位 组成,与主动错误帧一样。

        过载界定符:由 8个位的隐藏位 组成,与 错误帧的错误界定符一样。

///

6、帧间隔:

        帧间隔 用于将 数据帧和遥控帧 与 其他任何数据帧 分隔开;过载帧和错误帧 前 不能插入间隔帧。间隔帧的格式如下图:

        间隔:3个位的隐性位;

        总线空闲:隐性电平,无长度限制。

        延迟传送:8个位的隐性位,只在处于被动错误状态的节点,刚发送一个消息后,帧间隔中包含的段。

///

四、CAN总线的优先级与同步:

1、优先级的决定:

        在总线空闲状态,最先开始发送消息的单元获得发送权;多个单元同时发送时,各发送单元从仲裁段(COB-D)的第一位开始进行仲裁,连续输出显性电平最多的单元可继续发送;在仲裁的过程中,若 前面单元1是隐性电平,单元2是显性电平,显性优先级更高,则单元2的优先级更高,获得优先权,如下图所示:

        总结:

        1、先发送的优先;

        2、显性电平靠前的优先;

        3、显性电平多的优先;

///

2、数据帧和遥控帧的优先级:

        具有相同ID号的 数据帧和遥控帧 在总线上竞争时,仲裁段的最后一位(RTR)为 显性电平 的数据帧具有优先权(数据帧具有优先权);如下图所示:

///

3、标准格式和扩展格式的优先级:

        标准格式ID与具有相同ID的遥控帧 或者 扩展格式的数据帧 在总线上竞争时,标准格式的RTR位为显性电平(且位置靠前)具有优先权,可以继续发送。

///

五、总线错误的种类:

        CAN总线的错误共有5种,且多种错误可能同时发生。如下表所示:

///

1、位错误的特殊情况:

        ① 位错误由 向总线上输出数据帧、遥控帧、错误帧、过载帧的单元 和 输出ACK的单元、输出错误的单元 来检测;

        ② 在仲裁段输出隐性电平,但 检测到显性电平,属于 仲裁失利,不属于 错误;

        ③ 在 仲裁段的填充位 输出隐性电平,但 检测到显性电平,将 不被 视为位错误,而是 填充错误;

        ④ 发送单元在ACK段输出隐性电平,但检测到显性电平时,将认为 得到应答,而非 错误;

        ⑤ 输出 被动错误标志(6个隐性位)但检测出显性电平时,将遵循 错误标志的结束条件,等待检测出  连续相同的6个位的值(显性或隐性),并不视为 位错误;

///

2、格式错误的特殊情况:

        ① 即使接收单元检测出 EOF(7个位的隐性电平)结束标志 的第8位为显性电平,也不认为是 格式错误;

        ② 即使接收单元检测出 数据帧中的DLC(数据字节数)有9~15的值时,也不认为是 格式错误;

///

3、错误帧的输出规则:

        检测到满足错误条件的单元输出错误标志通道错误;处于主动错误状态的节点输出的错误标志为主动错误标志;处于被动错误状态的节点输出的错误标志为被动错误标志;发送单元发送完错误帧后,将再次发送数据帧或遥控帧;错误标志输出时序如下图:

///

六、位时序与同步机制(重要):

1、位时序:

        由 发送单元在非同步的情况下发送的每秒钟的数据的位个数,称为 位速率;一个位可分为4个同步时间段:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)。

        这些段又可以被称为 Time Quantum(以下称为Tq)的 最小时间单元 构成;1个位分为4个段,每个段又由若干个Tq构成,这称为 位时序。那么,1个位由多少个Tq构成,每个段又包含多少个Tq,这个是可以任意设定位时序的;通过设定位时序,多个节点单元可以同时采样,也可以任意设定数据采样点。1个位的位时序如下图:

2、取得同步的方法:

        CAN协议的通信方法为 NRZ(Non Return to Zero)。各个位的开头和结尾都没有附加同步信号;发送单元以 与位时序同步的方式  开始 发送数据;另外,接收单元根据 总线上电平的变化 进行同步并进行接收工作。

        但是,发送单元 和 接收单元 存在的 时钟频率误差 以及 传输路径上的相位延迟 会引起同步偏差。因此接收单元 通过硬件同步 或者 再同步 的方法调整时序进行接收。

3、硬件同步:

        接收单元在 总线空闲状态 检测到 帧起始 时的同步调整:在检测到边沿信号的地方,忽略SJW的值而认为它是SS段;如下图所示:

4、信号再同步:

        在 接收过程中 检测出 总线上的电平信号变化 时的同步调整:每当检测出边沿时,根据SJW值通过 加长PBS1段或缩短PBS2段 ,以调整同步;如下图所示:

        目的就是:保证采样点在电平稳定时采样。

5、调整同步的规则:

        硬件同步和再同步需要遵循以下规则:

① 每个位数据只进行一次同步;

② 只有当 上一次的采样点的总线值与边沿后的总线值 不同时,该边沿才可以用于同步???

③ 在 总线空闲且存在隐性电平到显性电平的边沿信号 时,一定要进行一次 硬件同步;

④ 在总线非空闲时,检测到隐性电平和显性电平的边沿且满足条件①和②时,将进行 再同步;但还要满足下面的条件:

⑤ 发送单元检测到 自身输出的显性电平 有延迟时,不再进行在同步;

⑥ 总线上 存在多个发送单元同时发送时且处于仲裁段,不再进行再同步;

七、单片机上CAN外设的一般驱动配置(需要进一步实践!!):

1、位时序配置示例:

        tq=CAN分频/外设时钟频率*1s;具体规则以实际的芯片说明为准;

        这里有一个误差计算方式:

        位时间的四个段具体如何分配时间片,芯片厂商一般会有建议值,如果没有,则按照前面所说配置,最后计算一下误差,保证小于1%。

2、STM32的时序配置描述:

3、新塘MCU上CAN外设的时序配置:

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

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

相关文章

解决局域网访问Dify却仅显示nginx页面的问题

为什么dify在本机可以正常访问,局域网通过ip访问却只看到欢迎使用nginx的提示,如果访问服务器ip/apps则直接提示404 Not Found。这是怎么回事该如何解决呢?文章中将一步步解决这些问题。 前言 之前在服务器部署了dify,也在服务器…

【前端】——设置菜单的未读状态

用户会接收消息,接收到消息后,需要把待完成的菜单状态改成未读(加上小红点提示) 例如菜单目录是这样的,需要完成的内容在页面 /test1 里面,但是不光是需要把子菜单 /test1 标记为未完成,其父菜单…

Linux-ftrace-双nop机制的实现

Linux 内核调试工具ftrace 之(NOP动态插桩的实现原理) ftrace 是 Linux 内核中的一种跟踪工具,主要用于性能分析、调试和内核代码的执行跟踪。它通过在内核代码的关键点插入探针(probe)来记录函数调用和执行信息。这对…

火山引擎 DeepSeek R1 API 使用小白教程

一、火山引擎 DeepSeek R1 API 申请 首先需要三个要素: 1)API Key 2)API 地址 3)模型ID 1、首先打开火山引擎的 DeepSeek R1 模型页面 地址:账号登录-火山引擎 2、在页面右下角,找到【推理】按钮&#…

在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值

文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…

商业秘密维权有哪些成本开支?

企业商业秘密百问百答之六十三&#xff1a;商业秘密维权费用项目有哪些&#xff1f; 在商业秘密维权过程中&#xff0c;原告可能需要支付多种费用&#xff0c;一般费用项目包括&#xff1a; 1、诉讼费。诉讼费是向法院支付的费用&#xff0c;包括起诉费、案件受理费等。这些费…

StarRocks 在爱奇艺大数据场景的实践

作者&#xff1a;林豪&#xff0c;爱奇艺大数据 OLAP 服务负责人 小编导读&#xff1a; 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享&#xff0c;介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中&#xff0c;StarRocks 替换 ImpalaKudu 后&#x…

sql:order by盲注渗透练习

sql-labs靶场46关&#xff1a;order by注入 测试前注意打开小皮面板&#xff0c;打开apache和MySQL服务 http://127.0.0.1:8080/sqli-labs/ 注意端口不要写错 利用orderby注入技术进行排序操作&#xff0c;进而实现报错注入和盲注&#xff0c;最终通过Python脚本自动化提取…

我的世界开发模组的心得体会

最头疼的问题 本人也是小白&#xff0c;也就跟着ai学学怎么开发模组&#xff0c;不会的上网搜搜&#xff0c;但是目前最令我头疼的就是运行rundata和runcilent时的模块冲突&#xff0c;解决办法就是使用以下的build.gradle代码&#xff0c;不要接受人工智能的建议&#xff0c;…

使用pytorch和opencv根据颜色相似性提取图像

需求&#xff1a;将下图中的花朵提取出来。 代码&#xff1a; import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…

Redis的优势和特点

什么是redis Remote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储…

html+js 轮播图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图示例</title><style>/* 基本样式…

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理 ​ STBY口接单片机的IO口&#xff0c;STBY置0电机全部停止&#xff0c;置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端&#xff08;AIN1与AIN2&#xff09;只能控制AO1与…

免费轻巧多功能 PDF 处理工具:转换、压缩、提取一应俱全

软件技术 今天要给大家分享一款超实用的 PDF 处理工具&#xff0c;它免费又轻巧&#xff0c;如同随时待命的得力小帮手&#xff0c;功能之强大超乎想象&#xff0c;真的值得大家收藏。 这款工具是绿色版软件&#xff0c;解压后开启&#xff0c;满满的 PDF 处理功能便映入眼帘…

【JAVA SE基础】抽象类和接口

目录 一、前言 二、抽象类 2.1 抽象类的概念 2.2 抽象类语法 2.3 抽象类特性 2.4 抽象类的作用 三、接口 3.1 什么是接口 3.2 语法规则 3.3 接口使用 3.4 接口特性 3.5 实现多接口 3.6 接口间的继承 四、Object类 4.1 获取对象信息&#xff08; toString() &…

C/C++动静态库的制作与原理 -- 静态库,动态库,目标文件,ELF文件,动态链接,静态链接

目录 1. 什么是库 2. 静态库 2.1 静态库的制作 2.2 静态库的使用 3. 动态库 3.1 动态库的制作 3.2 动态库的使用 4. 目标文件 5. ELF文件 6. ELF从形成到加载轮廓 6.1 ELF形成可执行 7.2 ELF可执行文件加载 7. 理解链接和加载 7.1 静态链接 7.2 ELF加载与进程地…

介绍下pdf打印工具类 JasperPrint

JasperPrint 工具类深度解析 JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类&#xff0c;其本质是 填充数据后的可打印报表对象&#xff0c;承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析&#xff1a; 一、核心定位与生命周…

Python基于Django的网络课程在线学习平台【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

58、深度学习-自学之路-自己搭建深度学习框架-19、RNN神经网络梯度消失和爆炸的原因(从公式推导方向来说明),通过RNN的前向传播和反向传播公式来理解。

一、RNN神经网络的前向传播图如下&#xff1a; 时间步 t1: x₁ → (W_x) → [RNN Cell] → h₁ → (W_y) → y₁ ↑ (W_h) h₀ (初始隐藏状态) 时间步 t2: x₂ → (W_x) → [RNN Cell] → h₂ → (W_y) → y₂ ↑ (W_h) h₁ 时间…

【Qt-信号与槽】connect函数的用法

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方…