笔记十:同步跳转宽度位域与采样位<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
SJA1000 CAN控制器对时序的设置真的一点也不马虎,到底是怎么样的不马虎法呢?这一篇笔记就让我们听听他的故事。
在总线时序寄存器0和1中,除了对总线的波特率可编程以外,还加了对采样位与同步跳转宽度位域的设置,我们一一的来探索吧:
采样位,也就是对[采样]动作进行设置的标志位,在总线时序寄存器1的最高位,也就是SAM位。
当SAM为逻辑1时,采样的次数为3次,反之SAM为逻辑0,采样次数为1次。这里就存在一个问题,那么什么时候才需要将SAM位置一呢?网络中有这样一个定义,当总线的波特率为中,低等级时,建议将SAM位置一,则当总线波特率为高时SAM位置为0,那么说得比较具体一点的,当总线波特率从100k起为高波特率,波特率从10k~99k之间为中波特率,波特率10k以下为低波特率。(以上的波特率区分等级是从网络中得知的,见笑了)
接下来要探索的就是同步跳转宽度位域,这个专业词听起来很像很可怖似的,但实际上只要明白后会发现到很容易理解的。在CAN 2.0 协议里,CAN使用了同步跳转宽度位域来兼容不同波特率的总线,视觉化的说法就是说,除了本身设定的波特率以外,该波特率还有上限下界的容差值
这些波特率的上限与下界容差换傻瓜的话来说,假设有一个节点将总线时序设置为10kbps,该节点除了支持目前与该它拥有同样总线时序的节点以外,该节点还支持接近总线时序容差值的节点,那么10kbps可以容差值可以假设为10.9kbps,11.2kbps, 9.2kbps , 8.5kbps ...等等,换另一句话来说就是,只要总线时序为
10kbps的节点一设置(启动)同步跳转宽度位域,那么如果其他节点拥有总线时序为9.X kbps的话,都会被节点一相互兼容。
那么控制同步跳转宽度位域的寄存器就是总线时序寄存器0的最高两位 ,SJW.0与SJW.1
同步跳转宽度位域的公式如下:
Tsjw的值是系统时钟Tscl乘于SJW.0~1的设置。(至于求出系统时钟Tscl的方法请参考学习笔记1,这里就不重复了,毕竟笔记文章有限。)这样说出来很陌生,那么还是假设一个例题吧......
例题:假设我SJA1000 CAN控制器所拥有的晶体频率为16MHz,系统时钟Tscl为6.25微妙,SJW.1同SJW.0都被置一,请求出同步跳转宽度位域的时间是?
Tsjw = Tscl * ( 2*SJW.1 + SJW.0 + 1 )
= 6.25微妙 * (2+1+1)
= 6.25微妙 * 4
= 25微妙
问题来了,同步跳转宽度位域的时间又与总线波特率的上限下界的容差值有什么关系呢?它们之间的关系基本是这样的。
总线下界容差 < 总线波特率 < 总线上限容差
1/(Tbit + Tsjw) < 1/(Tbit) < 1/(Tbit-Tsjw)
至于如何求出Tbit(CAN控制位时间),自己回顾学习笔记1吧这里就不作出重复了。
在现实里,如果我们一一的计算不同的总线容差值,这样的工作是很猥琐的,所以呢,我稍微整理了更容易计算的方式:
假设我们以BRP0=0x31,BRP1=0x1c,晶振平率为16MHz作为参考值,我们得到的
Tscl=6.25微妙
Tbit=100微妙
后继续推算;当SJW.0=0,SJW.1=0;
Tsjw = Tscl * ( 2*SJW.1 + SJW.0 + 1 )
= 6.25微妙 * (1)
= 6.25微妙
容差下界 = 1/( Tbit + Tsjw ) = 1/(100微妙 + 6.25微妙) = 1/106.25微妙 = 9.411kbps | 容差上限 = 1/( Tbit - Tsjw ) = 1/(100微妙 - 6.25微妙) = 1/93.75微妙 = 10.666 kbps |
结果: 9.411kbps < 10kbps < 10.666kbps
近似结果: 9.400kbps < 10kbps < 10.600kbps
容差比率: ±6%
后继续推算;当SJW.0=1,SJW.1=0;
Tsjw = Tscl * ( 2*SJW.1 + SJW.0 + 1 )
= 6.25微妙 * (1+1)
= 6.25微妙 * 2
= 12.5微妙
容差下界 = 1/( Tbit + Tsjw ) = 1/(100微妙 + 12.5微妙) = 1/112.5微妙 = 8.888kbps | 容差上限 = 1/( Tbit - Tsjw ) = 1/(100微妙 - 12.5微妙) = 1/87.5微妙 = 11.428 kbps |
结果: 8.888kbps < 10kbps < 11.428kbps
近似结果: 8.900kbps < 10kbps < 11.4kbps
容差比率: 下界 -11% ,上限 +14%
后继续推算;当SJW.0=1,SJW.1=0;
Tsjw = Tscl * ( 2*SJW.1 + SJW.0 + 1 )
= 6.25微妙 * (2+1)
= 6.25微妙 * 3
= 18.75微妙
容差下界 = 1/( Tbit + Tsjw ) = 1/(100微妙 + 18.75微妙) = 1/118.75微妙 = 8.421kbps | 容差上限 = 1/( Tbit - Tsjw ) = 1/(100微妙 - 18.75微妙) = 1/81.25微妙 = 12.307 kbps |
结果: 8.421kbps < 10kbps < 12.307kbps
近似结果: 8.400kbps < 10kbps < 12.300kbps
容差比率: 下界 -16% ,上限 +23%
后继续推算;当SJW.0=1,SJW.1=1;
Tsjw = Tscl * ( 2*SJW.1 + SJW.0 + 1 )
= 6.25微妙 * (3+1)
= 6.25微妙 * 4
= 25微妙
容差下界 = 1/( Tbit + Tsjw ) = 1/(100微妙 + 25微妙) = 1/125微妙 = 8.000kbps | 容差上限 = 1/( Tbit - Tsjw ) = 1/(100微妙 - 25微妙) = 1/75微妙 = 13.333 kbps |
结果: 8.000kbps < 10kbps < 13.333kbps
近似结果: 8.000kbps < 10kbps < 13.300kbps
容差比率: 下界 -20% ,上限 +33%
经过上面的计算后,我们得知以下的列表:
SJW位 | 下界容差比率 | 下界容差波特率公式 | 上限容差比率 | 上限容差波特率公式 |
SJW.0=0,SJW.1=0 | -6% | 总线波特率*0.94 | +6% | 总线波特率*1.06 |
SJW.0=1,SJW.1=0 | -11% | 总线波特率*0.89 | +14% | 总线波特率*1.14 |
SJW.0=0,SJW.1=1 | -16% | 总线波特率*0.84 | +23 | 总线波特率*1.23 |
SJW.0=1,SJW.1=1 | -20% | 总线波特率*0.80 | +33% | 总线波特率*1.33 |
从上面的计算中,我得出一个结论,即使不设置SJW位也有默认的±6%同步跳转宽度位域。同步跳转宽度位域的存在本身就是为了兼容不同总线时序的通讯。
好了,今天的笔记就写到这里为止吧,目前我们已经对总线时序寄存器进行了比较全的探索了,估计大家对CAN的可怖又消除了一点了吧,我也是时候小歇一会儿了。
用户1156182 2009-10-27 16:52
用户1609127 2009-10-27 14:44
用户1584993 2009-10-26 17:03