CAN总线波特率计算及设置方法(STM32,SJA1000,LPC2292)

 

 

CAN总线波特率计算及设置方法(STM32,SJA1000,LPC2292)_第1张图片

CAN总线波特率计算及设置方法(STM32,SJA1000,LPC2292)_第2张图片

  

 

 

 

  SJA1000  内部频率基准源F_BASE = Fclk/2,即外部晶振频率Fclk的2分频。注意任何应用中,当利用外部晶振作为基准源的时候,都是先经过2分频整形的。

  1.1 位周期的组成

  波特率(fbit)是指单位时间内所传输的数据位的数量,一般取单位时间为1s。波特率由通信线上传输的一个数据位周期的长度(Tbit)决定,如下式所示。

  Fbit=1/Tbit  (1)

  根据Philips公司的独立通信控制器,一个位周期由3个部分组成:同步段(tSYNC_SEG)、相位缓冲段1(tTSEG1)和相位缓冲段2(tTSEG2)。

  Tbit=tSYNC_SEG+tTSEG1+tTSEG2   (2)

  所有这些时间段,都有一个共同的时间单元——系统时钟周期(TSCL)。具体到SJA1000,TSCL由总线时序寄存器的值来确定。SJA1000有2个总线时序寄存器,即总线时序寄存器0(BTR0)和总线时序寄存器1(BTR1)。这2个寄存器有自己不同的功能定义,共同作用决定总线的通信波特率。

  总线时序寄存器0 定义波特率预设值BRP(共6位,取值区间[1,64]和同步跳转宽度SJW(共2位,取值区间[1,4])的值。位功能说明如表1所列。

  表1 

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
SJW.1 SJW.0 BRP.5 BRP.4 BRP.3 BRP.2 BRP.1 BRP.0

  CAN的系统时钟周期TSCL,可以由BRP的数值为决定,计算公式如下:

  TSCL=2×TCLK×BRP=2×TCLK×(32×BRP.5+16×BRP.4+8×BRP.3+4×BRP.2+2×BRP.1+1×BRP.0+1)  (3)

  其中TCLK为参考时间的周期。

  TCLK=1/fCLK  (4)

  为了补偿不同总线控制器的时钟振荡器之间的相位偏移,任何总线控制器必须在当前传送的相关信号边沿重新同步。同步跳转宽度定义了每一位周期可以被重新同步缩短或延长的时钟周期的最大数目。

  tSJW=TSCL×(2×SJW.1+1×SJW.0+1) (5)

  总线时序寄存器1 定义每个位周期长度采样点的位置和在每个采样点的采样数目。位功能说明如表2所列,其中SAM意义见表3。

  表2

bit bit bit bit bit bit bit bit
SAM TSEG2.2 TSEG2.1 TSEG2.0 TSEG1.3 TSEG1.2 TSEG1.1 TSEG1.0

  表3

功  能
SAM 0 三倍:总线采样三次:建议在中/低速总线(A和B级)使用,有处于过滤总线上毛刺
1 单倍:总线采样一次;建议使用在高速总线上(SAEC级)

  TSEG1(共4位,取值区间[1,16])和TSEG2(共3位,取值区间[1,8])决定了每一位时钟数目和采样点的位置。这里

  tSYNC_SEG=1×TSCL(此时间段固定) (6)

  tTSEG1=TSCL×(8×TSEG1.3+4×TSEG1.2+2×TSEG1.1+1×TESG1.0+1)  (7)

  tTSEG2=TSCL×(4×TSEG2.2+2×TSEG2.1+1×TESG2.0+1)  (8)

  位周期的标量值(NBT)定义为,SYNC_SEG(同步段系统时钟周期数)、TSEG1(相位缓冲段1系统时钟周期数)、TSEG2(相位缓冲段2系统时钟周期数)之和。这决定了它的取值区间为[3,25],在1个取样点时,最小值一般取4;在3个取样点时,最小值一般取5。

  NBT=Tbit/TSCL=SYNC_SEG+TSEG1+TSEG2  (9)

  位周期的一般结构如图1所示。

  

  其实CAN的波特率计算特简单,只是我们无意识地把简单的问题复杂化了。
    
     假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2个分频系数寄存器;它们的乘积是一个扩展的分频系数。即:
    
     BTR0×BTR1=F_BASE/Fbps (1)
     其中:
     内部频率基准源F_BASE = Fclk/2,即外部晶振频率Fclk的2分频。注意任何应用中,当利用外部晶振作为基准源的时候,都是先经过2分频整形的。
    (1)式中,当晶振为16M时,F_BASE=8000K
     当晶振为12M时,F_BASE=6000K
     Fbps就是我们所希望得到的CAN总线频率。单位为K。
     设(1)式中BTR0=m,BTR1=n,外部晶振16M,则有:
     m • n =8000/ Fbps (2)
     这样,当Fbps取我们希望的值时,就会得到一个m * n的组合值。当n选定,m值也唯一。
     n值CAN规范中规定8~25。(也就是BTR1的值)基本原则为:Fbps值越高时,选取n(通过设置BTR1)值越大。其原因不难理解。
     我假定一般应用中选取n=10,也就是:
     同步段+相位缓冲段1+相位缓冲段2 =1+5+4
     则(2)式简化为
     m=800/Fbps
    
     m的最大设置值为64,SJA1000最大分频系数m*n=64x25=1600。因此标准算法中通常以16M晶振为例。其实有了公式(1),任何晶振值(6M~24M)都很容易计算。
     SAM的确定:低频时,选SAM=1,即采样3次。高频100K以上时,取SAM=0,即采样1次。
     SJA重同步跳宽选取: 与数字锁相环技术有关。n值选得大时,SJA可以选得大,即一次可以修正多个脉冲份额Tscl。n值小或频率低时,选SJA=1。即BTR0.7和BTR0.6都设为0。
    
  问题: 1、SJA1000中,BTR1中相位缓冲段1为什么设计的比相位缓冲段2大8个Tscl ?按道理应该一样才对。
     2、下例BTR0和BTR1的设置有什么问题?
     BTR0=0x40, BTR1=0x1C。

 参数说明:  

CAN_ByteRate   波特率(Kbit/s)    BTR0     BTR1          *
:*           0              5                 0XBFH     0XFFH           *
;*           1              10                0X67H     0X2FH           *  
;*           2              20                0X53H     0X2FH           *
;*           3              40                0X87H     0XFFH           *
;*           4              50                0X47H     0X2FH           *
;*           5              80                0X83H     0XFFH           *
;*           6              100               0X43H     0X2FH           *
;*           7              125               0X03H     0X1CH           *
;*           8              200               0X81H     0XFAH           *
;*           9              250               0X01H     0X1CH           *
;*           10            400               0X80H     0XFAH           *
;*           11            500               0X00H     0X1CH           *
;*           12            666               0X80H     0XB6H           *
;*           13            800               0X00H     0X16H            *
;*           14           1000              0X00H     0X14H            *  

你可能感兴趣的:(c,算法,扩展)