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

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

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

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

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

            CAN总线-位时序、波特率、采样点_第1张图片

 

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

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;
CAN_InitStructure.CAN_Prescaler=5;

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

CAN_Init(&CAN_InitStructure);

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

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

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

CAN_BS2:时间段2

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可以有不同的组合,不同的组合采样点不同。

 

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

采样点:

                   CAN总线-位时序、波特率、采样点_第2张图片         

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

 

波特率:

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

 

                                                   

 

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

                    CAN总线-位时序、波特率、采样点_第3张图片

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

 

 

 

 

 

你可能感兴趣的:(CAN总线相关)