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波特率(位时间)配置详解 的相关文章

  • 合宙Air105

    基于Air105开发板 Air105 LuatOS 文档 上手 开发上手 LuatOS 文档 前文 合宙Air105 摄像头 capture SPI Serial 串口 TFTLCD Micro SD卡 GC032A USB转TTL 官方d
  • MCP2515独立控制器

    1 简介 MCP2515 是一款独立控制器局域网络 Controller Area Network CAN 协议控制器 完全支持 CAN V2 0B 技术规范 该器件能发送和接收标准和扩展数据帧以及远程帧 MCP2515 自带的两个验收屏蔽
  • 串行、并行、同步和异步:通信与数据传输的核心概念及应用举例

    当涉及到通信和数据传输时 串行 并行 同步和异步是一些重要的概念 下面我将为您编写一篇关于这些概念的详细博客文章 串行 并行 同步和异步 通信与数据传输的核心概念 1 串行与并行 串行 Serial 指的是逐个传输数据位 一次只传输一个位
  • CAN/CANFD 总线负载率及计算(源码和工具)

    CAN BUS的总线负载率是CAN总线架构协议设计时的一个重要的指标 一般建议负载率峰值不要高于80 平均负载率不要超过50 当然这只是一般建议 具体根据使用场景和系统设计而定 负载率定义 关于CAN负载率的定义和计算 很多文章写得不求甚解
  • 蓝桥杯嵌入式创建第一个工程(点亮led灯)

    蓝桥杯嵌入式创建第一个工程 点亮led灯 一 keil导入stm32G431RX板级芯片包 1 1 下载板级芯片包 1 2 导入芯片包 1 2 1 我们首先打开keil 点击Pack installer 如图 1 2 2 然后选中file
  • Canoe 安装流程

    硬件 VN5620 软件 CANoe V15 0 软件 Vector License Client 6 2 驱动 Vector Driver Setup license 购买硬件时 vector会分配 参考文档 First Steps to
  • 【ISO14229_UDS_0x23服务详解】

    目录 1 0x23服务 根据地址读取内存服务 2 请求报文格式 2 1 请求报文定义 2 2 请求报文中子函数参数定义 2 3 请求报文中数据参数定义 3 肯定应答报文 3 1 肯定应答报文格式定义 3 2 肯定应答报文数据参数定义 4 支
  • CAN总线的报文分析(三)

    系列文章目录 文章目录 系列文章目录 前言 一 数据帧 最常用 1 帧起始 2 仲裁段 3 控制段 4 数据段 5 CRC段 6 ACK段 7 帧结束 二 远程帧 三 错误帧 四 过载帧 五 帧间隔 总结 前言 CAN总线上的节点发送数据都
  • CAN协议详解-01

    CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519以及ISO11898 是国际上应用最广泛的现场总线之一 差
  • 计算机组成原理--基于Logisim的海明校验码解码电路实验的应用(超详细/设计/实验/作业/练习)

    目录 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Logisim的海明校验码解码电路 一 前言 二 环境与设备 三 内容 四 结果与分析 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Log
  • 第36章_瑞萨MCU零基础入门系列教程之步进电机控制实验

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do
  • STM32F4单片机ADC采样及ARM-DSP库的FFT

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

    目录 基础资料 探讨重点 实现功能 硬件准备 软件版本 在雁飞格物平台上创建产品 1 创建产品 2 查看雁飞格物平台接入协议 组成ClientId 组成userName 3 设备鉴权信息 鉴权参数计算 python版 4 MQTT直连雁飞格
  • SP706_MCU监控芯片

    SP706 MCU监控芯片 说明 SP706R S T系列是微处理器 P 监控电路系列 集成了离散解决方案的无数组件 监控 P和数字系统中的电源和电池 SP706R S T系列的功能包括看门狗定时器 P复置 电源故障比较器和手动重置输入 S
  • 【项目实战】复旦微MCU+RT-thread+Moudbus(1)

    前言 手头存货FM33LC046芯片 复旦微提供的是freertos和rthread nano的例子 一直想使用RTThread完整版 MCU由于ROM有限 项目因此不可能太复杂 怕后期资源不够 第一步 git源码https gitee c
  • GPIO口的八种工作状态

    一直对GPIO的工作状态不是很熟悉 导致在设置IO状态时 经常会设置成推挽上拉 或者推挽下拉 开漏上拉等问题 虽然看起来没有影响MCU工作 但感觉这是一种无知的表现 现在总结下GPIO口的八种工作状态 其中四种输入状态 四种输出状态 一 输
  • STM32 CAN通信理解(是半双工还是全双工?)

    STM32F429 CAN通信 CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519 是国际上应用最广泛的现场
  • MSP430F42X系列单片机SD16例程(16位AD采样)

    说明 该驱动程序库包含了常用的16位ADC SD16 操作与控制功能函数 如选择通道 设置信号放大倍数 设置数据格式 基准源输出开关等 以及常用采样函数 包括单通道采样 平均采样 多通道同时采样等 可以作为各种程序的底层驱动使用 要使用该库
  • 俄罗斯方块游戏(C语言)

    简介 俄罗斯方块 Tetris 是一款经典的游戏 下面是用C语言实现俄罗斯方块的示例代码 code include
  • pico示波器使用

    文章目录 Pico示波器保存波形 Pico示波器录制数据 Pico示波器解析CAN报文 Pico示波器保存波形 Pico示波器可以通过以下步骤保存波形 在示波器上选择要保存的波形 连接示波器到计算机上 可以使用USB或者Ethernet连接

随机推荐

  • 本地安装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