STM32 CAN使用

news2024/11/14 14:56:14

STM32 CAN使用

  • 简介
  • 各种通讯接口对比
  • 报文
  • 总线上的报文信息表示为几种固定的赖类型
  • 数据帧
  • 列表模式
  • 掩码模式
  • 配置CAN
  • 配置参数
  • 位时序

简介

控制器局域网CAN(Controller Area Network)是由德国博世公司为汽车应用而开发的多主机局部网络,用于汽车的监测和控制,德国博世公司开发CAN总线的最初目的是解决汽车上数量众多的电子设备之间的通信问题、减少电子设备之间繁多的信号线,于是设计了一个单一的网络总线,所有的外围器件可以挂接在该总线上。

1991年,NXP半导林公司制定并发布CAN技术规范CAN2.0A/B,其中,CAN2.0A协议规范定义了标准帧格式,CAN2.0B协议规范定义了扩展顿格式,1993年11月,ISO组织正式颁布CAN国际标准lSO11898(高速应用,数据传输速率小于1Mbps)和ISO11519(低速应用,数据传输速率小于125 kbps)。

各种通讯接口对比

请添加图片描述
波特率范围在5kbps~1Mbps之间,也是双方规定通讯波特率一致的现况下,才能正确接收数据

报文

在CAN总线上传输的信息称为报文,相当于部递信件的内容,当CAN总线为闲时,任何连接的单元都可以发送新的报文。
报文信号使用差分电压传送,两条信号线(以双绞线传输介质为例)称为CAN_H和CAN_L,静态时均是2.5V左右,此时状态表示为逻辑1,也可以叫隐性。用CANH比CANL高表示逻辑0,称为显性,此时的电压值通常为CANH=3.5V和CAN_L=1.5V。
请添加图片描述

总线上的报文信息表示为几种固定的赖类型

数据帧:从发送节点向其他节点发送的数据信息,相当于甲方发送有内容的信件到乙方方给自己发送一封有内容的信件。
远程帧:向其他节点请求发送具有同一识别符的数据帧,相当于甲方请求
错误帧:检测到总线错误,发送错误帧。
过载帧:过载帧用以在数据帧或远程帧之间提供附加的延时。
帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧。
CAN总线通信有两种不同的帧格式:数据帧有标准帧和扩张帧两种格式,一个11位,一个29位。

数据帧

标准格式帧和扩展格式帧中有所不同,标准格式帧的仲裁场由11位标识符和远程发送请求位RTR组成,扩展格式帧的仲裁场由29位标识符和远程发送请求位RTR组成。

控制场由6个位组成,包括数据长度代码和两个将用于扩展的保留位。数据长度代码指出了数据场中字节的数量。数据长度代码为4位,在控制场里发送,数据帧长度允许的字节数为0、1、2、3、4、5、6、7、8,其他数值为非法的。

数据场由数据帧中的发送数据组成。它可以为0~8字节,每字节包含了8位,首先发送最高有效位MSB,依次发送至最低有效位LSB。CRC场包括CRC序列(CRC SEQUENCE)和CRC界定符(CRCDELIMITER),用于信息帧校验。

应答场长度为2个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送节点发送两个隐性位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACKSLOT)期间(发送ACK信号)向发送器发送一个显性的位以示应答。

请添加图片描述
远程帧->省略

错误帧->省略

过载帧->省略

列表模式

首先我们是不是很快就会想到只要准备好一张表,把我们需要关注的所有CAN报文ID写上去,开始过滤的时候只要对比这张表,如果接收到的报文ID与表上的相符,则通过,如果表上没有,则不通过,这个就是简单的过滤方案。总结列表模式就是自己特定关心的ID进行选择出来

掩码模式

假设身份上的18位数 ,我们要为它准备好两张纸片,一片写上屏蔽码,另一片纸片写上验证码。在执行任务的时候先将获取的身份证号码与屏蔽码进行“与”操作,再将结果与验证码的进行比较,根据判断是否相同来决定是否通过。整个判别流程如下所示:
在这里插入图片描述
在bxCAN中,分别采用了两个寄存器(CAN_FiR1,CAN_FiR2)来存储屏蔽码与验证码,从而实现掩码模式的工作流程的。这样,我们就知道了bxCAN过滤器的掩码模式的大概工作原理。

但是,我们得注意到,采用掩码模式的方式并不能精确的对每一个ID进行过滤,打个比方,还是采用之前的守卫的例子,假如城主要求只有1150到1158年出生的人能通过,那么,若我们还是才用掩码模式,那么掩码就设为第7到9位为”1”,对应的,验证码的7~9位分别为”115”,这样就可以了。但是,仔细一想,出生于1159的人还是可以通过,是不是?但总体来说,虽然没有做到精确过滤,但我们还是能做到大体过滤的,而这个就是掩码模式的缺点了。在实际应用时,取决于需求,有时我们会同时使用到列表模式和掩码模式,这都是可能的。

#列表模式与掩码模式的对比
综合之前所述,下面我们来对比一下列表模式与掩码模式这两种模式的优缺点。

模式优点缺点
列表模式能精确地过滤每个指定的CAN ID有数量限制
掩码模式取决于屏蔽码,有时无法完全精确到每一个CAN ID,部分不期望的CAN ID有时也会收到数量取决于屏蔽码,最多无上限

终于进入到正题了!前面已经介绍了过滤器的列表模式与掩码模式,以及掩码模式下的屏蔽码与验证码的含义,还介绍了标准CAN ID与扩展CAN ID的组成部分。现在我们终于要站在bxCAN的角度来分析其过滤方案。

首先过滤模式分列表模式和掩码模式,因此,对于没有过滤器,我们需要这么一个位来标记,用户可以通过设置这个位来标记他到底是想要这个过滤器工作在列表模式下还是掩码模式,于是,这个表示过滤模式的位就定义在CAN_FM1R寄存器中的FBMx位上,如下图:

图5 CAN过滤器模式寄存器CAN_FM1R定义
CAN过滤器模式寄存器CAN_FM1R定义

这里以STM32F407为例,bxCAN共有28个过滤器,于是上图的每一个位对应地表示这28个过滤器的工作模式,供用户设置。”0”表示掩码模式,”1”表示列表模式。

另外,我们知道了标准CAN ID位11位,而扩展CAN ID有29位,对于标准的CAN ID来说,我们有一个16位的寄存器来处理他足够了,相应地,扩展CAN ID,我们就必须使用32位的寄存器来处理它,而在实际应用中,根据需求,我们可能自始至终都只需要处理11位的CAN ID。对于资源严重紧张的MCU环境来说,本着不浪费的原则,这里最好能有另外一个标志用告诉过滤器是否需要处理32位的CAN ID。于是,bxCAN处于这种考虑,也设置了这么一个寄存器CAN_FS1R来表示CAN ID的位宽,如下图所示:

CAN过滤器位宽寄存器CAN_FS1R定义
CAN过滤器位宽寄存器CAN_FS1R定义

如上图,每一个位对应着bxCAN中28个过滤器的位宽,这个需要用户来设置。
于是根据模式与位宽的设置,我们共可以得出4中不同的组合:32位宽的列表模式,16位宽的列表模式,32位宽掩码模式,16位宽的掩码模式。如下图所示:
在这里插入图片描述

CAN总线收发,中断方式接收配置
平台:STM32F103VE
STM32CUBEMX V5.3

配置CAN

CAN的波特率最大为1Mbps。

波特率计算方法:时钟主频 / 分频 / (tq1 + tq2 + swj)

以500K的波特率配置为例:
stm32f103的CAN的时钟主频是36M,分9频就是4M,在除以(5 + 2 + 1)得到500K的波特率。
注意:stm32cubemx生成的CAN代码是不带过滤器的,需要自己手动添加。

配置参数

在这里插入图片描述

参数意思
Prescaler预分频,即位时序提到的APB1 peripheral clocks继续分一次频
Time Quantum最小时间单位Tq,自动计算出来的,不需要填写
Time Quanta in Bit Segment 1PBS1段长度
Time Quanta in Bit Segment 2PBS2段长度
ReSynchronization Jump Width重同步跳跃宽度,即位时序提到的SJW
Time Triggered Communication Mode是否使能时间触发
Automatic Bus-Off Management是否使能自动离线管理
Automatic Wake-Up Modet是否使能自动唤醒
Qutomatic Retransmission是否使能自动重传
Receive Fifo Locked Mode是否使能锁定FIFO
Transmit Fifo Priority配置报文优先级的判断方法
Oprating Mode操作模式

这些参数也可以在can.c中自行修改

在这里插入图片描述
中断(NVIC)设置,根据需要设置,一般勾上CAN1 RX0 Interrupt

位时序

意义:为了实现正确的总线电平采样,确保通讯正常。最小单位是Tq(Time Quantum),一个完整位由8~25个Tq组成
组成:SS段、PTS 段、PBS1段、PBS2段

请添加图片描述

段名意义作用
SS(1Tq)同步段补偿物理延时,是传播时间、收发器延时之和的两倍
PTS(1~8Tq)传播时间段补偿变压阶段误差
PBS1(1~8Tq)相位缓冲段1使总线各节点同步
PBS2(2~8Tq)相位缓冲段2补偿边沿阶段误差
SJW(1~4Tq)再同步补偿宽度补偿时钟频率偏差、传输延迟等

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

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

相关文章

React 生成传递给无障碍属性的唯一 ID

useId() 在组件的顶层调用 useId 生成唯一 ID: import { useId } from react; function PasswordField() { const passwordHintId useId(); // ...参数 useId 不带任何参数。 返回值 useId 返回一个唯一的字符串 ID,与此特定组件中的 useI…

【CSS】包含块

CSS规范中的包含块 包含块的内容: 元素的尺寸和位置,会受它的包含块所影响。 对于一些属性,例如 width, height, padding, margin,绝对定位元素的偏移值(比如 position 被设置为 absolute 或 fixed)&…

『第十章』仪态万千的雨燕:UIKit 和 SwiftUI

在本篇博文中,您将学到如下内容: 1. 老骥伏枥:AppKit 和 UIKit2. 雨燕的新装:SwiftUI3. SwiftUI 原生视图4. SwiftUI 容器4.1 ViewThatFits4.2 自定义布局(Custom Layout)6. SwiftUI 修改器(Modifiers)6.1 修改器修饰作用域6.1 自定义修改器5. SwiftUI 状态:真相之源(S…

在spring boot+vue项目中@CrossOrigin 配置了允许跨域但是依然报错跨域,解决跨域请求的一次残酷经历

首先,说一下我们的项目情况,我们项目中后端有一个过滤器,如果必须要登录的接口路径会被拦下来检查,前端要传一个token,然后后端根据这个token来判断redis中这个用户是否已经登录。 if (request.getMethod().equals(&qu…

20、Python -- 变量作用域、局部函数

目录 变量作用域变量?字典?获取变量字典变量遮蔽解决方法:方法1:使用globals访问全局变量方法2:在函数中声明全局变量 局部函数封闭函数返回局部函数代码演示另一种写法 局部函数的遮蔽问题如图:解决方法&a…

深入理解Java中的转义字符

最近在学习《两周自制脚本语言》这本书,在词法分析的一些复杂的正则中用到了大量的转义字符’\,比如正则字符串中包含了这个部分\\\\\"你知道它是匹配什么的么? 反斜杠在字符串和正则表达式中都有特殊作用。今天让我们来深入理解一下Ja…

如何使用drawio画流程图以及导入导出

画一个基本的流程图 你可以在线使用drawio, 或者drawon创建很多不同类型的图表。 如何使用编辑器,让我们以一个最基本的流程图开始。 流程图,就是让你可视化的描述一个过程或者系统。 图形和很少部分的文字表达就可以让读者很快的理解他们需要什么。 创…

文心大模型走进高校!百度携手吉林大学计算机学院成功举办AI师资培训

随着人工智能技术的快速发展,大模型已经成为了人工智能的主流发展方向,同时也对新时代AI人才的培养带来了新的思考与挑战。为了推动大模型及人工智能相关专业人员的培养,10月20日-22日,百度飞桨携手中国电子学会,吉林大…

@TableLogic 这个注解的作用

TableLogic 是 MyBatis-Plus(一个 MyBatis 的增强工具)提供的一个注解,用于实现逻辑删除功能。 逻辑删除并不是真正从数据库中删除记录,而是通过在数据库表中设置一个标记字段(通常是一个状态字段,如 is_d…

【Linux】部署及发布单机项目及前后端分离的项目

目录 一、讲述 1. 为什么 2. 要求 二、单机项目 1. 本机测试 2. 部署 三、前后端 1. 准备 2. 部署 一、讲述 1. 为什么 实施部署和发布项目的目的是将软件开发的成果转化为可用的产品或服务,以满足用户的需求。以下是实施部署和发布项目的一些重要原因&am…

Proteus仿真--闪烁的LED灯

本文介绍一种基于51单片机实现的LED灯闪烁仿真(完整仿真源文件及代码见文末链接) 本文主要介绍51单片机的LED闪烁仿真设计,仿真文件截图如下: 仿真视频如下: Proteus仿真--闪烁的LED灯 附完整Proteus仿真资料代码资…

NlogPrismWPF

文章目录 Nlog&Prism&WPF日志模块实现原理添加配置注入服务应用测试其他模块怎么调用? Nlog&Prism&WPF 日志模块 介绍了为WPF框架Prism注册Nlog日志服务的方法 实现原理 无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着…

【软考】10.1 算法特性/时间复杂度/递归/分治/动态规划

《算法》 《时间复杂度》 n 的最高次项 渐进符号 算法复杂度 线性级 O(n):顺序查找对数级 O(logn):对半查找、快速查找、归并算法 《递归》 时间复杂度 《分治法》 《动态规划法》 适用于求全局最优解构建…

MySQL总结 (思维导图,常用)

一、常见的增删改查 二、约束(五种) 三、聚合查询 1、聚合函数 2、group by 和 having 3、联合查询 案例表: drop table if exists classes; create table classes (id int primary key auto_increment,name varchar(20) ); insert into …

CAD2024最新中文版安装教程分享

wx供重浩:创享日记 对话框发送:cad24 获取 AutoCAD是目前计算机辅助设计领域最流行的CAD软件,此软件功能强大、使用方便,在国内外广泛应用于机械、建筑、家居、纺织等诸多行业。CAD制图软件具有良好的用户界面,通过交互…

开发直播商城APP:技术要点和最佳实践

在当今数字时代,直播商城APP正变得越来越受欢迎,成为了吸引消费者和促进销售的强大工具。这篇文章将探讨开发直播商城APP的技术要点和最佳实践,为开发者提供有价值的指导。 第一部分:项目准备 1.1定义项目目标 在开始开发直播商…

中国黑客群体的收入,与国外的黑客调查问卷相比!竟然还有女黑客!

从圈外认知来说,黑客一直被认为是高收入群体,黑客有白帽和黑帽处于黑白两道的黑客会的技术都有些相似,但是却是对立的,白帽做网络安全,修补漏洞。黑帽各种破坏,挖数据,攻击漏洞。 如果你对网络…

网络编程 - IP协议

目录 一,IP协议格式 1.1 拆包组包 1.2 8位生存空间 二,地址管理 2.1 动态分配 IP 2.2 NAT 机制(网络地址转换) 2.3 IPv6 2.4 网段划分 三,路由选择 一,IP协议格式 4位版本:IPv44位首部长…

数据结构和算法(15):排序

快速排序 分治 快速排序与归并排序的分治之间的不同: 归并排序的计算量主要消耗于有序子向量的归并操作,而子向量的划分却几乎不费时间; 快速排序恰好相反,它可以在O(1)时间内,由子问题的解直接得到原问题的解&#…

rust 创建多线程web server

创建一个 http server,处理 http 请求。 创建一个单线程的 web 服务 web server 中主要的两个协议是 http 和 tcp。tcp 是底层协议,http 是构建在 tcp 之上的。 通过std::net库创建一个 tcp 连接的监听对象,监听地址为127.0.0.1:8080. us…