NXP MCU CAN波特率(位时间)配置详解

2023-05-16

1. 概述

本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。

波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。

我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些:
在这里插入图片描述

下文会介绍每个参数的作用和如何进行配置。

本文的大多数内容都来自NXP官方应用手册《CAN Bit Timing Requirements》,下载链接

https://www.nxp.com/docs/en/application-note/AN1798.pdf

2. 一个位时间的构成

一个CAN数据位有以下四个段,采样点位于 PHASE_SEG1和 PHASE_SEG2的交界处。一个位时间(Tnbt)就等于四个段之和

在这里插入图片描述
每个段又包含若干个Tq(Time Quantum),Tq就是一个CAN外设时钟周期。如下图所示,系统时钟经过分频输入给CAN外设,分频系数可配置,每个段包含的Tq数量也可配置(同步段SYNC_SEG除外,固定为1个Tq)。
在这里插入图片描述
各个段包含的Tq数量要求如下表所示:
在这里插入图片描述
其中PHASE_SEG2段中引用了一个时间参数IPT(Information Processing Time ),通常情况下,IPT为2个Tq,但有两个特殊情况:

  • TOUCAN模块:当CAN外设始终频率等于系统时钟频率时(分频系数为1),IPT=3Tq。
  • MCAN模块:当采用3个采样点的时候,IPT=3Tq。

所以,PHASE_SEG2的Tq数量最小为2,如果PHASE_SEG1或IPT大于2,那么取二者之间的较大值。

3. 同步机制

总线上的每个节点在开始接收信号的时候都需要进行时间同步,因为不同节点间的时钟可能有少许差别。
同步方式有以下两种:

  • 硬件同步:仅发生在帧起始阶段的总线电平从隐性位向显性位转变的时刻。
  • 重同步:发生在CAN帧的后续传输过程中,如果在一个位时间段内的除了同步段的其它段上发生了隐性位到显性位的转变,节点就需要进行重同步。

硬件同步不需要过多解释,我们主要来说一下重同步的机制和作用。

理想状态下,两个节点的时钟完全同步,每个位信号应该像下图一样是对齐的:
在这里插入图片描述

但通常情况下两个节点的时钟可能出现偏差,可能出现如下图所示的状况:
在这里插入图片描述

节点B比节点A晚了4个Tq,B发送的信号位的同步段在A信号的同步段之后、采样点之前,这种情况下就可能会导致两个节点采样值不准,所以A要采取重同步来避免采样偏差,方法是增加 PHASE_SEG1 的长度,B晚了几个Tq,A的PHASE_SEG1 就增加几个Tq(在重同步限制范围内),结果如下:

在这里插入图片描述

这样就可以使得两个节点的采样点处于同一位置。

上面说的是B发的晚了的情况,还有下面这种B发的早了的情况:

在这里插入图片描述
当A的上一个位信号还没有发完的时候(采样点之后),就接到了B发送的新的位信号,这时A要进行重同步,是得两个节点的采样点尽可能接近。方法是缩短上一个位信号的PHASE_SEG2阶段,其实就是立即开始下一个位信号:
在这里插入图片描述
需要注意几点:

  • 重同步的Tq数量是有限制的,称为重同步跳变宽度(re-synchronisation jump width),记为RJWSJW。重同步跳变宽度最大不超过4,同时不能超过PHASE_SEG1的Tq数量,最小为1,在此范围内尽可能的选比较大的值。所以通常选择为4和PHASE_SEG1的Tq数量中的较小值。
  • 重同步只发生在隐性位向显性位的跳变沿。
  • CAN自带位填充策略,每出现5个连续的极性相同的位,就会填充一个极性相反的位。所以最恶劣情况下每10位会发生一次重同步(5个显性位+5个隐性位)。

4. 传播延迟

位时间中一个PROP_SEG - 传播延迟段(Propagation Delay Segment)

由于网络上的延迟(CAN收发器延迟和总线电平传输延迟),节点A发出的位信号需要经过一段时间之后才能到达节点B,反之亦然。总线上的两个节点有可能同时开始发送一帧报文,利用总线仲裁机制决定谁获取总线控制权,如下图所示:

在这里插入图片描述

T1时刻A开始发送一个位信号,经过总线延迟,在T6时刻到达B,延迟时间为Tprop(A,B);B在T2时刻开始发送一个位信号,此时因为A发送的信号还没有到达B,对于B来说总线仍处于空闲状态,所以可以发送报文。B发送的信号在T3时刻开始到达A,延迟时间为Tprop(B,A),因为节点需要在发送信号的同时回读总线电平,来判断自己是否获取总线控制权,所以要确保A回读总线信号(即采样点)时,B的信号已到达A。所以在传播延迟段不允许进行采样,这就是传播延迟段的作用。如果是单采样点,那么采样点应位于PHASE_SEG1和 PHASE_SEG2之间,如果是3个采样点,那么其余两个采样点应位于PHASE_SEG1的其它时刻。

在上图中,尽管B的采样点位于A发送的位信号的结束时间之后,但由于传播延迟,B依然可以正确回读到A发送的位信号。

传播延迟时间取决于两个节点CAN收发器的延迟和总线长度,即:

在这里插入图片描述
为了确保两个节点间通信采样正确,传播延迟段的时间应为:
在这里插入图片描述
当两个节点物理收发器电气特性相似时即为:
在这里插入图片描述
传播延迟段所包含的Tq数量PROP_SEG最小为:
在这里插入图片描述
其中 ROUND_UP()是向上取整。

5. 晶振容差(Oscillator Tolerance)

在这里插入图片描述
上面的公式中,Fn是标准频率,F是实际频率,δF是晶振容差。

在一个合格的CAN网络中,必须保证处于总线两端(距离最远)的两个节点在拥有最恶劣晶振容差的情况下能够正常通信,即每次采样都可以采到正确值。

在上述两个节点的正常通信过程中,晶振容差的需求如下列公式所示:

在这里插入图片描述
2*δF代表两个节点的晶振差别分别处于两个极端,乘10是因为最恶劣情况下是10个位信号会进行一次重同步,再乘以一个位时间(Tnbt),就可以的带最恶劣情况下两个节点位信号的时间偏差,这个偏差要小于重同步最大允许时间Trjw。

除了上面正常通信的情况,还需要考虑总线出现error时候的状况。

在CAN总线中,如果一个节点A检测到一个内部错误(以填充错误为例,即连续检测到6个相同极性位),就会向总线发送一个Error Flag,Error Flag是6个显性位,总线上其它节点如果之前也检测到了总线填充错误,则会同时向总线发送Error Flag,这种情况称为全局错误;如果其它节点之前没有检测到填充错误,那么当节点A发送了Error Flag后,其它节点会检测到这个Error Flag,并紧跟着发送一个Error Flag作为回应,这种情况称为节点A本地错误

节点A可以通过自己发送完Error Flag后,总线上是否有其它节点发送Error Flag来判断是发生了全局错误还是本地错误。因此就要求节点A在连续6个显性位(Error Flag)后依然能够正确采样接下来的至少一个位信号。而出发Error Flag的错误情况可能是之前检测到了连续6个显性位,出现填充错误,这时节点A就会有6+6个位时间不能进行重同步,而下一个位信号的采样点位于PHASE_SEG1和PHASE_SEG2之间,因此可以得到下面的公式:
在这里插入图片描述

红框中的含义是12个位时间+下一个位时间的前3个段,即13个位时间减去最后一个段PHASE_SEG2。
左侧计算得到的是第13个位信号的采样点偏差时间,该时间要小于PHASE_SEG1和PHASE_SEG2中的较小值,才能保证采样点落在其它节点发送的第13个位信号的PHASE_SEG1和PHASE_SEG2上。

6. 位时间相关参数的计算步骤

(1)计算PROP_SEG段的最小时间

依据上文传播延迟段计算公式(8),先算出传播延迟段的最小允许时间。

(2)选择CAN外设频率

根据输入给CAN外设的系统始终频率,确定分频系数,使得CAN外设始终频率满足:每个位时间包含8~25个Tq。常用的两个值是8和16.

(3)计算PROP_SEG段包含的Tq数量

根据公式(9)计算出PROP_SEG段包含的Tq数量,如果数量超过8,那么返回步骤(2),选择更大的分频系数,使得CAN外设频率降低,Tq时间增长,以降低PROP_SEG段的Tq数量。

(4)确定PHASE_SEG1和PHASE_SEG2的Tq数量

根据上面的计算,我们可以得到每个位时间包含的Tq总数量,以及PROP_SEG段的Tq数量,我们还知道同步段SYNC_SEG固定为1个Tq,所以我们可以得到剩下了多少个Tq,留给PHASE_SEG1和PHASE_SEG2两个段,据此确定两段的Tq数量就可以了。

分为以下几种情况:

  • 如果剩余Tq数量小于3,由上文(第2节)我们可以知道PHASE_SEG1最小为1,PHASE_SEG2最小为2,因此该情况下不能满足要求,需要返回步骤(2)选择更大的CAN外设频率,增加总Tq数量。
  • 如果剩余Tq数量等于3,那么PHASE_SEG1为1,PHASE_SEG2为2,此时只能采用单个采样点。
  • 如果剩余Tq数量大于3且为奇数,那么给PROP_SEG段加一,剩余的均分给PHASE_SEG1和PHASE_SEG2。
  • 如果剩余数量大于3且为偶数,直接均分给PHASE_SEG1和PHASE_SEG2.

(5)确定RJW(SJW)的Tq数量

RJW取4和PHASE_SEG1中的较小值。

(6)计算晶振容差

依据公式(10)和(11)来计算晶振容差是否满足要求。

如果PHASE_SEG1 > 4,建议重新选择一个更大的CAN时钟分频系数,缩短Tq,否则会影响晶振容差。反之亦然:如果PHASE_SEG1 < 4,建议重新选择一个更小的CAN时钟分频系数,只要确保PROP_SEG ≤ 8即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NXP MCU CAN波特率(位时间)配置详解 的相关文章

  • CAN与CANOpen(一)

    CAN与CANOpen 一 基本概念 CAN与CANOpen 二 报文格式 CAN与CANOpen 三 错误处理 CAN与CANOpen 四 CANOpen对象字典 CAN与CANOpen 五 PDO和SDO CAN与CANOpen 六 网
  • MCP2515独立控制器

    1 简介 MCP2515 是一款独立控制器局域网络 Controller Area Network CAN 协议控制器 完全支持 CAN V2 0B 技术规范 该器件能发送和接收标准和扩展数据帧以及远程帧 MCP2515 自带的两个验收屏蔽
  • UDS应用层协议解析(史上最全)

    UDS应用层协议解析 UDS应用层协议解读 下 诊断服务分类 基础服务类 0x10 诊断会话模式 任何会话模式切换至默认会话模式时 非默认会话模式下设置的状态需要reset 28服务 85服务设置的状态需要恢复至默认状态 27服务解锁状态需
  • VL6180X传感器驱动

    vl6180x i2c c I2C通信 获取VL6180x地址 可以知道7位地址为0x29 写 0x52 读 0x53 写入数据 通过I2C总线向某一寄存器写入一个字节数据 成功 0 失败 1 uint8 VL6180X WriteByte
  • CAN/CANFD 总线负载率及计算(源码和工具)

    CAN BUS的总线负载率是CAN总线架构协议设计时的一个重要的指标 一般建议负载率峰值不要高于80 平均负载率不要超过50 当然这只是一般建议 具体根据使用场景和系统设计而定 负载率定义 关于CAN负载率的定义和计算 很多文章写得不求甚解
  • ESP32S3学习——SPIFFS 文件系统

    芯片 esp32s3 开发环境 espidfv4 4 一 官网相关资料 1 简介 SPIFFS 是一个用于 SPI NOR flash 设备的嵌入式文件系统 支持磨损均衡 文件系统一致性检查等功能 2 说明 目前 SPIFFS 尚不支持目录
  • STM32 CAN通信的学习笔记总结(从小白开始)

    知识来源于互联网 回馈于互联网 目录 1 总体概述 1 1 基本概念 1 2 通讯方式 1 3 为什么使用CAN 1 4 CAN的协议及组成 2 上帝视角看CAN的通讯过程 2 1 数据传输原理实现 2 2 通信的整个过程 2 2 1 空闲
  • 【ISO14229_UDS_0x23服务详解】

    目录 1 0x23服务 根据地址读取内存服务 2 请求报文格式 2 1 请求报文定义 2 2 请求报文中子函数参数定义 2 3 请求报文中数据参数定义 3 肯定应答报文 3 1 肯定应答报文格式定义 3 2 肯定应答报文数据参数定义 4 支
  • Esp8266 Node Mcu 一直乱码的问题详解

    最近一直在做项目 遇到的这个问题花了我很长时间 因此在这里写出自己的经历供大家参考 喜欢的可以点个赞 比较简单的方案 在Arduino上设置Node Mcu 1 打开文件 gt 首选项 复制这样一个网址 http arduino esp82
  • 基于STM32的IAP技术分享

    基于STM32的IAP技术分享 1 烧录过程说明 2 厂家bootloader 3 bootloader区和APP区空间划分 4 bootloader区和APP程序内容说明 5 实验 5 1实验所用到的上位机软件 5 2 bootloade
  • HardFault_Handler问题查找方法

    一 程序进入HardFault Handler 可能原因 1 内存溢出 常见的于数组访问越界 2 堆栈溢出 堆栈设置过小等 二 排查方法 方法1 出现该情况后 可首先查看LR寄存器中的值 确定当前使用堆栈为MSP或PSP 1 打开寄存器窗口
  • 通过Keil如何查看MCU的RAM与ROM使用情况

    概述 在很多偏门MCU 还是使用keil进行开发 开发过程中能免会出现ram rom不够问题 怎么查看呢 下面揭晓答案 一 查看方式 1 编译后 2 通过map查看 方法很简单 鼠标对准红色圈 双击即可 有时 双击不了 只要按照上图配置 此
  • Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

    前言 在数字化时代的今天 数据的存储和管理变得越来越重要 各种各样的存储技术应运而生 以满足不同的使用场景和需求 其中 Flash存储芯片以其非易失性 可擦写性和可编程性等优势 占据了重要地位 本博客将详细介绍Flash存储芯片中的NOR
  • HT1621B液晶驱动(附电路图)

    最近做了一个项目用到了HT1621 电路图 datasheet code HT1621B datasheet include ht1621 h void ht1621 send high order data UCHAR data UCHA
  • STM32F4单片机ADC采样及ARM-DSP库的FFT

    模拟信号经过ADC采样后变成数字信号 数字信号可以进行FFT运算 在频域中更容易分析信号的特征 本文将介绍如何用STM32F4的进行ADC采样 并利用ARMDSP库里的FFT算法对ADC采样值进行快速傅里叶变换 我使用的是STM32F407
  • Air780E

    目录 基础资料 探讨重点 实现功能 硬件准备 软件版本 在雁飞格物平台上创建产品 1 创建产品 2 查看雁飞格物平台接入协议 组成ClientId 组成userName 3 设备鉴权信息 鉴权参数计算 python版 4 MQTT直连雁飞格
  • MSP430F42X系列单片机SD16例程(16位AD采样)

    说明 该驱动程序库包含了常用的16位ADC SD16 操作与控制功能函数 如选择通道 设置信号放大倍数 设置数据格式 基准源输出开关等 以及常用采样函数 包括单通道采样 平均采样 多通道同时采样等 可以作为各种程序的底层驱动使用 要使用该库
  • MCU平台下确定栈空间大小的方法

    本文介绍MCU平台下确定栈空间大小的方法 通常使用IDE开发MCU程序在生成Image文件时 Image文件被划分为代码区 数据区 BSS区 堆区 栈区 其中 代码区 数据区 BSS区空间大小由编译器最终决定 对于MCU 堆区一般设置为0
  • 【MCU简单且容易理解的工作原理】

    SOC是啥 System on Chip 一个芯片 但是片上有好多东西的意思 市面上的AI芯片 包括你知道的麒麟xxx 骁龙xxx等等一些列手机芯片都是SOC 对于SOC设计者来讲 显然要知道码农们码出来的一行行代码是如何在SOC上跑起来的
  • 如何为 Arm Cortex M4 交叉编译 GSL?

    我正在使用带有arm cortex m4的STM32 MCU 并且想要使用gsl 2 7 1 但是 我已经尝试过例如命令 configure prefix home user name gsl arm target arm none eab

随机推荐

  • 本地安装WSL的发行版后,导出到另一台计算机安装的办法

    一 步骤 1 首先你要在你的计算机上安装成功了WSL子系统 xff0c 然后才能导出对应版本的tar文件 xff0c 复制到另一台计算机中进行安装 2 例如我的电脑安装了Ubuntu 20 04 5这个版本 xff0c 如图 xff1a 3
  • Pixhawk基础—认识Pixhawk

    Pixhawk简介 pixhawk是由3DR联合APM小组与PX4小组于2014年推出的飞控PX4的升级版 xff0c 它同时拥有PX4和APM两套固件和相应的地面站软件 该飞控是目前全世界飞控产品中硬件规格最高的产品 Pixhawk基础
  • 关于 adb命令编辑器中无法找到设备:error: device not found 问题的解决办法

    adb命令编辑器中无法找到设备 xff1a error device not found 问题原因解决办法问题来了 解决办法 今天接手一个施乐的设备 xff0c 想要连接到电脑上进行调试 xff0c 调试程序已写好 xff0c 准备用adb
  • LinearLayout中layout_weight属性占比计算方法

    假设一个布局中有三个子布局 xff0c 三个子布局的layout weight属性占比我2 3 4 此时有两种情况 xff1a 1 wrap content比较简单 直接就按比例得了 2 fill content match content
  • 利用POI实现json数据的Excel导出

    首先需要POI jar包 xff0c 相关jar包已经分享到个人网盘 xff0c 有需要可以进行下载 链接 xff1a https pan baidu com s 1N9Cc8UgHuHIMZbWfurmm3w 提取码 xff1a cc6p
  • 基于springboot的简单restful服务demo

    这篇文章主要是本人学习springboot时一个简单的测试demo xff0c 仅供参考 springboot的介绍 xff1a 由Pivotal团队提供的全新框架 xff0c 设计的目的是简化spring新应用搭建的过程 xff0c 使用
  • leetcode刷题 Day23(LRU缓存机制)

    题目 xff1a 思路 xff1a java用LinkHashMap解决 xff0c 在LRUCache中获取缓存容量 xff0c 在put方法中 xff0c 难点在于怎么进行判断最新数据和最不常用的数据 xff0c 这里采取这种办法 xf
  • 野火&洋桃STM32开发版学习指导完整版

    该文章是我历时一个月整理总结而成 xff0c 专门针对想要通过野火 amp 洋桃STM32开发板入门stm32的读者 由于csdn编辑限制 xff0c 该学习指导只包含文字信息 如需查看含图片的完整版可进入我的博客下载页 完整版内容详实 x
  • sumo学习——sumo的路网介绍

    2 sumo路网 这里的记录的内容 xff0c 并不以如何绘制或者如何建立一个路网体系为主 xff0c 而是较为详细的介绍 xff0c 在sumo中是如何定义路网格式的 这里所有的内容都是来自于sumo的软件说明翻译 xff0c 其中部分夹
  • webpack之devtool

    关于Devtool 该选项控制是否以及如何生成源映射 官网上给出的可选值有 xff1a 其中一些值适合开发 xff0c 一些用于生产 对于开发 xff0c 您通常需要快速的Source Maps xff0c 以bundle的大小为代价 xf
  • 汽车UDS诊断详解及Vector相关工具链使用说明——总述

    1 什么是诊断 车辆在运行过程中 xff0c 不可避免地会发生一些故障 xff0c 为了确保行车安全 xff0c 我们要求车上的ECU能够实时监测部件的运行状态 xff0c 一旦发现异常情况 xff0c 能通过点亮报警灯等方式提示驾驶员 但
  • 汽车UDS诊断详解及Vector相关工具链使用说明——2.2.7 动态定义DID(0x2C)

    1 概述 动态定义DID服务允许诊断仪在ECU内部动态定义一个临时的DID 可以通过该DID读取一段内存的数据 也可以通过改DID一次性读取多个原有DID的数据 动态定义DID既可以是支持22服务的DID 也可以是支持2A服务的周期性读取
  • 关于RTOS中信号量、互斥量、邮箱、消息队列的一些理解

    1 信号量 信号量有两种 xff1a 计数性信号量和二值信号量 xff0c 计数性信号量可以被获取多次 xff0c 二值信号量只有0和1两种状态 xff0c 只能被获取一次 信号量可以用来对资源进行保护 xff0c 防止多个任务同时访问某个
  • 英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

    本系列的其它几篇文章 xff1a 英飞凌 AURIX 系列单片机的HSM详解 xff08 2 xff09 与HSM相关的UCB和寄存器 英飞凌 AURIX 系列单片机的HSM详解 xff08 3 xff09 开发方法 英飞凌 AURIX 系
  • DoIP(一)——基础概念

    1 DoIP概述 DoIP xff08 Diagnostic communication over Internet Protocol xff09 是基于车载以太网的诊断 xff0c 在OSI 七层模型中属于传输层 xff0c 其传输的诊断
  • DoIP(二)——报文类型

    我们上一篇文章提到 xff0c DoIP报头中有两字节的数据类型 xff08 Payload Type xff09 xff0c 代表DoIP报文类型 xff0c 本文就来详细介绍一下每一种报文类型 标准中对报文类型的定义如下 xff1a 数
  • AUTOSAR —— CAN网络管理(CanNm)

    1 网络状态 AUTOSAR网络管理节点内部有两个状态 xff0c 一个是Requested 被请求状态 xff0c 另一个是Released 被释放状态 xff0c 当节点的应用层需要使用总线进行通讯的时候 xff0c 会调用接口使得节点
  • S32K1XX系列单片机 ——(1)开发环境搭建

    本文介绍一下NXP S32系列单片机开发环境的搭建方法 xff0c 分两种 xff1a S32DS和Keil 1 S32DS S32DS是NXP开发的一款IDE xff0c 编译器是GCC xff0c 支持Lauterbach P amp
  • AUTOSAR —— S32K144 的 Fls 和 Fee 模块配置

    本文来简要介绍一下如何在EB中配置AUTOSAR Fls和Fee模块 Fls模块是Flash的驱动 xff0c 执行具体的Flash擦写读取等操作 Fee模块的全称是FlashEEPROMEmulation xff0c 即Flash模拟EE
  • NXP MCU CAN波特率(位时间)配置详解

    1 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率 位时间 采样点等属性 波特率即CAN总线传输频率 xff0c 位时间是波特率的倒数 xff0c 例如波特率是500K xff0c 那么位时间 61 1 500000 61 0