CAN总线-位时序、波特率、采样点

9 篇文章 2 订阅 ¥9.90 ¥99.00

CAN总线通讯协议的每一帧可以看作一连串的电平信号,每一个电平信号代表一位(一个字节8位的位),所以一帧中包含了很多个位,由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。

  一位又分为4段,同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)、相位缓冲段 2(PBS2)。

  一位可以当作一条水平的时间轴,不同的段在整个时间轴的占比不一样,每一段又由若干个最小时间单元Time Quantum(以下称为 Tq)构成。

   位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如表 11 所示。1 个位的构成如下图所示

            

 

在stm32的程序配置中,我们要通过位时序设置采样点和波特率。

 
  1. CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

  2. CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;

  3. CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;

  4. CAN_InitStructure.CAN_Prescaler=5;

上面是一个设置的实例,在stm32程序设计中,初始化跟linux编程差不多,利用系统提供的结构体类型对其各个成员赋值,再调用系统的初始化函数。

CAN_Init(&CAN_InitStructure);

该函数参数就是上面配置好参数的结构体。

 
  1. CAN_SJW:上面的表格有解释。(一般为1)

  2.  
  3. CAN_BS1:时间段1(跟表格划分有区别)

  4.  
  5. CAN_BS2:时间段2

  6.  
  7. CAN_Prescaler:这个可以理解为系数,也叫波特率分频器

 

关于采样点和波特率的计算公式:

CAN波特率 = CAN时钟/( (1 + CAN_BS1 + CAN_BS2)  * CAN_Prescaler)
sample = ( 1 +  CAN_BS1) /  (1 +  CAN_BS1 +  CAN_BS2)

如果  CAN时钟为8M,CAN_BS1 = 9,CAN_BS2 = 6,CAN_Prescaler = 5

那么  波特率=8M/(1+9+6)/5=100K

        采样点=(1+9)/(1+9+6)=62.5%

由上面可以看出来,同一波特率条件下,BS1、BS2可以有不同的组合,不同的组合采样点不同。

 

下面是刚才提到的两条公式的推导过程(可以不用理解,记公式即可):

采样点:

                            

      所谓采样点是读取总线电平,并将读到的电平作为位值的点。位置如图所示处。所以从一个位的开始到采样点的时间占一个完整位的总时间的百分比就是所求的值:sample = ( 1 +  CAN_BS1) /  (1 +  CAN_BS1 +  CAN_BS2)。

 

波特率:

波特率是描述串口通讯的速度、速率的指标,指串口每秒传输多少位数据。有此得出波特率与一个位的时间的关系:

 

                                                   

 

设CAN时钟的周期为Tclk,一个时间单元为Tq,正常位时间为Tn,输出波特率为Bcan。

                    

注意:CAN总线通讯的波特率和采样点的设置影响通讯的稳定性和错误率等。上面提到的CAN总线初始化只提到几个参数,关于CAN_InitStructure结构体没有全部说明。

  • 7
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值