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