STM32 的 CAN 通讯全攻略

目录

一、CAN 通讯概述

二、 CAN 通讯原理

1.ISO11898 标准下的物理层特征

2.CAN 协议的帧类型 

3. 总线仲裁介绍

 4.位时序

5.STM32 CAN 控制器简介

6.标识符筛选器 

三、软件设计

1.发送流程

1.1初始化 CAN 控制器

1.2准备发送数据

1.3 将数据填充到发送缓冲区

1.4启动发送 

1.5等待发送完成

2.接收流程 

2.1初始化 CAN 控制器

2.2开启接收中断(可选)

2.3等待数据接收

2.4读取数据 

2.5处理接收的数据


一、CAN 通讯概述

STM32 的 CAN 通讯是一种常用于嵌入式系统的串行通信协议,具有高可靠性和多主控制等特点,广泛应用于汽车电子、工业自动化等领域。

CAN 协议经过 ISO 标准化后有两个标准:ISO11898 标准和 ISO11519 - 2 标准。其中 ISO11898 是针对通信速率为 125Kbps - 1Mbps 的高速通信标准,而 ISO11519 - 2 是针对通信速率为 125Kbps 以下的低速通信标准。STM32 的 CAN 控制器支持 CAN 2.0A 和 CAN 2.0B Active 版本协议。CAN 2.0A 只能处理标准数据帧,扩展帧的内容会识别为错误;CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。

CAN 总线物理层主要有两种形式,一种是遵循 ISO11898 标准的高速、短距离 “闭环网络”,总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个 “120 欧” 的电阻。另一种是遵循 ISO11519 - 2 标准的低速、远距离 “开环网络”,最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个 “2.2 千欧” 的电阻。

CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。差分信号传输方式具有抗干扰能力强、能有效抑制电磁干扰、时序定位精确等优点。

STM32 的 CAN 通讯具有多主控制、系统的柔软性、通信速度较快且通信距离远、具有错误检测和恢复功能、故障封闭功能以及连接节点多等特点。这些特点使得 CAN 特别适合工业过程监控设备的互连,越来越受到工业界的重视。

二、 CAN 通讯原理

1.ISO11898 标准下的物理层特征

CAN 控制器根据 CAN_L 和 CAN_H 上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。显性电平对应逻辑 “0”,此时 CAN_High和 CAN_Low 之差为 2.5V 左右;隐性电平对应逻辑 “1”,此时 CAN_High和 CAN_Low 电压都为 2.5V 左右,电位差为 0V。显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。另外,在 CAN 总线的起止端都有一个 120Ω 的终端电阻,用于匹配总线阻抗,减少回波反射,提高数据通信的抗干扰能力以及可靠性。

2.CAN 协议的帧类型 

CAN 协议有数据帧、遥控帧、错误帧、超载帧和间隔帧五种类型帧。

其中,数据帧最常用且复杂,一般由 7 个段构成,包括帧起始、仲裁段、控制段、数据段、CRC 段、应答段和帧结束

帧起始由 1 个显性位构成,标志着报文的开始。

仲裁段表示该帧优先级,标准格式包含 11 位标识符和远程发送请求位 RTR,扩展格式包含 29 位标识符、SRR 位、IDE 位和 RTR 位。

控制段包含数据长度等信息。

数据段包含要发送的 0 - 8 个字节的数据。

CRC 段用于校验数据是否正确发送。

应答段用于确认是否正常接收。

帧结束由连续的 7 个隐性位组成。

 

3. 总线仲裁介绍

同时多个单元发送数据时,总线仲裁过程如下:多个单元同时开始向总线发送数据,开始部分数据格式一样,无法区分优先级。直到某个时刻,一个单元输出隐性电平,而另一个单元输出显性电平,此时输出隐性电平的单元仲裁失利,立刻转入接收状态工作,不再与其他单元竞争,而输出显性电平的单元则顺利获得总线使用权,继续发送自己的数据。规律为:总线空闲时,最先发送的单元获得发送优先权,一旦发送,其他单元无法抢占;如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级

 4.位时序

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

这些段又由可称为 Time Quantum(Tq)的最小时间单位构成,1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。位时间 = 1 / 波特率,知道位时间,我们就可以知道波特率以及 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

5.STM32 CAN 控制器简介

STM32F4 的 bxCAN 支持 CAN 协议 2.0A 和 2.0B 主动模式,波特率最高达 1Mbps,支持时间触发通信,具有 3 个发送邮箱,具有 3 级深度的 2 个接收 FIFO,可变的过滤器组(28 个,CAN1 和 CAN2 共享)。它的设计目标是以最小的 CPU 负荷来高效处理大量收到的报文,对于安全紧要的应用,提供所有支持时间触发通信模式所需的硬件功能。

6.标识符筛选器 

CAN 的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值,来决定是否接收对应消息。STM32 CAN 控制器提供了 28 个可配置的筛选器组,可降低 CPU 处理 CAN 通信的开销。STM32 CAN 控制器每个筛选器组由 2 个 32 位寄存器组成。根据位宽不同,每个筛选器组可提供

  • 1 个 32 位筛选器,包括 STDID [10:0]、EXTID [17:0]、IDE 和 RTR 位;
  • 或者2 个 16 位筛选器,包括 STDID [10:0]、IDE、RTR 和 EXTID [17:15] 位。

筛选器可配置为屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照 “必须匹配” 或 “不用关心” 处理。

 

三、软件设计

1.发送流程

1.1初始化 CAN 控制器
  • 配置时钟:使能 CAN 控制器对应的时钟源。
  • 设置工作模式:如正常模式、环回模式等。
  • 配置波特率:通过设置位时序参数(同步段、传播段、相位缓冲段等)来确定合适的波特率。
  • 初始化过滤器:设置过滤器的模式、位宽、标识符等,以确定哪些报文可以被接收。
1.2准备发送数据

定义一个CAN_TxHeaderTypeDef结构体变量,设置报文的标识符、数据长度、发送类型等信息。例如:

CAN_TxHeaderTypeDef txHeader;
txHeader.StdId = 0x123; // 标准标识符
txHeader.ExtId = 0; // 不使用扩展标识符
txHeader.DLC = 8; // 数据长度为 8 字节
txHeader.TransmitGlobalTime = DISABLE;
1.3 将数据填充到发送缓冲区

定义一个数组用于存储要发送的数据。例如:

uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
1.4启动发送 

使用HAL_CAN_AddTxMessage函数将数据发送到 CAN 总线。例如:

HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(&hcan, &txHeader, data, &txMailbox);
if (status!= HAL_OK) {// 处理发送错误
}

该函数会返回发送状态,可根据返回值判断发送是否成功。如果发送失败,可以根据具体情况进行错误处理。

1.5等待发送完成

可以通过查询发送邮箱的状态标志或者使用中断方式来判断发送是否完成。例如,使用轮询方式:

while (HAL_CAN_IsTxMessagePending(&hcan, txMailbox)) {// 等待发送完成
}

2.接收流程 

2.1初始化 CAN 控制器
  • 配置时钟:使能 CAN 控制器对应的时钟源。
  • 设置工作模式:如正常模式、环回模式等。
  • 配置波特率:通过设置位时序参数(同步段、传播段、相位缓冲段等)来确定合适的波特率。
  • 初始化过滤器:设置过滤器的模式、位宽、标识符等,以确定哪些报文可以被接收。
2.2开启接收中断(可选)

如果希望使用中断方式接收数据,可以配置相应的中断并开启中断。例如:

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *hcan) {// 接收中断处理函数
}
2.3等待数据接收

可以通过查询接收邮箱的状态标志来判断是否有新的数据到达。例如:

if (HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) > 0) {// 有数据到达
}
2.4读取数据 

当检测到有数据接收后,使用HAL_CAN_GetRxMessage函数从接收邮箱中读取数据。例如:

CAN_RxHeaderTypeDef rxHeader;
uint8_t rxData[8];
HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &rxHeader, rxData);

该函数会将接收到的报文信息填充到传入的结构体和数据缓冲区中。

2.5处理接收的数据

根据实际应用需求对接收的数据进行处理。例如,可以根据标识符判断数据的来源和类型,然后进行相应的操作。

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

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

相关文章

Vue.js入门系列(二十九):深入理解编程式路由导航、路由组件缓存与路由守卫

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

pikachu下

CSRF(跨站请求伪造) CSRF(get) url变成了这样了,我们就可以新开个页面直接拿url去修改密码 http://pikachu-master/vul/csrf/csrfget/csrf_get_login.php?username1&password2&submitLogin CSRF(post) 这里只是请求的方式不同,…

简洁明了!中缀表达式转为后缀表达式规则及代码

简单来说&#xff0c;就是弄两个栈&#xff0c;判断执行&#xff1a; 上代码&#xff1a; #include<iostream> #include<stack> #include<cstring> using namespace std; stack<char>s1,s2; char now; int main(){string c;cin>>c;for(int i0;…

Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解

目录 一、Linux软件包管理器 - yum&#xff08;ubuntu用apt代替yum&#xff09;1、Linux下安装软件的方式2、认识 yum3、查找软件包4、安装软件5、如何实现本地机器和云服务器之间的文件互传 二、Linux编辑器 - vim1、vim 的基本概念2、vim 下各模式的切换3、vim 命令模式各命令…

形式向好、成本较低、可拓展性较高的名厨亮灶开源了

简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算法加…

电子连接器温升仿真教程 一

电子连接器温升是指电子连接器的所有端子在施加额定电载荷的情况下,经过一段时间后,达成热平衡,连接器局部温度不再继续升高,此时规定测试点的温度与测试环境温度的差值。连接器的温升规格值因其应用环境不同,而不同。工业应用,且不与人体接触的电子连接器一般允许温升会…

mybatis 查询Not Found TableInfoCache

近期在工程迁移中遇到一个mybatis查询的问题&#xff0c;检查代码没有问题&#xff0c;但是报Not Found TableInfoCache 解决过程 是不是数据库对应表错误或者实体类指定的表名错误 查看配置文件链接的数据源是否正确TableName中指定的表名然后去数据库看一下是否存在 如果…

【C++】模板进阶:深入解析模板特化

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue 本章将…

SQL进阶技巧:如何将字符串数组清洗为简单map结构? | translate + regexp_replace方法

目录 0 场景描述 1 数据准备 2 问题分析 2.1 方法1 特征法-通用解法 2.2 方法2枚举法(不通用) 3 小结 ~~END~~ 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下: 数字化建设通关指南专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢…

Linux命令分享 四 (ubuntu 16.04)(vi操作文件)

1、su 切换用户 su - 用户名 切换到该用户并将目录切换至该用户的主目录 **注意该语句执行后需要输入密码&#xff0c;输入密码时终端不回显&#xff08;不会显示你输入的密码&#xff09;&#xff0c;输完直接回车即可 su 用户名 切换用户但不切换目录 su - root su root **注…

c++20 std::format 格式化说明

在标头<format>定义 ()功能很强大&#xff0c;它把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 &#xff08;1&#xff09;不带编号&#xff0c;即“{}”&#xff08;2&#xff09;带…

2024年【浙江省安全员-C证】考试试卷及浙江省安全员-C证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 浙江省安全员-C证考试试卷是安全生产模拟考试一点通总题库中生成的一套浙江省安全员-C证模拟考试题库&#xff0c;安全生产模拟考试一点通上浙江省安全员-C证作业手机同步练习。2024年【浙江省安全员-C证】考试试卷及…

arcgisPro修改要素XY容差

1、在arcgisPro中XY容差的默认值为1个毫米&#xff0c;及0.001米。为了更精细的数据&#xff0c;需要提高这个精度&#xff0c;如何提高呢&#xff1f; 2、如果直接在数据库下新建要素类&#xff0c;容差只能调至0.0002米。所以&#xff0c;需要在数据库下新建要素数据集。 3…

安全工具 | 使用Burp Suite的10个小tips

Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具&#xff0c;用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多&#xff0c;您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…

Gradio 中如何让 Chatbot 自动滚动

在 Gradio 中&#xff0c; Chatbot 是对话组件&#xff0c;接受 history 参数&#xff0c;在目前版本中 &#xff08;gradio4.44.0&#xff09;&#xff0c;不支持自动滚动&#xff0c;用起来很不方便&#xff0c;该功能在社区中已经提出了&#xff0c;目前该功能还没有发布。本…

[000-01-008].第05节:OpenFeign特性-重试机制

我的后端学习大纲 SpringCloud学习大纲 1.1.重试机制的默认值&#xff1a; 1.重试机制默认是关闭的&#xff0c;给了默认值 1.2.测试重试机制的默认值&#xff1a; 1.3.开启Retryer功能&#xff1a; 1.修改配置文件YML的配置&#xff1a; 2.新增配置类&#xff1a; packa…

如何用 Helm Chart 安装指定版本的 GitLab Runner?

本分分享如何使用 Helm 来在 Kubernetes 集群上安装极狐GitLab Runner。整体步骤分为&#xff1a;Helm 的安装、vaules.yaml 文件的配置、Runner 的安装、Runner 的测试。 极狐GitLab 为 GitLab 在中国的发行版&#xff0c;中文版本对中国用户更友好。极狐GitLab 支持一键私有…

2024.9最新:CUDA安装,pytorch库安装

目录 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 2.安装CUDA 3.检查环境变量是否配置&#xff0c;安装是否成功 二、pytorch库安装 1.pytorch库下载 2.选择合适的版本 3.查看版本 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 在命令提示符里输入nvidia-…

股指期货的详细玩法功能与应用解析

股指期货作为一种重要的金融衍生工具&#xff0c;为投资者提供了多样化的投资和风险管理手段。本文将详细探讨股指期货的三大主要功能&#xff1a;风险规避、价格发现和资产配置。 第一&#xff0c;风险规避功能 1.套期保值&#xff1a;股指期货的风险规避功能主要通过套期保值…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…