【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.rhkb.cn/news/190719.html

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

相关文章

Apache Druid连接回收引发的血案

问题 线上执行大批量定时任务&#xff0c;发现SQL执行失败的报错&#xff1a; CommunicationsException, druid version 1.1.10, jdbcUrl : jdbc:mysql://xxx?useUnicodetrue&characterEncodingUTF-8&zeroDateTimeBehaviorconvertToNull,testWhileIdle true, idle …

Java事务详解

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

Vatee万腾外汇数字化策略:Vatee科技决策力的未来引领

在外汇市场&#xff0c;Vatee万腾通过其前瞻性的外汇数字化策略&#xff0c;正引领着科技决策的未来。这一数字化策略的崭新愿景为投资者提供了更智慧、更高效的外汇投资体验&#xff0c;成为科技决策领域的翘楚。 Vatee万腾的外汇数字化策略是科技决策力未来引领的典范。通过运…

消息队列之初识Rabbit及安装

文章目录 一、MQ的相关概念1.什么是MQ&#xff1f;2.为什么要用MQ2.1流量消峰2.2应用解耦2.3异步处理 3.MQ 的分类3.1.ActiveMQ3.2.Kafka3.3.RocketMQ3.4.RabbitMQ 4.MQ 的选择4.1.Kafka4.2.RocketMQ4.3.RabbitMQ 二、RabbitMQ的相关概念1.四大核心概念2.RabbitMQ 核心部分3.Ra…

游戏AI:游戏开发和运营的新增长点

游戏AI&#xff08;Game AI&#xff09;是指在游戏开发运营的过程中模拟人类玩家或创建虚构性对手行为的人工智能技术。游戏AI的目标是增强游戏的互动性、可玩性和挑战性&#xff0c;使游戏中的角色能够智能地做出决策和行为。在游戏的开发和运营过程中使用人工智能技术&#x…

caffe搭建squeezenet网络的整套工程

之前用pytorch构建了squeezenet&#xff0c;个人觉得pytorch是最好用的&#xff0c;但是有的工程就是需要caffe结构的&#xff0c;所以本篇也用caffe构建一个squeezenet网络。 数据处理 首先要对数据进行处理&#xff0c;跟pytorch不同&#xff0c;pytorch读取数据只需要给数据…

【C++】类和对象(2)--构造函数

目录 一 概念 二 构造函数特性 三 默认构造函数 一 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month <…

Qt贝塞尔曲线

目录 引言核心代码基本表达绘制曲线使用QEasingCurve 完整代码 引言 贝塞尔曲线客户端开发中常见的过渡效果&#xff0c;如界面的淡入淡出、数值变化、颜色变化等等。为了能够更深的了解地理解贝塞尔曲线&#xff0c;本文通过Demo将贝塞尔曲线绘制出来&#xff0c;如下所示&am…

DevChat:开发者专属的基于IDE插件化编程协助工具

DevChat&#xff1a;开发者专属的基于IDE插件化编程协助工具 一、DevChat 的介绍1.1 DevChat 简介1.2 DevChat 优势 二、DevChat 在 VSCode 上的使用2.1 安装 DevChat2.2 注册 DevChat2.3 使用 DevChat 三、DevChat 的实战四、总结 一、DevChat 的介绍 在AI浪潮的席卷下&#x…

基于开源项目OCR做一个探究(chineseocr_lite)

背景&#xff1a;基于图片识别的技术有很多&#xff0c;应用与各行各业&#xff0c;我们公司围绕电子身份证识别自动录入需求开展&#xff0c;以下是我的研究心得 技术栈&#xff1a;python3.6&#xff0c;chineseocr_lite的onnx推理 环境部署&#xff1a;直接上截图&#xff…

c语言-数据结构-栈和队列的实现和解析

目录 一、栈 1、栈的概念 1.2 栈的结构 2、栈的创建及初始化 3、压栈操作 4、出栈操作 5、显示栈顶元素 6、显示栈空间内元素的总个数 7、释放栈空间 8、测试栈 二、队列 1、队列的概念 1.2 队列的结构 2、队列的创建及初始化 3、入队 4、出队 5、显示队头、队…

在Spring Boot中使用JTA实现对多数据源的事务管理

了解事务的都知道&#xff0c;在我们日常开发中单单靠事务管理就可以解决绝大多数问题了&#xff0c;但是为啥还要提出JTA这个玩意呢&#xff0c;到底JTA是什么呢&#xff1f;他又是具体来解决啥问题的呢&#xff1f; JTA JTA&#xff08;Java Transaction API&#xff09;是…

CG Magic分享效果图中VRay的灯光设置分析

效果图制作中&#xff0c;一张图VRay效果图好不好看主要看灯光、材质、模型、相机、后期这五点。VRay的灯光设置来说是极为重要的。 VRay灯光设置不好&#xff0c;就会出现vray灯光颜色不能正常显示再或是vray的灯光不亮的问题。 vray的灯光怎么设置才能使效果图展现的更加真实…

LabVIEW中如何在网络上使用远程VI服务器

LabVIEW中如何在网络上使用远程VI服务器 如何在网络上使用远程VI服务器&#xff1f; 解答: 首先&#xff0c;需要在远程的计算机上打开一个在VI服务器上的LabVIEW应用程序的引用。这可以通过“Open ApplicationReference“函数实现。然后用“Open VI Reference”函数打开一个…

外贸开发信邮箱如何选?群发邮件有效技巧?

外贸开发信邮箱用哪种好&#xff1f;QQ邮箱群发邮件怎么发&#xff1f; 一个有效的外贸开发信邮箱可以帮助您建立联系、推销产品&#xff0c;并与潜在客户进行沟通。在本文中&#xff0c;蜂邮EDM将分享一些关于如何选择外贸开发信邮箱的建议&#xff0c;以确保您能够与全球客户…

大数据-玩转数据-Flume

一、Flume简介 Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集、聚集、移动的服务,Flume只能在Unix环境下运行。Flume基于流式架构,容错性强,也很灵活简单。Flume、Kafka用来实时进行数据收集,Spark、Flink用来实时处理数据,impala用来实时查询。二、Flume…

计算机视觉:使用opencv实现银行卡号识别

1 概述 1.1 opencv介绍 OpenCV是Open Source Computer Vision Library&#xff08;开源计算机视觉库&#xff09;的简称&#xff0c;由Intel公司在1999年提出建立&#xff0c;现在由Willow Garage提供运行支持&#xff0c;它是一个高度开源发行的计算机视觉库&#xff0c;可以…

ESP32 C3 smartconfig一键配网报错

AP配网 在调试我的esp32c3的智能配网过程中&#xff0c;发现ap配网使用云智能App是可以正常配置的。 切记用户如果在menu菜单里使能AP配网&#xff0c;默认SSID名字为adh_PK值_MAC后6位。用户可以修改这个apssid的键值&#xff0c;但是要使用云智能app则这个名字的开头必须为ad…

电源基础元件

文章目录 电源基础元件理想电压源理想电流源受控电源 电源基础元件 理想电压源 定义 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源 理想电压源的电压、电流关系 1.电源两端电压由电源本身决定&#xff0c;与外电路无关&…

windows安装nginx

一、下载安装Nginx 1、官网下载地址&#xff1a;nginx: download 2、下载教程&#xff1a;选择最新的Stable version&#xff08;稳定版本&#xff09;下载到本地 3、下载完成后&#xff0c;解压放入本地非中文的文件夹中&#xff1a; 4、启动nginx&#xff1a;切勿直接双击n…