本人用的单片机是STM32F407,其它型号的单片机类似,可做参考!

一、标准CAN协议位时序概念

由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯。
同时,CAN还使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
为了实现这个位同步,CAN协议将每个位的时序分解为四段:SS段、PTS段、PSB1段、PBS2段。同时定义最小的时间单位:Tq,四个段的长度用x个Tq表示,加起来就是一个位的时序。

用一个图来表示可能会形象一点,如图一个位的时序就是19Tq。

以上就是CAN标准协议定义的位时序,而STM32的外设简化了这个标准。

 二、STM32中CAN总线位时序概念

STM32的CAN外设位时序中只包含3段:同步段SYNC_SEG、位段BS1(合并了PTS段和PSB1段)和位段BS2。

其中SYNC_SEG的长度固定为1Tq,其它两段的长度可在CAN_BTR中设置。

这里我们要注意一个细节,BS1段的时间长度其实是等于我们写入的值+1的,同样BS2段也是。

三、波特率的计算

在设定了BS1段和BS2段的长度后,我们就可以确定每个CAN数据位的长度了。

BS1段时间:Ts1 = Tq * (TSI1[3:0] + 1)
BS2段时间:Ts1 = Tq * (TSI2[2:0] + 1)
一个数据位的时间:T1bit = 1Tq + Ts1 + Ts2

根据一个数据位的时间可知:波特率 = 1/T1bit

这个式子还有Tq一个未知数了。

在CAN外设配置中还有一个与波特率有关的参数是BRP(波特率预分频器)

我使用的STM32F407的CAN1外设是挂载在APB1总线上的,它的默认时钟频率为45M,Tpclk=1/45M。

根据BRP参数的定义:Tq = BRP[9:0] * Tpclk

这样Tq的值就算出来了,带入上面波特率的计算公式就可以求得CAN总线传输的波特率了。

STM32——CAN总线波特率和位时序详解的更多相关文章

  1. STM32 GPIO 配置之ODR, BSRR, BRR 详解

    STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...

  2. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  3. <转>C++位运算详解

    原文转自:http://www.crazycpp.com/?p=82 前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查 ...

  4. i2c总线,核心,驱动详解

    Linux I2C驱动分析(一)----I2C架构和总线驱动 一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串线时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同 ...

  5. Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

    位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面 ...

  6. 基础知识复习(一)——C语言位运算符详解

    常用的位运算符:与(&),取反(~),或(|),异或(^),左移(«),右移(») 1. 与(&)操作符,按位与,全为1 时,结果取1 11001 &10011 结果:1000 ...

  7. C语言位运算详解[转]

    作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...

  8. C语言位运算详解

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...

  9. C语言位运算详解(转载)

    转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...

随机推荐

  1. Spring Boot中报错org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found. Available parameters are [0, 1, param1, param2]的解决办法

    我这里的报错信息显示: org.apache.ibatis.binding.BindingException: Parameter 'reqUsername' not found. Available ...

  2. Cognos Framework操作记录:开发复杂报表

    设计一张数据库的表:TEST_001_ADDRESS 表结构: | 编号 | 姓名 | 省 | 市 | 县 | 公司 | 部门 | 职位 | | ---- | --- | -- | - | - | - ...

  3. Vue学习笔记(四)一起进阶吧

    参考链接地址:https://segmentfault.com/a/1190000009188689?from=timeline Vuex框架原理与源码分析: http://tech.meituan. ...

  4. .NET(C#):判断Type类的继承关系

    //Type类的函数 class Type bool IsInstanceOfType(object); //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOf ...

  5. Dart Language samples

    Hello World Every app has a main() function. To display text on the console, you can use the top-lev ...

  6. 用JavaScript来实现单例模式

    首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  7. windows下libnet ARP

    查找自己的网卡: #include <libnet.h> #include <stdio.h> #include <iostream> #pragma commen ...

  8. sql server新旧数据库的表结构差异

    sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异 问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表. ...

  9. 监听input框变化,即时搜索 compositionstart, compositionend

    前话: 如果直接通过input监听, 它是键盘输入按键按下了就触发时间,这样可能导致一些问题,比如在谷歌浏览器想输入中文输入不了: 解决方案: 用 compositionstart 和 composi ...

  10. 磁盘冗余列阵Raid技术知识与实践

    Raid介绍 什么是Raid?  Raid级别介绍  Raid 技术分类 RAID分为两类: 软RAID, 系统层面实现的,性能差. 硬RAID, 硬件层面实现的,性能好. 主板板载RAID: 功能弱 ...