CAN总线(一)

news2024/11/25 18:43:03

CAN总线(Controller Area Network Bus),从名字上可以知道,CAN总线构建的是一种局域网网路,每个挂载在CAN总线上的设备都可以利用这个局域网去发送自己的消息,也可以接收局域网的各种消息,每个设备都是平等的,都在共享这个局域网的通信资源,这就是CAN总线的设计理念。

CAN总线特征:

1、两根通信线(CAN_H、CAN_L),线路少,无需共地,因为是差分信号。(比如说I2C通信,它也只有两根通信SCL、SDA,但是I2C是单端信号,必须得共地。所以实际上I2C,至少得3根线)

2、差分信号通信,CAN_H和CAN_L就是一对差分线,差分线的好处就是抗干扰能力强,比单端信号传输的抗干扰能力强。如果线路产生干扰,则一般两根线的电压都会同时出现波动。但是,两根线的电压差值,仍然是不变的,所以用这个电压差值来传递数据,就能极大的避免干扰。

3、目前CAN总线分为两种标准:

高速CAN(在国际标准中叫ISO11898),其传输速率为125k~1Mbps,传输距离<40m

低速CAN(在国际标准中叫ISO11519),其传输速率为10k~125kbps,传输距离<1km

可以看出高速CAN传输快,但是距离较短。低速CAN传输慢,但是距离很远

4、异步,无需始终线,通信速率由设备各自约定。(这一点和串口非常相似)

5、半双工(不可以同时发送和接收),可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序。(也就是让大家排好队,消息都是可以发出去的)

6、11位/29位报文ID,用于区分消息功能,同时决定优先级(ID号小的优先发送)。11位是标准格式,29位是扩展格式

7、CAN总线的一个数据帧,可配置1~8字节的有效载荷。(这个类比串口,串口一次只能发送1个字节)

8、可实现广播式请求式两种传输方式:

广播式就是一个设备发送数据,其他所有设备都能收到。然后接收方根据报文ID,来决定用不用这个数据。大概的场景就是,发送方说:管你们要不要,我反正把数据发出去了,你们谁要谁拿走。

请求式就是数据发送方不会主动广播自己的数据,而是只有收到接收方发出的请求,发送方才会发数据。这样一个数据的传输就需要先请求、再接收。一来一回两个过程,这就是请求式。

应答、CRC校验、位填充、位同步、错误处理的实验现象

这个图绿色的是TJA1050(CAN收发模块),GND与STM32共地。VCC需要5V供电,接到STLINK的5V引脚,TXD接PA12,RXD接PA11.三个节点都这么接。最后把每个CAN收发器的CANH接在一起,CANL接在一起。

上图甚至可以在CAN总线上挂更多的设备,每个设备都可以广播发送自己的数据,其他设备都可以收到这个数据。

另外,CAN总线还能配置为请求式传输。我请求你了,你才发数据,这样也行。

同时,每个设备还可以配置过滤器来有选择地进行接收,我只接受我关注的消息,无关消息我可以直接过滤掉。

主流通信协议对比:

SPI的传输速率是最快的

在我看来,CAN总线就是UART和I2C的结合体

CAN硬件电路

每个设备通过CAN收发器挂载在CAN总线网络上

CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的

CAN_H和CAN_L相连。(一定要有CAN收发器)

CAN总线里走的都是差分信号,一般会用双绞线作为载体,避免干扰。

高速CAN使用闭环网络,CAN_H和CAN_L两端添加120欧的终端电阻,使CAN总线形成一个闭合的环路,加这两个终端电阻,主要的作用有两个。

第一个是防止回波反射,尤其是高频信号、远距离传输的场景的场景,回波反射是不能忽略的问题。关于回波反射的具体原因,可以学一学“传输线理论”。这里仅解释现象,如果不加终端电阻。

信号波形会在线路终端反射,进而干扰原始信号。当信号跳变时,它会在边沿震荡几下,这会干扰数据的正确传输。如下图所示。如果加了终端电阻且阻抗匹配,则信号的跳变会变得平稳。

第二个作用就是在没有设备操作时,将两根差分线的电压“收紧”,使其电压一致。(这里用了一个比较直白的词“收紧”,它的意思是在没有设备操作总线的情况下,这个电阻就像一根弹簧一样,会将两根线的电压拉到同一水平)。

这一点其实和I2C的上拉电阻一样,默认拉高至高电平,当有设备想发送0时,就把线路强制拉低至低电平;当有设备发送1时,不是把线路强制拉高至高电平,而是不去碰这个线路。线路由上拉电阻,默认拉高至高电平。这样的好处是,可以防止电平冲突。同时这还能实现“线与”的特性,对总线仲裁,十分重要。所以这个上拉电阻也类似一个弹簧

低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2k欧的终端电阻。

CAN电平标准

CAN总线采用差分信号,即两线电压差传输数据位

高速CAN规定:

        电压差为0V时表示逻辑1(隐形电平)

        电压差为2V时表示逻辑0(显性电平)

低速CAN规定:

        电压差为-1.5V时表示逻辑1(隐形电平)

        电压差为3V时表示逻辑0(显性电平)

CAN总线帧格式

CAN协议规定了以下5种类型的帧:

数据帧

它的用途是,发送设备主动发送数据,属于广播式的通信方式。比如按下某个设备的按键,这个设备就会向CAN总线广播式地发出一个消息,这个消息,也可以叫做报文(Message),它的承载格式,就是数据帧。

看一下这个图,它定义了数据帧的格式,数据帧有标准格式扩展格式两种。扩展格式增加了ID位数,能承载更多种类的ID。

数据帧各部分用途简介

遥控帧

遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同

帧相隔

将数据帧和远程帧与前面的帧分离开

错误帧

总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备。

 

过载帧

当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。

位填充

位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。

位填充作用:

1、增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精准掌握数据采样时机。

2、将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性

3、保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲

波形实例

看一下用示波器捕捉到的CAN波形

使用方法是,用示波器的两个探头,夹子一端,都与其中一个STM32共地;探头一端分别接在CAN_H线和CAN_L线,这样测得的就是CAN_H和CAN_L的对地电压,显示出来的,就是差分电平表示。

然后按下按键,STM32发出一个指定的帧。这是,CAN_H和CAN_L就会产生这样一段波形

发送数据之前CAN总线一直处于两线收紧的空闲状态。

开始发数据帧时,要把两线张开,发送显性0,表示SOF,打破空闲。

一个帧开始,总线也进入占用状态。

SOF之后,根据标准数据帧的定义,首先发送报文ID,因为ID是0x555,转化为2进制就是0000 0101 0101 0101,

因为ID只有11位,所以这里就呈现101 0101 0101这样的波形

 

然后下一位是RTR,RTR的波形是张开状态,显性0,所以表示当前是数据帧

然后IDE是显性0,表示标准数据帧

R0保留位,必须是0。这是因为在仲裁时,0的优先级更高。之后如果用到了这个保留位,可以保证,当前定义的优先级高于以后拓展定义的优先级。就像IDE一样,因为之前保留位r1默认是0,所以现在就有标准帧高于拓展帧优先级这个特性

之后是4位DLC。同时我们也发现,产生了一个填充位,因为前面已经连续出现5个0了,所以强行插入了一个1。

这个填充位在实际波形中会体现,但是在解析数据帧时要移除填充位,实际上只需要分析4位,即0001,表示DLC的值是0x1

DLC之后就是数据段了。因为DLC是1,所以数据段只有一个字节。

依次判定数据位是1010 1010,表示数据内容是0xAA。同时也可以发现,CAN总线是高位先行的。

数据段结束,是15位的CRC段。发送时,CRC可以由CAN控制器自动生成。

接收时,也可以由CAN控制器自动校验

 

 之后是CRC界定符,它的作用是在ACK槽之前,发送方释放总线。

如果没有CRC界定符,我们看到CRC的最后一位是显性0,如果直接跟ACK槽,那发送方还拽着总线,接收方没法发送应答位

 之后,总线控制权短暂交接给接收方,发送方在ACK槽期间不会碰总线。

如果有接收方,接收方会在ACK槽拉开总线,接收方会在ACK槽拉开总线,只要有一个设备拉开了总线,总线必定呈现显性0状态

这里看一看到有接收方应答了

之后应答结束,是ACK界定符,接收方会在这一位期间释放总线,交出总线控制权,当然发送方也是释放状态。

最后7位EOF都是隐性1,默认

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解锁高效驱动密码:SiLM8260A系列SiLM8260ABCS-DG 集成米勒钳位的双通道隔离驱动芯片

附上SiLM8260A同系列型号参考&#xff1a; SiLM8260ADCS-DG 12.5V/11.5V SiLM8260ABCS-DG 8.5V/7.5V SiLM8260AACS-DG 5.5V/5V SiLM8260AGCS-DG 3.5V/3V SiLM8260ABCS-DG是一款集成了米勒钳位功能的双通道隔离驱动芯片&#xff0c;它精准地满足了上述严苛条件。具备…

Excel排序错误原因之一

# Excel日常表格中的文字排序乱了&#xff0c;在系统语言更改成英语之后&#xff0c;不再按照首字母的顺序排列&#xff0c;且强制设置序列顺序也无济于事。 Excel表格内的排序尝试 表格基础选项就有“排序”&#xff0c;在其自定义选项中的“选项”设置处设置“拼音排序”&am…

2024年实体行业都在用的AI自动直播,有哪些可以发展的机会?

抖捧AI自动直播系统&#xff0c;是一款结合Ai和短视频营销的自动化直播辅助工具&#xff0c;针对企业和实体店有多重的应用场景&#xff0c;通过预设的直播脚本和智能回复逻辑&#xff0c;实现不需要真人参与&#xff0c;就可以实现全天候24小时直播&#xff0c;当用户进入直播…

【Java基础】ThreadLocal<LoginUser>:存储登录用户信息

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【一篇文章搞定】LVGL显示中文+解决keil下LVGL无法正常显示中文及error:#8:missing closing quote问题

LVGL显示中文 进入lvgl中文文档&#xff1a;显示中文 — LVGL 文档 (100ask.net) 下载字体zip文件&#xff0c;解压得到一个.otf文件 进入LVGL的字体转换网站 Font Converter — LVGL 1.点击Browse指定.otf文件即可 2.range不用管 3.为了节省内存在Symbols中输入自己要使用的…

【计算机网络】概述篇

目录 导学 计算机网络的发展简史 互联网的发展历史 中国互联网的发展历史 计算机网络的层次结构 层次结构设计的基本原则 OSI七层模型 TCP/IP四层模型 现代互联网的网络拓扑 计算机网络的性能指标 速率 时延 发送时延 ​传播时延 ​排队时延 处理时延 总时延 …

K8S - Emptydir - 取代ELK 使用fluentd 构建logging saidcar

由于k8s 的无状态service 通常部署在多个POD中&#xff0c; 实现多实例面向高并发。 但是k8s 本身并没有提供集中查询多个pod的日志的功能 其中1个常见方案就是ELK. 本文的方案是 利用fluentd sidecar 和 emptydir 把多个pod的日志导向到bigquery的table中。 Emptydir 的简介 …

STM32F407ZGT6单片机HAL库——DAC输出

一、输出直流电压 1.cubemax的配置&#xff08;通道1&#xff09; 2.直流电压大小计算 3.主函数加入初始化的程序 float DAC_voltage1.5;HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_voltage*4095/3.3);//HAL_DAC_Start(&hdac,DAC_CHANNEL_1); 二、…

深度解析价值流:推动业务架构创新与效益提升的核心指南

数字化转型下的价值流管理与架构 在当今的数字化转型背景下&#xff0c;如何有效创造并交付价值&#xff0c;成为企业竞争力提升的关键课题。作为企业架构的重要组成部分&#xff0c;价值流的概念为业务决策者和技术人员提供了全面的工具&#xff0c;帮助优化业务能力&#xf…

java,php,go,nodejs,Python开发web项目优缺点对比

Java 优点:java 是一门广泛应用于企业级开发的语言,丰富且庞大的开发框架和库。有较高的性能和可伸缩性。生态系统庞大且成熟,拥有大量的开源框架和工具,可以加速开发过程。 内置对多线程的支持,适合处理高并发的 Web 项目。 缺点:相比其他语言,Java 的语法相对冗长繁琐…

Linux-Shell编程【看这一篇就够了!!!】

目录 前言 什么是Shell编程 Shell脚本的执行方式 脚本格式要求 运行一个Shell 一个Shell例子 Shell的变量 shell变量的定义 设置环境变量 简单示范 位置参数变量 预定义变量 基本语法 运算符 应用案例 条件判断 单流程判断 常用判断条件 应用案例 多流程判…

Type-C 接口 取电 PD快充协议取电电压5V、9V、15V、20V

随着Type-C接口的普及&#xff0c;快充技术融入进了各种电子设备中&#xff0c;然而快充技术里快充协议是必不可少的&#xff0c;目前市面上已经出现多种快充协议&#xff0c;最常见的便是Type-C PD协议&#xff0c;下面来以起了解以下PD协议。 PD协议的工作原理主要是基于电压…

【OpenCV】灰度化和二值化处理图像

文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品&#xff0c;常闻有言称存在无需考量负债与查询记录之奇品&#xff0c;此等说法十有八九为中介诱人上钩之辞。轻信之下&#xff0c;恐将步入连环陷阱。除非个人资质出类拔萃&#xff0c;如就职于国央企或事业单位&#xff0c;工龄逾年&#xff0c;五险一金完备…

计算机毕业设计选题推荐-土地承包管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Address localhost:1099 is already in use:tomcat频繁重启端口占用问题

错误提示 Unable to open debugger port (127.0.0.1:58198): java.net.SocketException "Socket closed" Address localhost:1099 is already in use 端口被占用 报错原因 由于短时间内频繁运行tomcat服务器。 为了避免出现这一错误。可以点击刷新uodate resourc…

寻找客户资源的软件

如果你正在寻找能够帮助你高效寻找客户资源的软件&#xff0c;以下几款工具可以为你提供支持&#xff1a; 1. 微拓客APP 微拓客APP是一款专为企业和销售人员设计的智能拓客工具。它通过最新的全国工商数据&#xff0c;帮助你精准搜索目标客户&#xff0c;特别适合需要快速找到…

软件开发人员从0到1实现物联网项目:项目架构的思考

文章目录 前言单体应用足矣摒弃传统的微信对接后期的维护投入上真正的“云”&#xff1a;云托管0服务器免运维免费的CDN和DDoS防护 技术架构小结 前言 因为种种原因&#xff0c;《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。 鉴于该项目的前期开发和…

优化销售流程,领先市场趋势!企元数智赠送小程序合规分销系统!

在当今竞争激烈的商业环境中&#xff0c;企业要保持竞争力并领先市场趋势&#xff0c;关键在于不断优化销售流程和采用最新的营销工具。为满这一迫切需求&#xff0c;企元数智&#xff08;假设为一家虚构公司&#xff09;推出了一项创新举措&#xff1a;赠送小程序合规分销系统…

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑&#xff0c;对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司&#xff0c;致力于提供专业的数据标注服务&#xff0c;帮助客户解决AI链条中的数据处理难题&#xff0c;共同推动人工…