CAN总线采用的是异步串行通信,也就是没有单独的时钟线来保证各个收发器之间时钟的一致,每个收发器是按事先设置的波特率来对总线上的电平进行分位。因此波特率设置准确对CAN总线的稳定通信来说非常重要。

CAN总线里我们可以通过对CAN 节点里的位定时寄存器的控制来实现不同波特率的通信。CAN协议里将一个位时间分为同步段、传播段、相位缓冲段1和相位缓冲段2。每个段的时间长度都可以用一个整数的基本时间单位表示,该基本时间单位由系统的时钟振荡器分频得到。

同步段位于一个位的起始位置,CAN-bus规定跳变沿为同步信号,但是发送节点发送一个位跟接收节点接收到这个位之间存在网络传播延迟,传播段则是为了补偿这段传播延迟,由于采样点位置在相位缓冲段1跟相位缓冲段2之间,通过设置相位缓冲段1和相位缓冲段2的值,可以调整采样点位置,保证每个位采样点一致。缓冲段的长度调节范围则是由同步跳转宽度(SJW)决定。

图 1 CAN位时间结构图

简单的了解了CAN总线位时间的分段后,我们来看看一个节点的波特率到底要如何设置。如图2是某ARM内核的CAN位时间特性寄存器 (CAN_BTR)。

图 2 某ARM内核位时间特性寄存器结构图

SILM(静默模式)跟LBKM(回环模式)用于调试;

SJW:同步跳转宽度;

TS2/TS1:位时间里两个时间段的分配;

BRP:波特率分频器,该区域定义了基本时间单元的长度;

例如某著名车厂CAN通信标准里规定,通信速率为125 kbps时,应该采用单次采样,采样点位置设置在70%~77%之间。其位定时参数取值可见表1与表2。

表 1 LS_CAN通信速率与采样点参数

表 2 LS_CAN可选时间份额与同步跳转带宽

采样点:采样点不能太靠前也不能太靠后,否则如果刚好处于一个位的上升沿或者下降沿区间,会造成识别错误,所以根据CIA105的规范,采样点在87.5%左右比较合适。但是一般我们可根据实际情况选取75%~85%之间;

同步跳转宽度(SJW):SJW的值直接影响到重同步时相位缓冲段的可调节的范围,SJW的值可以在1~4之间选择,我们选择3、4可以使总线获得更宽的波特率容忍度;

采样次数:分为单次采样跟三次采样,三次采样在设计之初虽然是为了过滤掉总线上毛刺,但是采用三次采样经常会影响SJW的跳转,所以实际应用中我们一般都会采用单次采样。

了解设置波特率的原则后,我们采用ZLG的波特率计算软件,对25kbps波特率的设置参数进行计算,计算结果如图3。

图 3 25kbps波特率计算参数

根据上面提到的原则,我们选取采样点为75%,SJW为4,时间份额为14的一组参数,采用ZLG的CAN卡做验证。

· 自动波特率识别:采用CANScope自动侦测波特率的功能,对CAN卡的波特率进行识别,识别结果为25kbps;

图 4 自动侦测波特率

· 采样点测试:采用CANScope对当前波特率下CAN卡的采样点进行测试,测试结果为75%;

图 5 采样点测试

· 位宽容忍度测试:采用CANScope对当前波特率下CAN卡进行位宽容忍度测试,测试其对波特率的容忍度情况,测试结果为24kbps~26kbps,容忍度情况较好;

图 6 位宽容忍度测试

· 位时间测试:用CANScope的眼图功能对当前波特率下CAN卡进行位时间测试,位时间为40us,与25kbps波特率的位时间相符。

图 7 眼图测试位时间

通过对波特率计算器计算出来的波特率寄存器设置参数进行验证,发现测试结果跟我们的预期结果一致,因此在使用特殊波特率时,我们可以借助波特率计算器来快速计算出位定时寄存器的参数值。下面我们给出一些可参考的特殊波特率的参数:

can 自动波特率 linux,CAN特殊波特率如何计算相关推荐

  1. linux命令设置波特率,Linux设置串口波特率等参数

    stty查看串口参数 stty -F /dev/ttyS0 -a 1 1 查看串口1(/dev/ttyS0)当前的参数,包括波特率.数据位等. stty设置串口参数 stty -F /dev/ttyS ...

  2. linux查看串口波特率

    linux查看串口波特率命令 一,串口概述 在linux中,串口,对应的tty基本都是ttySn(Serial):如果是usb口转串口的基本都是ttyUSBn. 二,命令 a, 查看串口个数,以及这些 ...

  3. 51单片机C语言波特率十六进制,8051单片机波特率计算公式(配套C语言例程)

    8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod/32)×(定时器T1溢出率),其中smod是PCON<7>,表示是否波特率加倍,Fsoc是系统的 ...

  4. 用Kickstart批量安装Linux系统、Kickstart安装,linux批量安装;Linux的Kickstart的 无人值守安装;linux pxe自动安装linux系统...

    用Kickstart批量安装Linux|Kickstart,批量安装:Linux的Kickstart的 无人值守安装:linux pxe自动安装linux系统: KickStart + DHCP + ...

  5. 自动备份Linux上的博客数据到坚果云

    欢迎访问陈同学博客原文 本文主要内容拷贝于这篇文章 备份Linux系统数据到坚果云,自己做了些拓展,感谢作者. 本文分享两个博客相关小技巧,一是自动备份Linux上博客数据到坚果云和本机,二是搭建一个 ...

  6. linux 实现自动安装,基于cobbler 实现自动安装linux系统

    1.安装个组件 yum install epel-rpm-macros.noarch -y #安装epel源 yum install -y cobbler cobbler-web dhcp tftp- ...

  7. 解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面

    解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面 关闭unattended-upgrade 在/etc/apt/apt.conf.d目录下,查找包含Unattended- ...

  8. 全志XR806芯片 串口修改波特率后与目标波特率不匹配如何解决?

    1.问题背景 有客户反应,XR系列MCU在修改完串口波特率后,打印输出的是乱码,通过仪器抓波形发现输出的波特率与设置不一致. 2. 问题描述 串口修改波特率后与目标波特率不匹配. 3. 问题分析 XR ...

  9. linux如何生成网卡配置文件,自动生成Linux网卡配置

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #!/bin/bash #update:2013-02-25 #author:ihuotu ...

  10. FPGA提升串口波特率、QT增加波特率选项的方法

    FPGA提升串口波特率.QT提高波特率支持的方法 ​ 本文主要讲解FPGA计算串口波特率的方法以及QT5对230400以上波特率的支持方法. 1.FPGA提升串口波特率 1.1确定FPGA串口的模块的 ...

最新文章

  1. 成功解决on line , but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
  2. 计组之总线:2、总线仲裁(链式查询、计数器查询、独立请求、分布式查询)
  3. Squeeze Net
  4. sublime text3 3176激活
  5. 台积电股价涨势如虹,将带领台股挑战历史新高!
  6. JAVA 调用Web Service的方法(转)
  7. Android为TV端助力 Canvas 和 Paint用法
  8. PCB板材及生产流程详述
  9. vue项目SEO优化
  10. codevs 5960 信使
  11. 腾讯云TRTC接入测试以及状态同步功能重点验证
  12. 洛谷P1008 [NOIP1998 普及组] 三连击题解
  13. 项目经理(Project Manager)和产品经理(Product Manager),简称PM。
  14. 软件开发V模型--解读
  15. Intel主板H110和B250,Z370的区别
  16. zotero+坚果云实现同步
  17. 汉王科技发布多款AI智能新品,布局服务机器人新赛道
  18. 微软一年后将“断供”XP系统 官网挂出倒计时牌
  19. 英语四级作文计算机,2019年6月英语四级作文范文:电脑
  20. java项目-第103期基于ssm的大学生校园兼职平台管理系统-java毕业设计

热门文章

  1. 视频教程-Matlab小白入门必备教程-Matlab
  2. Excel VBA入门教程
  3. 传智播客毕向东java基础全套视频教程_传智播客毕向东JAVA基础教程全套视频教程(324课)...
  4. excel表格打开是乱码要如何解决?
  5. excel表格乱码修复_修复从数据库复制的空白Excel单元格
  6. java程序设计编程题_JAVA编程题全集100题及答案
  7. SQL注入攻击原理及防御策略
  8. python可视化编程软件下载_mPython-mPython(图形化编程软件)下载 v0.5.0官方版-下载啦...
  9. 计算机毕业设计nodejs宠物寄存管理系统
  10. regexp(正则表达式)的使用