【STM32 CAN】STM32G47x 单片机FDCAN作为普通CAN外设使用教程

STM32G47x 单片机FDCAN作为普通CAN外设使用教程

控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。

硬件说明

这里使用的是STM32G473VET6主控芯片,具有三个CANFD外设,这些CAN外设同时支持传统CAN通信协议。

时钟配置情况

这里STM32主控的SYSCLK(系统时钟)为170MHz。使用外部晶振作为时钟源头。

在这里插入图片描述

CANFD外设作为普通CAN外设使用

CANFD外设

FDCAN外设子系统由一个CAN模块、一块共享的消息RAM和一个配置模块组成。可以参阅内存映射,以获取这些部分的基址。
这些模块(FDCAN)符合ISO 11898-1:2015(CAN协议规范版本2.0部分A、B)和CAN FD协议规范版本1.0。
每个FDCAN实例有0.8千字节的消息RAM,用于实现过滤器、接收FIFOs、传输事件FIFOs和传输FIFOs。

  • 符合CAN协议版本2.0部分A、B和ISO 11898-1:2015、-4
  • 支持最大64数据字节的CAN FD
  • 具有CAN错误日志
  • 支持AUTOSAR和J1939
  • 具有改进的接收过滤器
  • 具有两个接收FIFO,每个有三个有效载荷(每个有效载荷最多64字节)
  • 具有高优先级消息接收时的单独信号提示
  • 具有可配置的传输FIFO/队列,三个有效载荷(每个有效载荷最多64字节)
  • 具有传输事件FIFO
  • 具有可编程的环回测试模式
  • 具有可屏蔽的模块中断
  • 具有两个时钟域:APB总线接口和CAN核心内核时钟
  • 具有支持断电

CANFD 通信速率计算

前置知识
要计算CAN的通信速率首先都了解CAN通信过程中每个bit的构成。
一个电平位时间主要有以下4个段:

SS段(SYNC SEG;同步段):若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围内,则表示节点与总线的时序是同步的;(固定1个Tq)
PTS段(PROP SEG;传播段):这个时间段是用于补偿网络的物理延时时间,是总线上输入比较器延时和输出驱动器延时综合的两倍;(长度可编程:1~8个Tq)
PBS1段(PHASE SEG1;相位缓冲段1):用于补偿节点间的晶振误差,允许通过重同步对该段加长,在这个时间段末端进行总线状态的采样;(长度可编程:1~8Tq)

协议层-位时序
意义:为了实现正确的总线电平采样,确保通讯正常。最小单位是Tq(Time Quantum),一个完整位由8~25个Tq组成,其中一个电平位时间主要有以下4个段:
在这里插入图片描述

段名  意义  作用  SS(1Tq)  Sync Seg;同步段 若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围内,则表示节点与总线的时序是同步的;(固定1个Tq)  PTS(1-8Tq)  Prob Seg;传播段  这个时间段是用于补偿网络的物理延时时间,,是传播时间、收发器延时之和的两倍  PBS1(1-8Tq)  Phase Seg1;相位缓冲段1 补偿变压阶段误差  PBS2(2-8Tq)  Phase Seg2;相位缓冲段2 补偿边沿阶段误差  SJW(1-4Tq)  再同步补偿宽度  补偿时钟频率偏差、传输延迟等  \begin{array}{|c|c|c|} \hline \text { 段名 } & \text { 意义 } & \text { 作用 } \\ \hline \text { SS(1Tq) } & \text { Sync Seg;同步段} & \text { 若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围内,则表示节点与总线的时序是同步的;(固定1个Tq) } \\ \hline \text { PTS(1-8Tq) } & \text { Prob Seg;传播段 } & \text { 这个时间段是用于补偿网络的物理延时时间,,是传播时间、收发器延时之和的两倍 } \\ \hline \text { PBS1(1-8Tq) } & \text { Phase Seg1;相位缓冲段1} & \text { 补偿变压阶段误差 } \\ \hline \text { PBS2(2-8Tq) } & \text { Phase Seg2;相位缓冲段2} & \text { 补偿边沿阶段误差 } \\ \hline \text { SJW(1-4Tq) } & \text { 再同步补偿宽度 } & \text { 补偿时钟频率偏差、传输延迟等 } \\ \hline \end{array}  段名  SS(1Tq)  PTS(1-8Tq)  PBS1(1-8Tq)  PBS2(2-8Tq)  SJW(1-4Tq)  意义  Sync Seg;同步段 Prob Seg;传播段  Phase Seg1;相位缓冲段1 Phase Seg2;相位缓冲段2 再同步补偿宽度  作用  若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围内,则表示节点与总线的时序是同步的;(固定1Tq  这个时间段是用于补偿网络的物理延时时间,,是传播时间、收发器延时之和的两倍  补偿变压阶段误差  补偿边沿阶段误差  补偿时钟频率偏差、传输延迟等 

在这里插入图片描述

如下图所示:
在这里插入图片描述
C A N 波特率 = 1 1 b i t 所占用时间 = 1 T q ∗ 1 b i t 的 T q 个数 CAN波特率 = \frac{1}{1bit所占用时间} = \frac{1}{Tq*1bit的Tq个数} CAN波特率=1bit所占用时间1=Tq1bitTq个数1

在这里插入图片描述
在这里插入图片描述

上面已经说明了一个数据位(1bit,准确来说是1baud)占**(SS+PTS+PBS1+PBS2+SJW)**个Tq。

STM32CubeMX界面参数

在这里插入图片描述
分别为(Nominal 我不知道为什么是Nominal 这个词,但是如果是CAN FD模式的话,这里NominalPrescaler、NominalSyncJumpWidth 、NominalTimeSeg1 、NominalTimeSeg2 是用于配置仲裁阶段波特率的,DataPrescaler 、DataSyncJumpWidth 、DataTimeSeg1 、DataTimeSeg2 是用于配置数据阶段波特率的。)

  • Basic Parameters:

    • Clock Divider: CAN内核时钟分频系数。
    • Frame Format: 指定CAN帧格式,这里是经典CAN(CAN2.0 B)、FD模式没有比特率切换、FD模式有比特率切换。
    • Mode: 指定CAN控制器的工作模式,如正常模式、环回模式或静默模式。
    • Auto Retransmission: 是否使能自动重发。
    • Transmit Pause: 是否配置禁止传输暂停特性。
    • Protocol Exception: 协议异常处理使能。
    • Nominal Sync Jump Width: 规定名义重同步跳跃宽度,用于时间同步,,即位时序提到的SJW。用于动态调节 Phase_Seg1和 Phase_Seg1,所以不可以比Phase_Seg1和 Phase_Seg1大.
    • Data Prescaler: 数据速率预分频值。CAN时钟分配设置,一般设置为1即可,全部由PLL配置好,tq = NominalPrescaler x (1/ fdcan_ker_ck),范围1-32。
    • Data Sync Jump Width: 数据阶段的同步跳跃宽度。用于动态调节 Phase_Seg1和 Phase_Seg1,所以不可以比Phase_Seg1和 Phase_Seg1大,范围1-16
    • Data Time Seg1: 数据位时间段1的长度。特别注意这里的Seg1,这里是两个参数之和,对应位时间特性图的 Pro_Seg + Phase_Seg1。
    • Data Time Seg2: 数据位时间段2的长度。对应位时间特性图的 Phase_Seg2。(Pro_Seg + Phase_Seg1 = DataTimeSeg1, Phase_Seg2 = DataTimeSeg2)
    • Std Filters Nbr: 设置标准ID过滤器个数,范围0-128。是配置CAN接受时候使用的滤波器数量,用了多少个就写多少个。
    • Ext Filters Nbr: 设置扩展ID过滤器个数,范围0-64。
    • Tx Fifo Queue Mode: 发送FIFO队列模式。
  • Bit Timings Parameters 位定时参数:

    • Nominal Prescaler: 名义速率预分频器值。CAN时钟分配设置,一般设置为1即可,全部由PLL配置好,tq = NominalPrescaler x (1/ fdcan_ker_ck)。
    • Nominal Time Quantum: 名义时间量子的长度。
    • Nominal Time Seg1: 名义位时间段1的长度。用于动态调节 Phase_Seg1和 Phase_Seg1,所以不可以比Phase_Seg1和 Phase_Seg1大。
    • Nominal Time Seg2: 名义位时间段2的长度。特别注意这里的Seg1,这里是两个参数之和,对应位时间特性图的 Pro_Seg + Phase_Seg1.(Pro_Seg + Phase_Seg1 = NominalTimeSeg1, Phase_Seg2 = NominalTimeSeg2)
    • Nominal Time for one Bit: 名义单比特时间。
    • Nominal Baud Rate: 名义波特率。

一般没有配置SJW,且STM32的CAN外设的Sync_Seg是固定值1,并且有:
CAN 波特率 = CAN Freq / (Sync_Seg + Pro_Seg + Phase_Seg1 + Phase_Seg2)

关于滤波器数量:

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

在这个案例中CAN模块的时钟源为PCLK1,为170MHz。
在这里插入图片描述
如下图是在CAN使用上图的时钟源的情况下配置125Kbps的波特率,配置为传统CAN模式的情况,作为传统CAN模式,参数DataPrescaler 、DataSyncJumpWidth 、DataTimeSeg1 、DataTimeSeg2没有作用。
在这里插入图片描述

测试代码


/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_FDCAN1_Init();/* USER CODE BEGIN 2 */HAL_FDCAN_Start(&hfdcan1);//CAN2.0B 拓展帧消息发送FDCAN_TxHeaderTypeDef TxHeader;uint8_t TxData[8];TxHeader.Identifier = 0x321;TxHeader.IdType = FDCAN_EXTENDED_ID;TxHeader.TxFrameType = FDCAN_DATA_FRAME;TxHeader.DataLength = FDCAN_DLC_BYTES_8;TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;TxHeader.BitRateSwitch = FDCAN_BRS_OFF;TxHeader.FDFormat = FDCAN_CLASSIC_CAN;TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;TxHeader.MessageMarker = 0;TxData[0] = 0x00;TxData[1] = 0x01;TxData[2] = 0x02;TxData[3] = 0x03;TxData[4] = 0x04;TxData[5] = 0x05;TxData[6] = 0x06;TxData[7] = 0x07;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(200);if (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) > 0){if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK){Error_Handler();}}}/* USER CODE END 3 */
}

运行结果:
在这里插入图片描述
如图为CANH对CANL的波形,发送端接了120欧姆的终端电阻,接收测悬空,在接收测测量。(主要是我还没有看到为什么不接CAN隔离芯片或者没有给CAN隔离芯片上电的情况下测不到发送出来的波形。)
在这里插入图片描述

CANFD过滤器配置有个FDCAN_FILTER_RANGE_NO_EIDM,其中EIDM是扩展ID屏蔽寄存器

/** @defgroup FDCAN_filter_type FDCAN Filter Type* @{*/
#define FDCAN_FILTER_RANGE         ((uint32_t)0x00000000U) /*!< Range filter from FilterID1 to FilterID2                        */
#define FDCAN_FILTER_DUAL          ((uint32_t)0x00000001U) /*!< Dual ID filter for FilterID1 or FilterID2                       */
#define FDCAN_FILTER_MASK          ((uint32_t)0x00000002U) /*!< Classic filter: FilterID1 = filter, FilterID2 = mask            */
#define FDCAN_FILTER_RANGE_NO_EIDM ((uint32_t)0x00000003U) /*!< Range filter from FilterID1 to FilterID2, EIDM mask not applied */

在这里插入图片描述

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

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

相关文章

拓扑排序软件设计——ToplogicalSort_app(含有源码、需求分析、可行性分析、概要设计、用户使用手册)

拓扑排序软件设计 前言1. 需求分析2. 可行性分析2.1 简介2.2 技术可行性分析2.2.1 技术实现方案2.2.2 开发人员技能要求2.2.3 可行性 2.3 操作可行性分析2.4 结论 3. 项目报告3.1 修订历史记录3.2 软硬件环境3.3 需求分析3.4 详细设计3.4.1 类设计3.4.2 核心流程描述3.4.3 核心…

Spring Cloud LoadBalancer基础知识

LoadBalancer 概念常见的负载均衡策略使用随机选择的负载均衡策略创建随机选择负载均衡器配置 Nacos 权重负载均衡器创建 Nacos 负载均衡器配置 自定义负载均衡器(根据IP哈希策略选择)创建自定义负载均衡器封装自定义负载均衡器配置 缓存 概念 LoadBalancer(负载均衡器)是一种…

2023年数维杯国际大学生数学建模挑战赛

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 cs数模团队在数维杯前为大家提供了许多资料的内容呀&#xff0…

Redis应用之二分布式锁2

一、前言 前一篇 Redis应用之二分布式锁 我们介绍了使用SETNX来实现分布式锁&#xff0c;并且还遗留了一个Bug&#xff0c;今天我们对代码进行优化&#xff0c;然后介绍一下Redisson以及数据库的乐观锁悲观锁怎么用。 二、SetNX分布式锁优化后代码 RedisService.java Inven…

基于ssm+vue协同过滤算法的电影推荐系统

基于ssmvue协同过滤算法的电影推荐系统 摘要 电影推荐系统在信息技术发展的背景下日益成为研究的焦点&#xff0c;本研究基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;框架与Vue.js技术&#xff0c;以协同过滤算法为核心&#xff0c;旨在构建一种高效、准确的电影…

JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)

1. jinfo (base) PS C:\Users\zishi\Desktop> jinfo Usage:jinfo <option> <pid>(to connect to a running process)where <option> is one of:-flag <name> to print the value of the named VM flag #输出对应名称的参数-flag [|-]<n…

C语言--1,5,10人民币若干,现在需要18元,一共有多少种?

今天小编给大家分享一下穷举法的一道典型例题 一.题目描述 1,5,10人民币若干,现在需要18元,一共有多少种? 二.思路分析 总共有18块钱&#xff0c;设1元有x张&#xff0c;5元有y张&#xff0c;10元有z张&#xff0c;则有表达式&#xff1a;x5y10z18&#xff0c;穷举法最重要的…

Java事务详解

一、事务的理解&#xff1a; 1、事务的特性&#xff1a; 1) 原子性&#xff08;atomicity&#xff09;&#xff1a;事务是数据库的逻辑工作单位&#xff0c;而且是必须是原子工作单位&#xff0c;对于其数据修改&#xff0c;要么全部执行&#xff0c;要么全部不执行。 2) 一致性…

大数据之LibrA数据库系统告警处理(ALM-12033 慢盘故障)

告警解释 系统每一秒执行一次iostat命令&#xff0c;监控磁盘I/O的系统指标&#xff0c;如果在60s内&#xff0c;svctm大于100ms的周期数大于30次则认为磁盘有问题&#xff0c;产生该告警。 更换磁盘后&#xff0c;告警自动恢复。 告警属性 告警ID 告警级别 可自动清除 1…

vue,react虚拟dom

Virtual DOM 前言 在传统的Web开发中&#xff0c;直接操作真实的DOM通常是一个昂贵且低效的操作。为了解决这个问题&#xff0c;Virtual DOM&#xff08;虚拟DOM&#xff09;被引入为一个中间层&#xff0c;允许开发者在内存中进行操作&#xff0c;从而避免频繁且不必要的真实D…

什么是代理IP池?真实测评IP代理商的IP池是否真实?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

“第六十七天”

各位&#xff0c;昨天查找子串的方法想起来了&#xff0c;就是那个KMP算法......自己理解都有点困难&#xff0c;还看看能不能想一下&#xff0c;确实很困难啊。 不要忘了toupper函数和tolower函数不是直接改变字符的大小写&#xff0c;而是返回对应的大小写的值&#xff0c;需…

文件上传 [ACTF2020 新生赛]Upload1

打开题目&#xff0c;发现是一道文件上传题目 随便上传个一句话木马上去 发现网站前端有白名单限制&#xff0c;只能上传含有jpg&#xff0c;png&#xff0c;gif的后缀文件 那我们便传个2.jpg的一句话木马上去&#xff0c;bp抓包 我们改成php文件后缀试试&#xff0c;发现重发…

毕业设计项目:基于java+springboot的共享单车信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

【学习辅助】Axure手机时间管理APP原型,告别手机控番茄任务模板

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;时间管理、系统工具 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为「手机时间管理」APP原型&#xff0c;…

Redis集群,你真的学会了吗?

目录 1、为什么引入集群 1.1、先来了解集群是什么 1.2、哨兵模式的缺陷 引入集群解决了什么问题 1.3、使用集群&#xff0c;如何存储数据 2、三种主流的分片方式【经典面试题】 2.1、哈希求余算法 2.1.1、哈希求余算法的介绍 2.1.2、哈希求余算法如何扩容 2.2、一致性…

C# 并发编程

C# 并发编程 前言 对于现在很多编程语言来说&#xff0c;多线程已经得到了很好的支持&#xff0c; 以至于我们写多线程程序简单&#xff0c;但是一旦遇到并发产生的问题就会各种尝试。 因为不是明白为什么会产生并发问题&#xff0c;并发问题的根本原因是什么。 接下来就让…

vcomp120.dll丢失怎么办?vcomp120.dll丢失的解决方法分享

vcomp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;下面我将为大家介绍四个修复vcomp120.dll丢失的方法。 一、使用dll修复程序修复 可以通过百度或许…