[CAN-bus/DeviceNet] CAN波特率的计算

[复制链接]
 楼主| skywalkzf 发表于 2009-7-12 20:50 | 显示全部楼层 |阅读模式
CAN波特率的计算<br /><br />CAN是controller&nbsp;Area&nbsp;Network的简称,中文为控制器局域网络。主要应用于汽车领域。<br />在平时的硬件的设计中主要有两个控制器来实现扩展CAN设备,分别是SJA1000和MCP2515。其中SJA1000被设计替代原来的PCA82C200。<br />SJA1000<br />SJA1000为并行输入的CAN控制器。SJA1000有两种独立的工作模式:BasicCAN&nbsp;Mode(PCA82C200兼容模式)和PeliCAN&nbsp;Mode。<br />SJA1000的CAN波特率的计算方式如下:<br />假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2个分频系数寄存器;它们的乘积是一个扩展的分频系数。即:<br />&nbsp;&nbsp;&nbsp;&nbsp;BTR0×BTR1=F_BASE/Fbps&nbsp;&nbsp;&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;其中:<br />&nbsp;&nbsp;&nbsp;&nbsp;内部频率基准源F_BASE&nbsp;=&nbsp;Fclk/2,即外部晶振频率Fclk的2分频。注意任何应用中,当利用外部晶振作为基准源的时候,都是先经过2分频整形的。<br />(1)式中,当晶振为16M时,F_BASE=8000K<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当晶振为12M时,F_BASE=6000K<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fbps就是我们所希望得到的CAN总线频率。单位为K。<br />&nbsp;&nbsp;&nbsp;&nbsp;设(1)式中BTR0=m,BTR1=n,外部晶振16M,则有:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=8000/&nbsp;&nbsp;&nbsp;&nbsp;Fbps&nbsp;&nbsp;&nbsp;(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;这样,当Fbps取我们希望的值时,就会得到一个m&nbsp;*&nbsp;n的组合值。当n选定,m值也唯一。<br />&nbsp;&nbsp;&nbsp;&nbsp;n值CAN规范中规定8~25。(也就是BTR1的值)基本原则为:Fbps值越高时,选取n(通过设置BTR1)值越大。其原因不难理解。<br />&nbsp;&nbsp;&nbsp;&nbsp;我假定一般应用中选取n=10,也就是:<br />同步段+相位缓冲段1+相位缓冲段2&nbsp;=1+5+4<br />则(2)式简化为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m=800/Fbps<br />&nbsp;&nbsp;&nbsp;m的最大设置值为64,SJA1000最大分频系数m*n=64x25=1600。因此标准算法中通常以16M晶振为例。其实有了公式(1),任何晶振值(6M~24M)都很容易计算。<br />&nbsp;&nbsp;&nbsp;&nbsp;SAM的确定:低频时,选SAM=1,即采样3次。高频100K以上时,取SAM=0,即采样1次。<br />&nbsp;&nbsp;&nbsp;&nbsp;SJA重同步跳宽选取:&nbsp;与数字锁相环技术有关。n值选得大时,SJA可以选得大,即一次可以修正多个脉冲份额Tscl。n值小或频率低时,选SJA=1。即BTR0.7和BTR0.6都设为0。<br />SAM中的设定是当为高速CAN时设定为0,为低速CAN时设置为1;<br />以上可以参考SJA1000手册中的命令寄存器章节有讲解的相应的总线定时器。<br /><br />&nbsp;<br />MCP2515<br />MCP2515与MCU的连接是通过SPI接口来实现的。<br />MCP2515的波特率的计算如下:<br />Tbit&nbsp;=&nbsp;tSyncSeg&nbsp;+&nbsp;tPropSeg&nbsp;+&nbsp;tPS1&nbsp;+&nbsp;tPS2;<br />&nbsp;<br />同步段(SyncSeq)为NBT的首段,业内关于同步CAN总线上的各个节点。输入信号的调边沿就发生在同步段,该段设置为1TQ;<br />传播段(PropSeg)用于补偿各节点之间的物理传输延迟时间,在此可编程设置为1-8TQ;<br />相位缓冲段(PS1和PS2)用于补偿总线上的边沿相位误差。PS1可设置为1-8TQ,PS2可设置为2-8TQ。<br />其中TQ的设置可参考以下的公式:<br />TQ&nbsp;=&nbsp;2×(BRP&nbsp;+&nbsp;1)/FOSC;<br />PS1&nbsp;=&nbsp;(PHSEG1&nbsp;+&nbsp;1&nbsp;)×&nbsp;TQ;<br />PS2&nbsp;=&nbsp;(PHSEG2&nbsp;+&nbsp;1&nbsp;)×&nbsp;TQ;<br />其中BRP为CAN的预分频比。<br />参考《MCP2515器件手册第五章&nbsp;位定时》<br />&nbsp;<br />带有CAN控制器的LPC2xxx<br />LPC2XXX系列ARM带CAN的波特率计算<br />当VPB时钟为4*11059200Hz时,常用波特率与总线时序器对照表(周立功给的,11059200kHz的波特率都是近似的,有误差)<br />BPS&nbsp;=&nbsp;(SAM&nbsp;&lt&lt&nbsp;23)|(TSEG2&nbsp;&lt&lt&nbsp;20)|(TSEG1&nbsp;&lt&lt&nbsp;16)|(SJW&nbsp;&lt&lt&nbsp;14)|&nbsp;BRP<br />#define&nbsp;BPS_5K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;879<br />#define&nbsp;BPS_10K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;439<br />#define&nbsp;BPS_20K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;219<br />#define&nbsp;BPS_40K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;109<br />#define&nbsp;BPS_50K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;87<br />#define&nbsp;BPS_80K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(4&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;68<br />#define&nbsp;BPS_100K&nbsp;(1&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;43<br />#define&nbsp;BPS_125K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(4&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;43<br />#define&nbsp;BPS_200K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;21<br />#define&nbsp;BPS_250K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(4&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;21<br />#define&nbsp;BPS_400K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(6&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;10<br />#define&nbsp;BPS_500K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(4&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;10<br />#define&nbsp;BPS_666K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(2&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;10<br />#define&nbsp;BPS_800K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(1&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;10<br />#define&nbsp;BPS_1000K&nbsp;(0&nbsp;&lt&lt&nbsp;23)|(1&nbsp;&lt&lt&nbsp;20)|(1&nbsp;&lt&lt&nbsp;16)|(0&nbsp;&lt&lt&nbsp;14)|&nbsp;8<br />以下是我自己推导的(仅供参考)<br />CANBTR(0xE00xx014)<br />&nbsp;<br />波特率BPS=&nbsp;<br />&nbsp;<br />SAM&nbsp;0:125K及以上波特率<br />1:100K及以下波特率<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部