mykingjin 发表于 2010-3-25 18:58:36

AT90CAN128 CAN波特率为5K,晶振为12M如何计算?

各位专家好

向各位专家请教AT90CAN128 CAN波特率为5K,晶振为12M如何计算CANBT1,CANBT2,CANBT3?

mykingjin 发表于 2010-6-7 14:08:59

经翻译分析英文资料,已解决,供大家参考、如有错误还请大家指正:

CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。
实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。
在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:
A. 位同步时间(Tsync)
B. 时间段1(Tseg1)
C. 时间段2(Tseg2)
其中位同步时间占用1个Tscl;时间段2占用(Tseg1+1)个Tscl;时间段2占用(Tseg2+1)个Tscl,所以CAN控制器的位时间(TBit)就是:
TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl
CAN的波特率 (CANbps)就是1/TBit。Tsync=1Tscl
但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时、不同节点的晶体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。CAN在技术上便引入了重同步的概念,以更好的解决这些问题。
这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转宽度SJW+1),要么时间段减少TSJW,因此CAN的波特率实际上有一个范围:
1/(Tbit+Tsjw) ≤CANbps≤1/(Tbit-Tsjw)
CAN有波特率的值四以下几个元素决定:
A. 最小时间段Tscl;
B. 时间段1 TSEG1;
C. 时间段2 TSEG2;
D. 同步跳转宽度 SJW   
SJW(重同步跳转宽度)决定了一次重同步期间一个位时间被延长或缩短的时间量子
Tscl是通过总线时序寄存器设置计算的。
Tscl=(BRP+1)/FVBP。FVBP为微处理器的外设时钟。
而TSEG1与TSEG2又是怎么划分的呢?TSEG1与TSEG2的长度决定了CAN数据的采样点,这种方式允许宽范围的数据传输延迟和晶体的误差。其中TSEG1用来调整数据传输延迟时间造成的误差,而TSEG2则用来调整不同点节点晶体频率的误差。
TSEG1与TSEG2的是分大体遵循以下规则:
Tseg1≥Tseg2≥2TSJW; Tseg2≥2Tscl
总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为:
BitRate = Fpclk/( (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1))










对于AT90CAN128的波特率:
BRP(0~63);SEG1(0~7); SEG2(0~7); SYNC(0~7);SJW(0~3)

Tbit(1) = Tsyns + Tprs + Tphs1 + Tphs2
1.Tsyns = 1 x Tscl = (BRP+ 1)/clkIO (= 1TQ)
2.Tprs = (1 to 8) x Tscl = (PRS+ 1) x Tscl
3.Tphs1 = (1 to 8) x Tscl = (PHS1+ 1) x Tscl
4.Tphs2 = (1 to 8) x Tscl = (PHS2(2)+ 1) x Tscl
5.Tsjw = (1 to 4) x Tscl = (SJW+ 1) x Tscl

Notes: 1. The total number of Tscl (Time Quanta) in a bit time must be between 8 to 25.
在一个BIT时间内Tscl的总数必须在8到25之间;
2. PHS2 2 is programmable to be maximum of PHS1 and 1.
第二时间段是可控制在第一时间段的最大值和一个BIT时间之间。


AT90CAN128设置
CAN时序寄存器1   CANBT1
BRP5:0   :波特率预定标器
          CAN控制器系统时钟Tscl周期可传播和确定单个位定时。
          Tscl=(BRP+1)/clk frequency   这里是频率的形式,也可化为周期
CAN时序寄存器2   CANBT2
SJW1:0    :重复同步跳转宽度
    为了比较不同总线控制器时钟振荡器间的移相,控制器必须重复同步跳转宽度来定义时钟周期的最大数。一个位周期可由一个重复同步来缩短或者延长。
    Tsjw=Tsclx (SJW+1)
PRS2:0    :传播时间段
    这部分位时间用于补偿网络中的物理延时。它是总线上单个传播时间总和的两倍,输入比较器延时或者输出驱动器延时。
    Tprs=Tsclx (PRS+1)
CAN时序寄存器3   CANBT3
    位6:4——PHS22:0    :段2
    该段用于补偿段界限错误。该段可由重复同步跳转宽度来缩短。
    Tphs2=Tsclx(PHS2+1)
    位3:1——PHS12:0    :段1
    该段用于补偿段界限错误。该段可由重复同步跳转宽度来延长。
    Tphs1=Tsclx(PHS1+1)
    SMP:采样点
    0:一次,在采样点
    1:三次,总线的“三次采样”是采样点和“两次超过Tscl周期1/2的长度”。该结果为三个值的主要判定的响应。

晶振:4MPRS=4,PHS1=PHS2=3,BRP=59,SJW=0
CANBT1=0X76;CANBT2=0X04;CANBT3=0X36

CANGCON|=(1〈〈SWRES〉;//设置为复位模式
CANBT1=0X7E; //设置波特率5k, 8MHz,25TQ, BRP=63
CANBT2=0X2E; //SJW=1,PRS=7
CANBT3=0X7F; //PH2=7,PH1=7

zhangaiminab 发表于 2010-7-1 16:41:01

好复杂啊。。

gonghuashi 发表于 2011-10-11 20:55:09

好贴,学习了

naiqiqnus 发表于 2012-8-18 11:11:01

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}看看

luvemcu 发表于 2012-8-18 15:24:54

mark a kram

antserver 发表于 2013-3-18 16:04:43

文档里面有个表直接查一下

wisdom9285 发表于 2014-1-9 15:08:43

收藏{:biggrin:}
页: [1]
查看完整版本: AT90CAN128 CAN波特率为5K,晶振为12M如何计算?