转:SJA1000 中CAN 总线同步跳转宽度+波特率控制寄存器的设置 SJA1000 CAN 控制器对时序的设置真的一点也不马虎,到底是怎么样的不马虎法呢?这一篇笔记就让我们听听他的故事。 在总线时序寄存器0 和 1 中,除了对总线的波特率可编程以外,还加了对采样位与同步跳转宽度位域的设置,我们一一的来探索吧: 采样位,也就是对[采样]动作进行设置的标志位,在总线时序寄存器1 的最高位,也就是SAM 位。 当 SAM 为逻辑 1 时,采样的次数为 3 次,反之 SAM 为逻辑 0,采样次数为 1 次。这里就存在一个问题,那么什么时候才需要将 SAM 位置1 呢?网络中有这样一个定义,当总线的波特率为中,低等级时,建议将 SAM 位置1,则当总线波特率为高时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+...