其实CAN的波特率计算很简单,但我们无意中把简单的问题复杂化了。
假设不首先考虑BTR0的SJW位和BTR1的SAM位。 BTR0和BTR1是两个分频系数寄存器; 它们的乘积是扩展的分频系数。 也就是说:
(BtR0BtR1=f_base/Fbps(1) () ) ) ) ) ) ) 652
其中:
内部频率基准源F_BASE=Fclk/2,即外部晶体振动频率Fclk的2分频。 在所有应用中,使用外部晶体振动作为基准源时,请注意经过2分频整形。
)式中,普通机翼为16M时,F_BASE=K
正常机翼为12M时,F_BASE=6000K
Fbps是我们想要的CAN总线频率。 单位是k。
式中,设BTR0=m、BTR1=n、外部石英振动频率16M,则如下.
mn=/Fbps(2) )。
这样,当Fbps取期望的值时,得到m * n的组合值。 如果选择了n,则m的值也是唯一的。
n值CAN标准规定为8~25。 (即BTR1的值)基本原则是,Fbps的值越高,n (通过设定BTR1 )的值越大。 其理由不难理解。
在典型的APP应用中,n=10,即
同步段相位缓冲器段1相位缓冲器段2=1 5 4
公式(2)表示
m=800/Fbps
的最大设定值为64,最大分周系数m*n=64x25=。 因此,标准算法通常以16M石英晶体振动为例。 其实,有了公式(1),任何石英振动值(6M~24M )都很容易计算出来。
确定SAM :低频时,SAM=1,即采样3次。 高频为100K以上时,SAM=0,即采样一次。
SJA再同步跳宽选择:与数字锁相环技术有关。 如果选择较大的n值,则可以选择较大的SJA。 也就是说,可以一次修改多个脉冲共享Tscl。 如果n的值较小或频率较低,请选择SJA=1。 也就是说,BTR0.7和BTR0.6都设为0。
问题: 1、中、BTR1中的相位缓冲级1为什么设计了比相位缓冲级2大8个的Tscl? 怪不得应该是一样的。
2、下面例子的BTR0和BTR1的设置有什么问题吗?
BTR0=0x40,BTR1=0x1C。
参数说明:CAN_ByteRate波特率(Kbit/s ) BTR0BTR1*
:*050XBFH0XFFH*
; *1100X67H0X2FH*
; *2200X53H0X2FH*
; *3400X87H0XFFH*
; *4500X47H0X2FH*
; *5800X83H0XFFH*
; *61000X43H0X2FH*
; *71250X03H0X1CH*
; *82000X81H0XFAH*
; *92500X01H0X1CH*
; *104000X80H0XFAH*
; *115000X00H0X1CH*
; *126660X80H0XB6H*
; *138000X00H0X16H*
; *1410000X00H0X14H*
用晶体算出的