STM32的CAN外设简介

news2024/11/16 19:57:37

目录

STM32的CAN外设简介

CAN框图剖析

CAN控制内核

工作模式

位时序及波特率

CAN发送邮箱

CAN接收FIFO

验收筛选器(重点)

整体控制逻辑


STM32的CAN外设简介

        STM32的芯片中具有bxCAN控制器 (Basic Extended CAN 基本扩展CAN外设),它支持CAN协议2.0A(不支持扩展帧)和2.0B标准(支持扩展帧)。所以我们的STM32芯片是可以发送控制帧的。

        该CAN控制器支持最高的通讯速率为1Mb/s;可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间具有2个3级深度的接收FIFO(每个可以存储一个报文,一共可存储6个报文),可使用过滤功能只接收或不接收某些ID号的报文可配置成自动重发;不支持使用DMA进行数据收发

        至此,所介绍的CAN协议只是CAN的基本协议,在CAN协议之上有一种叫做CAN OPEN的协议。它是在CAN基本协议的基础上,对很多报文进行一些规定,比如说怎么传送,怎么在几个节点之间进行通信都有一些更详细的规定。在我们实际工作中大部分都是用CAN OPEN协议。简单来说就是CAN OPEN在CAN的基础上又打包了很多情况,根据很多情况进行处理。

        就相当于TCP/IP协议,它本身只规定了每个节点之间用MAC地址进行数据传输,然后再它之上又加了IP协议和TCP协议这些东西。

CAN框图剖析

  • CAN控制内核
  • CAN发送邮箱:我们要发送报文的时候,先把报文放在邮箱里面,当总线空闲了之后就会去发送了。多个节点会有总线竞争的情况,多个节点同时发送报文的时候,就会将报文进行缓存,然后根据ID号优先级来发送。
  • CAN接收FIFO:作用和发送邮箱一样,用于暂存数据报文。
  • 验收筛选器:通过验收筛选器可以对总线上的数据报文进行筛选,筛选某一类的报文存储在接收FIFO里。
  • 整体控制逻辑

STM32的有两组CAN控制器,其中CAN1是主设备,框图中的“存储访问控制器”是由CAN1控制的,CAN2无法直接访问存储区域,所以使用CAN2的时候必须使能CAN1外设的时钟。在STM32F103中只有一个CAN设备,在STM32F105或STM32F4以上版本才有两个CAN外设。

CAN控制内核

框图中标号1处的CAN控制内核包含了各种控制寄存器及状态寄存器,我们主要讲解其中的主控制寄存器CAN_MCR及位时序寄存器CAN_BTR。

主控制寄存器CAN_MCR负责管理CAN的工作模式,它使用以下寄存器位实现控制。

  • DBF调试冻结功能

DBF(Debug freeze)调试冻结,使用它可设置CAN处于工作状态或禁止收发的状态,禁止收发时仍可访问接收FIFO中的数据。这两种状态是当STM32芯片处于程序调试模式时才使用的,平时使用并不影响。

  • TTCM时间触发模式

TTCM(Time triggered communication mode)时间触发模式,它用于配置CAN的时间触发通信模式,在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR、CAN_TDTxR寄存器中。内部定时器在每个CAN位时间累加,在接收和发送的帧起始位被采样,并生成时间戳。利用它可以实现ISO 11898-4 CAN标准的分时同步通信功能。

  • ABOM自动离线管理

ABOM(Automatic bus-off management) 自动离线管理,它用于设置是否使用自动离线管理功能。当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能,它会在适当的时候自动恢复。

  • AWUM自动唤醒

AWUM(Automatic bus-off management),自动唤醒功能,CAN外设可以使用软件进入低功耗的睡眠模式,如果使能了这个自动唤醒功能,当CAN检测到总线活动的时候,会自动唤醒。

  • NART自动重传

NART(No automatic retransmission)报文自动重传功能,设置这个功能后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,无论发送结果如何,消息只发送一次。

  • RFLM锁定模式

RFLM(Receive FIFO locked mode)FIFO锁定模式,该功能用于锁定接收FIFO。锁定后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则下一个接收到的报文从第一个FIFO开始覆盖原报文。

  • TXFP报文发送优先级的判定方法

TXFP(Transmit FIFO priority)报文发送优先级的判定方法,当CAN外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。

工作模式

        为方便调试,STM32的CAN提供了测试模式,配置位时序寄存器CAN_BTR的SILM及LBKM寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式

通过位时序寄存器来进行配置

  • 正常模式

正常模式下就是一个正常的CAN节点,可以向总线发送数据和接收数据。

  • 静默模式

静默模式下,它自己的输出端的逻辑0数据会直接传输到它自己的输入端,逻辑1可以被发送到总线,所以它不能向总线发送显性位(逻辑0),只能发送隐性位(逻辑1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。多用于车载系统性能检测。

  • 回环模式

回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。

  • 回环静默模式

回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。

位时序及波特率

STM32外设定义的位时序与前面解释的CAN标准时序有一点区别:

        STM32的CAN外设位时序中只包含3段,分别是同步段SYNC_SEG、位段BS1及位段BS2,采样点位于BS1及BS2段的交界处。其中SYNC_SEG段固定长度为1Tq,而BS1及BS2段可以在位时序寄存器CAN_BTR设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度SJW也可在位时序寄存器中配置。

        理解STM32的CAN外设的位时序时,可以把它的BS1段理解为是由CAN标准协议中PTS段与PBS1段合在一起的,而BS2段就相当于PBS2段。

        它们的时间也是通过位时序寄存器来进行配置,比如我们的BS2设置位3Tq,TS2就要设置为2,同理TS1

通过配置位时序寄存器CAN_BTR的TS1[3:0]及TS2[2:0]寄存器位设定BS1及BS2段的长度后,就可以确定每个CAN数据位的时间:

BS1段时间:

                                                TS1=Tq x (TS1[3:0] + 1),

BS2段时间:

                                                TS2= Tq x (TS2[2:0] + 1),

一个数据位的时间:

                T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq

其中单个时间片的长度Tq与CAN外设的所挂载的时钟总线及分频器配置有关,CAN1和CAN2外设都是挂载在APB1总线上的,而位时序寄存器CAN_BTR中的BRP[9:0]寄存器位可以设置CAN外设时钟的分频值 ,所以:

                                                Tq = (BRP[9:0]+1) x TPCLK

其中的PCLK指APB1时钟,默认值为36MHz。

最终可以计算出CAN通讯的波特率:

                                                BaudRate = 1/N Tq

CAN发送邮箱

CAN外设一共有3个发送邮箱,即最多可以缓存3个待发送的报文。

        每个发送邮箱中包含有标识符寄存器CAN_TIxR、数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR、CAN_TDHxR,它们的功能如下:

        当要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去。

其中标识符寄存器CAN_TIxR中的STDID寄存器位比较特别。CAN的标准标识符的总位数为11位,而扩展标识符的总位数为29位的。当报文使用扩展标识符的时候,标识符寄存器CAN_TIxR中的STDID[10:0]等效于EXTID[18:28]位,它与EXTID[17:0]共同组成完整的29位扩展标识符。

CAN接收FIFO

        CAN外设一共有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文。当接收到报文时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的RFLM位,可设置锁定模式,锁定模式下FIFO溢出时会丢弃新报文,非锁定模式下FIFO溢出时新报文会覆盖旧报文。

        跟发送邮箱类似,每个接收FIFO中包含有标识符寄存器CAN_RIxR、数据长度控制寄存器CAN_RDTxR及2个数据寄存器CAN_RDLxR、CAN_RDHxR,其功能如下:

验收筛选器(重点)

        CAN外设的验收筛选器,一共有28个筛选器组,每个筛选器组有2个寄存器,CAN1和CAN2共用的筛选器的。

        在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作,STM32的CAN外设接收报文前会先使用验收筛选器检查,只接收需要的报文到FIFO中。

        筛选器工作的时候,可以调整筛选ID的长度及过滤模式。

根据筛选ID长度来分类有有以下两种:

  • 检查 STDID[10:0]、 EXTID[17:0]、 IDE 和 RTR 位,一共32位。
  • 检查STDID[10:0]、 RTR、 IDE 和 EXTID[17:15],一共16位。

比如我们的STM32F103,一共有14组筛选器组。如果工作在32位,就只能过滤14个ID;但如果工作在16位,就可以过滤28个ID

而根据过滤的方法分为以下两种模式:

  • 标识符列表模式,它把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
  • 掩码模式,它把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收FIFO。

要注意F103只有0-13组,F105互联型产品才有0-27组

通过配置筛选尺度寄存器CAN_FS1R的FSCx位可以设置筛选器工作在哪个尺度。

通过配置筛选模式寄存器CAN_FM1R的FBMx位可以设置筛选器工作在哪个模式。

        每组筛选器包含2个32位的寄存器,分别为CAN_FxR1和CAN_FxR2,它们用来存储要筛选的ID或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致,各个模式的说明如下:

筛选器设置举例:

        如在掩码模式时,第一个寄存器存储要筛选的ID,第二个寄存器存储掩码,掩码为1的部分表示该位必须与ID中的内容一致,筛选的结果为表中第三行的ID值,它是一组包含多个的ID值,其中x表示该位可以为1可以为0。

        如工作在标识符模式时,2个寄存器存储的都是要筛选的ID,它只包含2个要筛选的ID值(32位模式时)。

        如果使能了筛选器,且报文的ID与所有筛选器的配置都不匹配,CAN外设会丢弃该报文,不存入接收FIFO。

整体控制逻辑

CAN2外设的结构与CAN1外设是一样的,它们共用筛选器,且由于存储访问控制器由CAN1控制,所以要使用CAN2的时候必须要使能CAN1的时钟。

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

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

相关文章

executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM

Bug现象 spark程序运行正常,但是查看web ui的时候如下图所示: 查看executor logs发现: ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM原因分析 首先程序能够正常运行,只是发现某些executor状态为Dead了,说明该executor被移除了,至于为什么会被…

代码随想录算法训练营第二天| 977

977. 有序数组的平方y 思路,原数组是有序的,但是因为负数平方后可能变无序了,因此利用双指针遍历原数组,比较 nums[left]*nums[left]和nums[right]*nums[right]谁更大,然后对新数组赋值 class Solution {public int…

爬虫003_pycharm的安装以及使用_以及python脚本模版设置---python工作笔记021

这里我们用ide,pycharm来编码,看一看如何下载 这里我们下载这个社区办,这个是免费的,个人版是收费的 然后勾选以后 安装以后我们来创建一个项目 这里可以选择python的解释器,选择右边的... 这里我们找到我们自己安装的python解释器

SpringBoot——数据层三组件之间的关系

简单介绍 在之前的文章中,我们介绍了一下SpringBoot中内置的几种数据层的解决方案,在数据层由三部分组成,分别是数据库,持久化技术以及数据源,但是我今天写着写着,突然就想不起来这三部分到底是干什么的了…

助你丝滑过度到 Vue3 生命自定义hooktoRef ②⑥

作者 : SYFStrive 博客首页 : HomePage 📜: VUE3~TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 👉…

TCP状态转换图

TCP状态转换图 了解TCP状态转换图可以帮助开发人员查找问题. 说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究. 对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分) 而对于关闭(图的下半部分), 服务端…

JVM内存的变化

我举得,从空间的角度去理解java的运行,能更深刻的帮助我们学习后面“面向对象”的知识。因此,单独拿出一章,来解释内存的变化。以程序为实例进行判断。 需要一点JVM运行时的内存状态知识点基础。 参考博客: 这种是不…

ubuntu20.04 安装 Qt5.15

目录 安装前工作 选择安装QT的哪个版本 安装时候选择哪些组件 安装Qt5.15 在线安装 我选择的组件 源码包安装 测试 安装前工作 ubuntu20.04.3安装Qt6.22操作步骤_ubuntu安装qt6_sonicss的博客-CSDN博客 # 安装g、gcc编译器 sudo apt-get install build-essential 安装l…

leetcode 455. 分发饼干

2023.7.27 今天起福州要刮台风了,不过还是在宿舍坚持每日一题。 今天开始刷的系列属于贪心算法系列。本题是贪心算法的一个入门题。 贪心算法总体思路就是先找局部最优,在一步步的找出全局最优。 本题很明显全局最优就是 需要尽可能多投喂更多的孩子。…

「双指针技巧解决一些数组问题」

文章目录 0 分类1 快慢指针刷题1.1 删除有序数组中的重复项题解Code结果 1.2 删除排序链表中的重复元素题解Code结果 1.3 移除元素题解Code结果 1.4 移动0题解Code 2 左右指针刷题2.1 二分查找2.2 两数之和 II - 输入有序数组题解Code结果 2.3 反转字符串题解Code结果 2.4 最长…

品牌渠道管理的逻辑

无规矩不成方圆,规则确定了,接下来就是推行这个规则并且执行落地就可以,所以明确问题制定规则就非常重要。这个原则也适用于品牌渠道管理工作,品牌面对经销商低价乱价等问题时,如果仅用打击一种方式去管理,…

Component template should contain exactly one root element

在vue中报错: Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead报错的大致意思是:组件的模板应该只能包含一个根元素,也就是是说作为元素的直…

科技项目验收测试:验证软件产品功能与性能的有效手段

科技项目验收测试是验证软件产品功能与性能的重要手段,在项目开发中起到了至关重要的作用。本文将从产品质量、需求验证、性能测试等方面,探讨科技项目验收测试的有效手段。 1、产品质量保证是验收测试的核心 科技项目验收测试的核心目标是验证软件产品…

DFS()

DFS之连通性模型 dfs 与 bfs都能判断连通性 而且bfs可以得出最短距离 而dfs不可以 dfs 代码比较简洁 迷宫 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n∗nn∗n 的格点组成,每个格点只有2种状态,.和#&#xff0…

【小尘送书-第三期】Python机器学习:基于PyTorch和Scikit-Learn 》

大家好,我是小尘,欢迎关注,一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的实习! 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式 一、前言 近年来&#xff0…

Vue-resource 实现 get, post请求

Vue-resource是Vue高度集成的第三方包&#xff0c;能很方便的发送请求。 注意Vue-resource依赖于Vue&#xff0c;只能在Vue环境下使用。 导包 //依赖于Vue <script src"./js/vue.js"></script> <script src"./js/elementui.js"></…

ROS与STM32通信-rosserial

文章目录 硬件接线 软件STM32CubeMX配置 rosserial移植上位机订阅-下位机发布上位机订阅下位机发布通信 上位机发布-下位机订阅上位机发布下位机订阅通信 硬件 STM32F103c8t6OLED(I2C)USB2TTLStlink 接线 OLED(GPIO模拟I2C) 硬件引脚OLEDSCLPA4OLEDSDAPA5 USART1 硬件引脚…

SwipeDelMenuLayout失效:Could not find SwipeDelMenuLayout-V1.3.0.jar

一、问题描述 最近在工作上的项目中接触到SwipeDelMenuLayout这个第三方Android开发库&#xff0c;然后我就根据网上的教程进行配置。这里先说一下我的开发环境&#xff1a;Android Studio版本是android-studio-2020.3.1.24-windows&#xff0c;gradle版本是7.0.2。 首先是在se…

LeetCode53.Maximum-Subarray<最大子数组和>

题目&#xff1a; 思路&#xff1a; 这题不会啊...然后发现题解如此简单, 逐层判断.得到最大值. 每次取得当前的最大值.并且更新结果最大值,结果循环扫描后得到结果 代码是&#xff1a; //codeclass Solution { public:int maxSubArray(vector<int>& nums) {int p…