当前位置: 首页 > article >正文

34.1STM32下的can总线实现知识(区分linux)_csdn

看过我之前的文章就知道,正点原子下的linux中CAN总线并没有讲的很明白,都是系统自带的!
这里我找到江科大学长的can总线的讲解视频!
CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili
在这里我也会一步一步讲解CAN总线的协议编写流程!

1、can 简介

Pasted image 20250518181418.png
我们以STM32F103C8T6为例实现基本的驱动!
Pasted image 20250518194200.png
下面的主流通信协议在之前的文章中也讲过!
Pasted image 20250518194636.png

1.1、can硬件电路

can总线可以看作是串口UART和I2C通信的结合体,不过尤为重要的是,can通信的TX和RX不需要交叉相连!
Pasted image 20250519091008.png
其中右边的电路的2.2k欧的电阻是悬空的!

1.2、can的电平标准

可以看到逻辑电平和差分电平!
按直觉来说,1是显性电平和0是隐形电平。
但是差分信号是相反的,1是隐形电平,0是显性电平!
Pasted image 20250519092217.png
为了观察现象方便和学习CAN总线协议,我们后面用逻辑电平来理解!

1,3、can收发器-TJA1050(高速can)

Pasted image 20250519103339.png
看到上面这个图片,一共有8个引脚。VCC需要5V的供电!
TX与RX与MCU相连(也就是CAN控制器),CANH与CANL与CAN总线相连!
Vref是参考电压输出!可以不用连接!
S:选择高速模式还是静默模式。
Pasted image 20250519135325.png
可以分析一下这个电路!
当CANH与CANL有电压差的时候,此时是显性电平0,就会在RECEIVER的地方输出1;当CANH与CANL没有电压差的时候,此时是隐性电平1,就会在RECEIVER的地方输出0;
输出的0和1,就会通过左边的场效应管来驱动到RXD引脚,场效应管可以当做电子开关,当RECEIVER输出为1时,也就是上管断开,下管导通,会使GND导通,即输出0;当RECEIVER输出为0时,也就是上管导通,下管断开,会使VCC导通,即输出1;
我们再来分析一下TXD的作用!
当TXD为1时,会使得上下两个场效应管断开!
Pasted image 20250519140436.png
相当于不对CAN总线有任何的操作!即保持0电压差!在收紧状态下,呈现隐形电平1。
当TXD给0时,上下两个场效应管都导通!
Pasted image 20250519141136.png
可以看作上面的场效应管把CANH拉高!下面的场效应管把CANL拉低!这个时候就有电压差了!就是显性电平0。
这样我们就可以总结;当发送的时候,TXD发1,隐形电平1,TXD发0,显性电平0;当接收的时候,若为隐形电平1,则RXD为1,若为显性电平0,则RXD为0。这样我们就可以按照这个逻辑实现CAN总线的多主机通信协议!
如果TXD悬空了!则上拉的VCC电源会保持默认输入1的状态,旁边还有TXD显性超时计时器,作用是。如果TXD输入操作异常,始终输入显性电平0,则CAN总线始终保持有电压差的状态,则这样会导致CAN总线瘫痪,并且没有设备可以阻止这一个现象!那么TXD显性超时计时器就是当发生上面所讲的情况,就会等一段时间后,收发器会自动释放CAN总线,使得为隐形电平1,防止CAN总线瘫痪!
接下来我们分析S引脚!
Pasted image 20250519144253.png
S引脚下面有个下拉的GND,如果S引脚悬空,则默认输入为低电平!
旁边的是温度保护,如果温度异常,就会控制驱动器,切断输出,以免干扰CAN总线!

1.4、CAN物理特性

Pasted image 20250519150257.png

2、帧格式

Pasted image 20250519152020.png

2.1、数据帧格式

Pasted image 20250519153542.png
D/R:这段时序根据你要发送的数据的不同,可以选择发D(显性0)和选择发R(隐形1);
R:表示发隐形1;
D:表示发显性0;
白色是发隐形电平1,灰色是发显性电平0。
白色和灰色各占一半是应答位特有的。在应答位的时候,发送方必须发隐形电平1,接收方必须发显性0。这个的意思就是发送方释放总线和接收方拉开总线!
图上的数字表示该时序所占的位数!
Pasted image 20250519172251.png
帧起始:可以看到是帧开始位灰色从显性电平0,也就是逻辑0开始的,有电压差,表示要开始发送了。
仲裁段:仲裁段是11位报文ID,报文ID还区分优先级,当多个设备进行操作时,一般会根据ID的大小来判断优先级!RTR占一位,在数据帧里必须是显性电平0,RTR的意思是远程请求标志位。报文ID+RTR就是仲裁段,仲裁主要靠报文ID,RTR是用于相同ID的数据帧和遥控帧,数据帧的优先级大于遥控帧,数据帧和遥控帧的报文ID是可以相同的,他这里和I2C的特别相似,7位从机地址+1位读写位,那么这里数据帧的RTR就是写入,遥控帧的RTR就是读取。上面的图片的RTR是灰色的隐形电平0那就是数据帧的标识!区分遥控帧1
控制段:首先是
IDE,是ID扩展标志位
,用于区分标准格式还是扩展格式,标准格式为显性电平0,扩展格式为隐形电平1,可以看到图片中有标准格式和扩展格式的区分!其次为r0, 必须为显性0看,r0是保留位,保留位是以后用的着,DLC是数据段长度,比如看图片DLC的位数为4,必须为4,因为CAN总线的发送一帧数据为1~8个字节,一个字节是8位2进制数据,最多是8*8如果DLC为0001,则发送一个字节;若DLC为1000,则数据段是发送8个字节,也就是64个2进制数据。所以可以看到图片当中是0到64。
数据段:这里是0~64位。数据段要给8的倍数,具体给多少要看DLC的配置。
CRC段:这里有15位,CRC是一种高效的校验的算法,他会对前面所有的数据位进行验算。计算得到的校验码,附在这后面。接收方得到数据和校验码之后,也会进行CRC校验看看计算的校验码是否一致,以判断传输是否传输有错误!
CRC界定符:1位,必须为隐形电平1。
ACK段ACK槽和ACK界定符,都是1位,ACK槽的作用就是应答,发送方发出一帧数据,到底有没有设备收到。当发送方在应答位,也就是ACK槽处,会释放CAN总线,隐形电平,如果接收方接收到了数据,接收方就会在这个ACK槽进行应答,也就是显性电平0,拉开总线。发送方释放总线后,会在ACK槽读取总线状态。ACK界定符和CPC界定符一起帮助ACK槽构成应答协议,适合这种特有的通信协议。这里有两个注意事项第一个,可以允许多个接收方共同拉开总线,因为一个报文消息,可以被多个设备同时接收,多个设备可以在这里同时拉开。第二个:并不是发送方把一段波形完整的发出去,然后再接收方应答的。而是,发送方和接收方共同完成一整个波形。发送方每发出一位,接收方就立刻收到这一位了,所以在这条时序的最后,整个数据帧还没有结束,接收方其实已经收完了。所以当在CRC界定符+发送隐形电平+ACK界定符中间就可以让接收方应答了,因为发送方在CRC界定符+发送隐形电平+ACK界定符全是隐形电平。
可以看到下面这幅图片!
Pasted image 20250519214937.png
可以看到绿色的就是接收方拉开的。
也就是说应答是夹在发送过程当中的!
帧结束:应答之后,发送方会发7个隐形电平1,作为EOF,整个数据帧结束。
Pasted image 20250519215506.png
扩展格式:因为标准格式的11位ID不够用了,需要加一些,扩展格式也要考虑标准格式的兼容;首先,11位ID仍然保持不变,后面再加18位ID;SRR:代替RTR的位,扩展格式的RTR已经放在后面了,RTR必须放在ID后面,SRR这里是没有用的,所以给隐形电平1,;IDE:用于区分标准格式还是扩展格式,标准格式为显性电平0,扩展格式为隐形电平1;后面就是RTR了,之后的就跟标准格式差不多了!这样就是实现了扩展ID。

2.2、数据帧各部分用途简介

Pasted image 20250519220705.png

2.3、数据帧的发展历史

Pasted image 20250519221512.png

2.4、遥控帧格式

可以明显看出遥控帧和数据帧的区别!
遥控帧的RTR是1,数据帧的RTR是0,而且遥控帧没有数据段!
Pasted image 20250526110011.png
如果有设备需要的话,首先接收方会发出一个遥控帧,遥控帧会包含报文ID,遥控帧也是广播式的,每个设备都能收到遥控帧,如果其中有个设备有这个ID的数据,那么这个设备就会把数据帧通过广播出来,然后真正需要的接收方就会收到数据。(适合使用频率低的数据传输)
!:如果使用频率高,这种遥控帧请求式就不合适了!
因为请求式产生的遥控帧本身也在占用总线资源,所以使用高频率的数据的时候,还是直接用广播式的方法传输数据帧。

一次完整的数据传输:
需要遥控帧和数据帧配合!

2.5、错误帧

Pasted image 20250526111440.png
错误分为主动错误和被动错误。
设备默认为主动错误。
处于主动错误状态的设备,检测出错误的时候,会连续发6个显性位。这样必然会造成破坏正常数据的传输,其他设备检测到错误标志时,就会抛弃这个数据,主动错误产生太频繁了,说明这个设备不可靠,设备就会处于被动错误的状态!
==处于被动错误的状态的设备,==检测出错误的时候,会连续发6个隐形位,发6个1,也就是不去碰总线,就不会破坏总线别人发的数据,但是会破坏自己的数据。
0~6是0到6位的延长时间,一个设备发出的错误标志,可能会引发其他设备连带产生的错误标志,
多个设备叠加起来的错误标志不止6位,所以加了0~6,

2.6、过载帧

Pasted image 20250526144350.png

2.7、帧间隔

下图这个分为主动错误状态和被动错误状态!
Pasted image 20250526144551.png

2.8、位填充

Pasted image 20250526144819.png

2.9、分析波形实例

Pasted image 20250526145905.png
可以看到标准数据帧的4位DLC是00101,本应该是0001的,但是要位填充补了1。
CRC的内容有CAN收发器自动生成,不用我们管!
CRC校验时,不需要填充位,所以会自动剔除填充位。只关心真正的数据。
Pasted image 20250529154428.png

3、接收方数据采样

Pasted image 20250530164817.png

3.1、接收方数据采样遇到的问题

Pasted image 20250530165135.png

3.2、位时序

Pasted image 20250530174252.png

3.3、硬同步

Pasted image 20250530180900.png

3.4、再同步

Pasted image 20250530172817.png

3.5、波特率计算

Pasted image 20250530182125.png

4、仲裁

Pasted image 20250530182451.png

4.1、先占先得

Pasted image 20250530182952.png

4.2、非破坏性仲裁

Pasted image 20250530182809.png

4.3、非破坏性仲裁过程

Pasted image 20250530184149.png

4.4、数据帧和遥控帧的优先级

Pasted image 20250530205633.png

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

Pasted image 20250530211409.png

5、错误处理

Pasted image 20250601135826.png

5.1、错误帧

Pasted image 20250601152536.png

5.2、错误状态

Pasted image 20250601154137.png

5.3、错误计数器

Pasted image 20250604093921.png

5.4、主动错误帧和被动错误帧波形实例

Pasted image 20250604094521.png
Pasted image 20250604095013.png

相关文章:

34.1STM32下的can总线实现知识(区分linux)_csdn

看过我之前的文章就知道,正点原子下的linux中CAN总线并没有讲的很明白,都是系统自带的! 这里我找到江科大学长的can总线的讲解视频! CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili 在这里我也会一步一步讲解CA…...

相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之二十三:高通相机Camx 基于预览1帧的process_capture_request二级日志分析详解 这一篇我们开始讲: 相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_req…...

Linux 内核中 skb_dst_drop 的深入解析:路由缓存管理与版本实现差异

引言 在 Linux 内核网络子系统中,sk_buff(简称 SKB)是数据包在内核态流转的核心数据结构。为了高效处理网络数据包的路由选择,内核通过 dst_entry 结构体缓存路由信息,而 skb_dst_drop 函数则是管理这些路由缓存引用的关键工具。本文将从作用、实现原理、内核版本差异等多…...

考研系列—操作系统:冲刺笔记(4-5章)

目录 第四章 文件管理 1.真题总结文件管理方式 (1)目录文件的FCB就是“目录名-目录地址” (2)普通文件的FCB (3)区分索引文件、顺序文件、索引分配 (4)文件的物理结构 ①连续分配方式 ②链接分配 ③索引分配-使用索引表(一个文件对应一张索引表!!!) 计算考点:超级…...

功能管理:基于 ABP 的 Feature Management 实现动态开关

🚀 功能管理:基于 ABP 的 Feature Management 实现动态开关 📚 目录 🚀 功能管理:基于 ABP 的 Feature Management 实现动态开关📚 一、背景分析🧩 二、核心功能设计2.1 定义 Feature 常量与分组…...

2025年想冲网安方向,该考华为安全HCIE还是CISSP?

打算2025年往网络安全方向转,现在考证是不是来得及?考啥证? 说实话,网络安全这几年热得发烫,但热归热,入门门槛也不低,想进这个赛道,技术、项目经验、证书,缺一不可。 …...

ES6 深克隆与浅克隆详解:原理、实现与应用场景

ES6 深克隆与浅克隆详解:原理、实现与应用场景 一、克隆的本质与必要性 在 JavaScript 中,数据分为两大类型: 基本类型:Number、String、Boolean、null、undefined、Symbol、BigInt引用类型:Object、Array、Functio…...

Go Gin框架深度解析:高性能Web开发实践

Go Gin框架深度解析:高性能Web开发实践 Gin框架核心特性概览 Gin是用Go语言编写的高性能Web框架,以其​​闪电般的路由性能​​(基于httprouter)和​​极简的API设计​​著称: package mainimport "github.com…...

mybatis 参数绑定错误示范(1)

采用xml形式的mybatis 错误示例&#xff1a; server伪代码为&#xff1a; Map<String, Object> findMapNew MapUtil.<String, Object>builder().put("applyUnit", appUnit).put("planYear", year ! null ? year : -1).put("code&quo…...

每天掌握一个Linux命令 - rpm

Linux 命令工具 rpm 使用指南 Linux 命令工具 rpm 使用指南一、工具概述二、安装方式1. 系统预装2. 源码编译安装&#xff08;极少场景&#xff09; 三、核心功能四、基础用法1. 安装软件包2. 升级软件包3. 查询软件包信息4. 卸载软件包5. 验证文件完整性 五、进阶操作1. 批量操…...

常见的MySQL索引类型

在MySQL中&#xff0c;索引是用来提高数据库查询效率的一种数据结构。根据不同的使用场景和需求&#xff0c;MySQL提供了多种类型的索引&#xff0c;每种索引都有其特定的应用场景和优化效果。下面是一些常见的MySQL索引类型&#xff1a; 1. B-Tree索引&#xff1a; 这是最常…...

01串(二进制串)与集合之间存在天然的对应关系 ← bitset

【集合的二进制表示‌】 ● 01 串&#xff08;二进制串&#xff09;与集合之间存在天然的对应关系。对应机理为每个二进制位可以表示集合中一个元素的存在&#xff08;1&#xff09;或不存在&#xff08;0&#xff09;。例如&#xff0c;集合 {a, b, c} 的子集 {a, c} 可以表示…...

153页PPT麦肯锡咨询流程管理及企业五年发展布局构想与路径规划

麦肯锡咨询的流程管理以其高度结构化、数据驱动和结果导向的核心特点著称&#xff0c;旨在为客户提供清晰、可行且价值最大化的解决方案。其典型流程可概括为以下几个关键阶段&#xff1a;下载资料请查看文章中图片右下角信息 问题界定与结构化&#xff1a; 这是流程的基石。麦…...

[特殊字符] 革命性AI提示词优化平台正式开源!

AI时代最强大的Prompt工程师已经到来&#xff01; 你是否还在为写不出高质量提示词而头疼&#xff1f;是否羡慕那些能够驾驭AI、让ChatGPT、Claude乖乖听话的"提示词大师"&#xff1f;今天&#xff0c;我们为你带来一个颠覆性的解决方案——TokenAI Auto-Prompt&…...

我的概要设计模板(以图书管理系统为例)

一、总述 1.1 需求或目标 随着数字化阅读普及&#xff0c;传统图书馆管理方式效率低下、资源检索不便。为提升图书管理效率&#xff0c;方便读者借阅与查询&#xff0c;公司计划开发 “在线图书管理系统”&#xff0c;实现图书的电子化管理、快速检索、在线借阅等功能&#x…...

【使用】【经验】docker 清理未使用的镜像的命令

docker images prune在 Docker 中清理未使用的镜像&#xff08;包括悬空镜像和完全未被引用的镜像&#xff09;&#xff0c;可以使用以下命令&#xff1a; 1. ​删除所有悬空镜像​&#xff08;推荐常用&#xff09; docker image prune​悬空镜像 (dangling images)​​ 是指…...

DrissionPage爬虫包实战分享

一、爬虫 1.1 爬虫解释 爬虫简单的说就是模拟人的浏览器行为&#xff0c;简单的爬虫是request请求网页信息&#xff0c;然后对html数据进行解析得到自己需要的数据信息保存在本地。 1.2 爬虫的思路 # 1.发送请求 # 2.获取数据 # 3.解析数据 # 4.保存数据 1.3 爬虫工具 Dris…...

iptables实战案例

目录 一、实验拓扑 二、网络规划 三、实验要求 四、环境准备 1.firewall &#xff08;1&#xff09;配置防火墙各大网卡IP并禁用 firewall和selinux &#xff08;2&#xff09;打开firewall路由转发 2.PC1&#xff08;内网&#xff09; &#xff08;1&#xff09;配置防…...

机器学习与深度学习07-随机森林01

目录 前文回顾1.随机森林的定义2.随机森林中的过拟合3.随机森林VS单一决策树4.随机森林的随机性 前文回顾 上一篇文章链接&#xff1a;地址 1.随机森林的定义 随机森林&#xff08;Random Forest&#xff09;是一种集成学习算法&#xff0c;用于解决分类和回归问题。它基于决…...

回归分析-非线性回归及岭回归.docx

一.题目要求1.用SPSS软件练习建立多元线性回归方程,分析数据的多重共线性,利用后退法和逐步回归法选择变量,练习用岭回归方法处理该模型数据并作比较 2.用SPSS软件练习建立模型的非线性回归方程 二.数据分析(一)题目:课本7.6 1、数据 一家大型商业银行有多家分行,近年来…...

Google AI 模式下的SEO革命:生成式搜索优化(GEO)与未来营销策略

一、搜索范式转变&#xff1a;从链接引导到答案交付 Google自2023年起逐步推出AI搜索功能&#xff0c;经历了SGE&#xff08;Search Generative Experience&#xff09;和Gemini阶段&#xff0c;最终在2025年全面上线了「AI Mode」搜索模式。与此同时&#xff0c;也保留了一种过…...

docker创建postgreSql带多个init的sql

好的&#xff01;下面是一个完整的可运行项目结构&#xff0c;包含&#xff1a; ✅ docker-compose.yml&#xff1a;启动 PostgreSQL&#xff08;支持 pgvector&#xff09; ✅ init-db.sql&#xff1a;创建数据库 myapp ✅ init-schema.sql&#xff1a;在 myapp 中建表并初始…...

掌握 MotionLayout:交互动画开发

前言 在 Android 开发中&#xff0c;系统自带的属性动画&#xff08;如 ObjectAnimator 和 ValueAnimator&#xff09;虽然功能强大&#xff0c;但在复杂动画场景下&#xff0c;第三方动画库能提供更高效的开发体验和更丰富的效果。本文将深入解析 Lottie、MotionLayout、Andr…...

SpringBoot中缓存@Cacheable出错

SpringBoot中使用Cacheable: 错误代码&#xff1a; Cacheable(value "FrontAdvertiseVOList", keyGenerator "cacheKey") Override public List<FrontAdvertiseVO> getFrontAdvertiseVOList(Integer count) {return this.list(Wrappers.<Adve…...

iOS UIActivityViewController 组头处理

0x00 情形一 - (void)shareAction1 {// 当前 View 转成图片UIImage *image [self snapshotImage:self.view];NSArray *activityItems [image];UIActivityViewController *activityVC [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationAc…...

分布式电源接入配电网的自适应电流保护系统设计与实现

分布式电源接入配电网的自适应电流保护系统设计与实现 一、引言 随着可再生能源的快速发展,分布式电源(Distributed Generation, DG)大规模接入配电网,传统保护系统面临以下挑战: 潮流方向改变导致保护误动/拒动故障电流水平波动影响保护灵敏度多类型故障(单相/两相/三…...

鸿蒙版Taro 搭建开发环境

鸿蒙版Taro 搭建开发环境 一、配置鸿蒙环境 下载安装 DevEco 建议使用最新版本的 IDE&#xff0c;当前为 5.0.5Release 版本。 二、创建鸿蒙项目 打开 DevEco&#xff0c;点击右上角的 Create Project&#xff0c;在 Application 处选择 Empty Ability&#xff0c;点击 Ne…...

论对生产力决定生产关系的批判:突破决定论的桎梏

笔言: 在学生时代认为"生产力决定生产关系"很有道理&#xff0c;但是进入社会参与市场竞争时候&#xff0c;才发现这种想法太天真了&#xff0c;当生产力一只赔钱时候谁也不会感兴趣&#xff1b;当生产力产生利润&#xff0c;比如1%30%&#xff0c;100%&#xff0c;3…...

ESOP交易系统搭建全景指南:从合规基石到价值跃迁

第一章 重新定义ESOP&#xff1a;合规性与流动性的平衡艺术 1.1 ESOP的本质演进 传统认知误区&#xff1a;员工持股计划股权分配工具 现代定义&#xff1a; ESOP是企业资本运作的中枢神经系统&#xff0c;贯穿“激励授予→行权管理→减持流通→市值协同”全链条&#xff0c;需…...

GICv3电源管理

在符合GICv3体系结构的实现中&#xff0c;CPU接口和PE必须位于相同的电源域&#xff0c;但这不必与关联的Redistributor所在的电源域相同。 这意味着可能会出现PE及其CPU interface断电&#xff0c;而Redistributor、Distributor和its上电的情况。在这种情况下&#xff0c;GIC架…...