IMX6ULL中CAN总线的传输速率设置计算

2024-03-24 00:36

本文主要是介绍IMX6ULL中CAN总线的传输速率设置计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.  简介

前面文章学习了 CAN总线的协议,位时序。

本文来学习 IMX6ULL中CAN总线的传输速率设置计算。是通过设置寄存器设置值,通过计算分频公式来计算分频值,通过速率计算公式来计算传输速率。

二.  IMX6ULL中CAN总线的传输速率设置计算

1.  I.MX6ULL的 CAN

I.MX6ULL 带有 CAN 控制器外设,叫做 FlexCAN FlexCAN 符合 CAN2.0B 协议。 FlexCAN 完全符合 CAN 协议,支持标准格式和扩展格式,支持 64 个消息缓冲。
I.MX6ULL 自带的 FlexCAN 模块特性如下:
①  支持 CAN2.0B 协议,数据帧和遥控帧支持标准和扩展两种格式,数据长度支持 0~8 节,可编程速度,最高 1Mbit/S
②  灵活的消息邮箱,最高支持 8 个字节。
③  每个消息邮箱可以配置为接收或发送,都支持标准和扩展这两种格式的消息。
④  每个消息邮箱都有独立的接收掩码寄存器。
⑤ 强大的接收 FIFO ID 过滤。
⑥ 未使用的空间可以用作通用 RAM
⑦ 可编程的回测模式,用于进行自测。
⑧ 可编程的优先级组合。
……
FlexCAN 支持四种模式:正常模式 (Normal) 、冻结模式 (Freeze) 、仅监听模式 (Listen-Only) 回环模式 (Loop-Back) ,另外还有两种低功耗模式:禁止模式 (Disable) 和停止模式 (Stop)

①  正常模式 (Normal)
在正常模式下, FlexCAN 正常接收或发送消息帧,所有的 CAN 协议功能都使能。
②  冻结模式 (Freeze)
MCR 寄存器的 FRZ 位置 1 的时候使能此模式,在此模式下无法进行帧的发送或接收, CAN 总线同步丢失。
③  仅监听模式 (Listen-Onley)
CTRL 寄存器的 LOM 位置 1 的时候使能此模式,在此模式下帧发送被禁止,所有错误 计数器被冻结, CAN 控制器工作在被动错误模式,此时只会接收其他 CAN 单元发出的 ACK 息。
④  回环模式 (Loop-Back)
CTRL 寄存器的 LPB 位置 1 的时候进入此模式,此模式下 FlexCAN 工作在内部回环模式,一般用来进行自测。从模式下发送出来的数据流直接反馈给内部接收单元。

2.  IMX6ULL中CAN总线的传输速率设置计算

前面在讲解 CAN 协议的时候说过 CAN 位时序, FlexCAN 支持 CAN 协议的这些位时序,
控制寄存器 CTRL 用于设置这些位时序。 CTRL 寄存器中的 PRESDIV PROPSEG PSEG1
PSEG2 RJW 5 个位域用于设置 CAN 位时序。

分频值计算公式

PRESDIV CAN 分频值,也即是设置 CAN 协议中的 Tq 值,公式如下:

 

fCANCLK 为 FlexCAN 模块时钟,这个根据时钟章节设置即可,设置好以后就是一个定值,因此,只需要修改 PRESDIV 即可修改 FlexCAN Tq 频率值。

Tq 定了以后,我们结合时序图 中的 几个段来看一下如何设置 FlexCAN 的速率:
SS 同步段 (Synchronization Segment) ,在 I.MX6ULL 参考手册中叫做 SYNC_SEG ,此段固 定为 1 Tq 长度,因此不需要我们去设置。
PTS 传播时间段 (Propagatin Segment) FlexCAN CTRL 寄存器中的 PROPSEG 位域设 置此段,可以设置为 0~7 ,对应 1~8 Tq
PBS1 相位缓冲段 1(Phase Buffer Segment 1) FlexCAN CRTL 寄存器中的 PSEG1 位域 设置此段,可以设置为 0~7 ,对应 1~8 Tq
PBS2 :相位缓冲段 2(Phase Buffer Segment 2) FlexCAN CRTL 寄存器中的 PSEG2 位域设置此段,可以设置为 1~7 ,对应 2~8 Tq
SJW 再同步补偿宽度 (reSynchronization Jump Width) FlexCAN CRTL 寄存器中的 RJW位域设置此段,可以设置 0~3 ,对应 1~4 Tq
FlexCAN CAN 位时序如下图 所示:

根据上图 所示, SYNC+SEG+(PROP_SEG+PSEG1+2)+(PSEG2+1) 就是总的 Tq ,因此,FlexCAN 的波特率就是:

关于 I.MX6ULL FlexCAN 控制器就讲解到这里,如果想更加详细的了解 FlexCAN ,请
参考《 I.MX6ULL 参考手册》的“ Chapter 26 Flexible Controller Area Network(FLEXCAN) ”章节。

这篇关于IMX6ULL中CAN总线的传输速率设置计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840011

相关文章

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu