STM32 的 CAN 通讯全攻略

news2024/11/13 13:21:49

目录

一、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.coloradmin.cn/o/2140418.html

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

相关文章

初始c++的继承

概念: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c…

Java高级Day43-类加载

117.类加载 静态和动态加载 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强 动态加载:运行时加载需要的类,如果运行时不用该类…

集群聊天服务器项目【C++】(五)网络模块和业务模块

经过前面介绍相关的库和工具,比如Json、CMake、muduo等,我们可以开始编写本项目的代码了。 1.项目目录创建 一般一个项目由以下结构组成: bin文件夹存放:可执行程序build文件夹存放:编译过程中的临时文件include文…

消失的数去哪里了

大家好,我是大圣,最近消失了很长一段时间了,之前答应粉丝要更新的文章也没有按时更新。其实我这段时间去闭关修炼去了,现在满血归来啦,之前答应粉丝的文章都会陆续发出来的。 消失的 Count 去哪了 今天给大家分享一个…

BolckingQueue

队列 队列的特点先进先出(FIFO)。 如图: 进入队列的顺序是1,2,3,那么出队列的顺序只能是1,2,3,不可能是其他顺序,这是由队列的特点保证的。 保存数据的基本…

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象,这个对象具有原对象属性的精确副本 基本数据类型(如字符串、数字等),在浅拷贝过程中它们是通过值传递的,而不是引用传递,修改值并不…

基于yolov8的茶叶病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的茶叶病害检测系统,是利用深度学习技术,特别是YOLOv8这一先进的目标检测算法,来精准识别和监测茶叶生长过程中出现的各种病害。该系统通过无人机、地面机器人或固定摄像头等设备,定期采集茶园的高分辨率…

力扣刷题(6)

两数之和 II - 输入有序数组 两数之和 II - 输入有序数组-力扣 思路: 因为该数组是非递减顺序排列,因此可以设两个左右下标当左右下标的数相加大于target时,则表示右下标的数字过大,因此将右下标 - -当左右下标的数相加小于targ…

??Ansible——ad-hoc

文章目录 一、ad-hoc介绍二、ad-hoc的使用1、语法2、ad-hoc常用模块1)shell模块2)command模块3)script模块4)file模块5)copy模块6)yum模块7)yum-repository模块8)service模块9&#…

优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序

遗传算法(Genetic Algorithm, GA)是一种启发式搜索算法,用于寻找复杂优化问题的近似解。它模拟了自然选择和遗传学中的进化过程,主要用于解决那些传统算法难以处理的问题。 遗传算法的基本步骤: 初始化种群&#xff0…

【GO语言】Go语言详解与应用场景分析,与Java的对比及优缺点

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. Go是一种开源编程语言,可以轻松构建简单、可靠和高效的软件。 文章目录 一、引言二、Go语言详解1. 简史2. 特点3. 核心库 三、应用场景四、与Ja…

comfyui中,sam detector与yoloworld图像分割算法测试以及影响

🍖背景 图像处理中,经常会用到图像分割,在默认的comfyui图像加载中就有一个sam detector的功能,yoloworld是前一段时间公开的一个更强大的图像分割算法,那么这两个差别大吗?在实际应用中有什么区别吗&…

普推知产:明知商标驳回也要去申请注册!

有个去年加的网友让普推知产商标老杨看在32类申请如何,去年是把33类的申请复审下来,这个网友想的名称都是存在已存在的商标名称,直接都是申请不下来的,需要申请和再加驳回复审。 去年那个在33类的名称,当时查过只有一个…

函数(下)

static 代码1的test函数中的局部变量i是每次进⼊test函数先创建变量(⽣命周期开始)并赋值为0,然后 ,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。 代码2中,我们从输出结果…

论文阅读-Demystifying Misconceptions in Social Bots Research

论文链接: https://arxiv.org/pdf/2303.17251 目录 摘要: Introduction Methodological issues Information leakage Cherry-picking(采摘樱桃) Straw-man methodology (稻草人) Data biases Conceptual issu…

Spring高手之路23——AOP触发机制与代理逻辑的执行

文章目录 1. 从整体视角学习Bean是如何被AOP代理的2. AOP代理的触发机制2.1 postProcessAfterInitialization方法源码分析2.2 wrapIfNecessary方法源码分析2.3 时序图演示触发机制 3. AOP代理逻辑的执行3.1 AOP代理如何使用拦截器3.2 proceed方法源码分析3.3 时序图 1. 从整体视…

【Linux】线程锁条件变量信号量生产消费者模型线程池

文章目录 线程概念线程控制接口和线程id线程优缺点线程互斥和条件变量锁和条件变量相关接口POSIX 信号量生产消费者模型阻塞队列实现生产消费者模型环形队列实现生产消费者模型简易懒汉线程池自旋锁和读写锁(了解) 线程概念 在操作系统的的视角下&#x…

SysML图例-农业无人机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

828华为云征文 | 华为云FlexusX实例下的Kafka集群部署实践与性能优化

前言 华为云FlexusX实例,以创新的柔性算力技术,为Kafka集群部署带来前所未有的性能飞跃。其灵活的CPU与内存配比,结合智能调度与加速技术,让Kafka在高并发场景下依然游刃有余。在828华为云企业上云节期间,FlexusX实例携…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~

本以为遥遥领先的GPT早就普及了,但小伙伴寻找使用的热度一直高居不下,其实现在很简单了! 国产大模型快200家了,还有很多成熟的国内AI产品,跟官网一样使用,还更加好用~ ① 3.5 大多数场景是够用的&#xff…