打印
[ZLG-ARM]

转:波特率计算

[复制链接]
3747|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
米其林r|  楼主 | 2010-7-11 12:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于SJA1000的CAN总线波特率设置,网上有很多现成的例子,对其波特率设置方法很有很多参考资料进行了说明,甚至有计算公式和计算软件。从我个人接触SJA1000的经历来讲,这些设置说明的不太容易看懂。
通过近来对AT91 CAN总线驱动程序的研究,发现难点还在CAN总线波特率的设置问题上。仔细翻看了相应的英文说明,和SJA1000波特率设置说明,总算弄明白了。网上关于AT91 的CAN波特率设置资料较少见。


1.
首先要弄明白的一个参数是MCLK:
SJA1000的晶振经典的为16M,实际上12M、8M都可以的,而且我目前用的就是8M。通过设置SJA1000的工作模式(Moto模式或者Intel模式)和分频寄存器CDR,可以设置SJA1000的工作频率,也就是MCLK。在Intel模式下默认为2分频,那么 SJA1000_MCLK = 8M。
AT91 的MCLK 稍复杂一些,如果外部晶振为18.432M,那么经过内部分频和PLL锁相环,最后 AT91_MCLK = (MUL + 1)/DIV。通常设置为48M。

2.然后要弄明白 CAN 总线的预设工作频率:
这里用其倒数来表示,叫做CAN总线时间周期。Tcsc = (BRP+1)/MCLK。其中BRP是预设频率寄存器,在SJA1000中为BTR0的低6位(0<BRT<64);在AT91中为CAN_BR的bit16~bit22(0<BRT<127)。
Tcsc是CAN的工作时钟,对CAN波特率只起部分的决定作用。这个时钟可快可慢,用户可以灵活设置,其大小一般为几个微秒(us)。CAN波特率低的时候BRP大,高的时候BRP小,这个很容易理解。

3.最后计算CAN波特率。
这里仍然先求波特率的倒数 Tbit.
计算公式相当的简单:
Tbit = 1*Tcsc + (1+PROPAG)*Tcsc + (1+PHASE1)*Tcsc + (1+PHASE2)*Tcsc
实际上 Tbit就是有8~25个 Tcsc组成,为什么取8~25,因为CAN协议就是这么规定的。


实际上无论是何种CAN控制器,其Tbit都由四部分组成:同步段 + 补偿段 + 相位缓冲1 +相位缓冲2。这四段就决定了CAN总线波特率。
其中,相位缓冲1和2决定了采样位置,牵涉到另外一个波特率相关的参数SAM,根据SAM为1还是0决定采样1次还是3次,一般取SAM为0即可,其实SAM对波特率的大小没有影响。


下面分别解释这几个段:
同步段:很多翻译的资料或者产品的DataSheet都把这个记为 Tsync,对应的是一个2bit的设置参量:同步跳转宽度Tsjw。这里最容易让人弄混淆,很多资料翻译人自己都没有弄明白。Tsync就是1个Tcsc,这个在CAN2.0B的协议里面有明确的说明,很多情况下Tsync != Tsjw。Tsjw只是一个设置CAN波特率范围的参数,有他无他CAN照样工作。顺便说一下:Tsjw = (1+SJW)Tcsc,显然只能在1~4个Tcsc里面进行选择,不会影响波特率,但会影响同步和延时。
补偿段:在SJA1000里的补偿段没有加以说明,应该是和相位缓冲1合并了。AT91中可以进行设置。协议规定该段取值必须在1和8之间。Tprs = (1+PROPAG)Tcsc。
相位缓冲1:这个好理解,该段结束的地方就是采样的地方。SJA1000中BTR1的高4位中的前3位设置这个。AT91中也对应着3bit。Tphase1 = (1+PHASE1)Tcsc。也必须在1和8个Tcsc之间。
相位缓冲2:这个值不能比Tphase1小。必须取Tphase1和Timf中的大者,但不能小于2。Timf的意义暂时不太清楚。SJA1000中BTR1的低4位设置这个值。AT91中有3bit可以用来设置这个值。Tphase12= (1+PHASE2)Tcsc。
总结:SJA1000_Tbit = (3+PHASE1+PHASE2)Tcsc,AT91_Tbit = (4+PROPAG+PHASE1+PHASE2)Tcsc

相关帖子

沙发
六楼的窗户| | 2010-7-12 22:02 | 只看该作者
数据手册CAN模块会有详细的example

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

340

主题

1587

帖子

3

粉丝