CAN波特率的计算

CANcontroller Area Network的简称,中文为控制器局域网络。主要应用于汽车领域。

在平时的硬件的设计中主要有两个控制器来实现扩展CAN设备,分别是SJA1000MCP2515。其中SJA1000被设计替代原来的PCA82C200

SJA1000

SJA1000为并行输入的CAN控制器。SJA1000有两种独立的工作模式:BasicCAN Mode(PCA82C200兼容模式)PeliCAN Mode

SJA1000CAN波特率的计算方式如下:

假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。那么,BTR0BTR1就是2个分频系数寄存器;它们的乘积是一个扩展的分频系数。即:

    BTR0×BTR1F_BASEFbps   1

    其中:

    内部频率基准源F_BASE = Fclk2,即外部晶振频率Fclk2分频。注意任何应用中,当利用外部晶振作为基准源的时候,都是先经过2分频整形的。

1)式中,当晶振为16M时,F_BASE8000K

           当晶振为12M时,F_BASE6000K

     Fbps就是我们所希望得到的CAN总线频率。单位为K

    设(1)式中BTR0mBTR1n,外部晶振16M,则有:

         n 8000    Fbps   2

    这样,当Fbps取我们希望的值时,就会得到一个m * n的组合值。当n选定,m值也唯一。

    nCAN规范中规定825。(也就是BTR1的值)基本原则为:Fbps值越高时,选取n(通过设置BTR1)值越大。其原因不难理解。

    我假定一般应用中选取n10,也就是:

同步段+相位缓冲段1+相位缓冲段154

(2)式简化为

               m800Fbps

   m的最大设置值为64SJA1000最大分频系数m*n64x251600。因此标准算法中通常以16M晶振为例。其实有了公式(1),任何晶振值(6M24M)都很容易计算。

    SAM的确定:低频时,选SAM1,即采样3次。高频100K以上时,取SAM0,即采样1次。

    SJA重同步跳宽选取与数字锁相环技术有关。n值选得大时,SJA可以选得大,即一次可以修正多个脉冲份额Tscln值小或频率低时,选SJA1。即BTR0.7BTR0.6都设为0

SAM中的设定是当为高速CAN时设定为0,为低速CAN时设置为1

以上可以参考SJA1000手册中的命令寄存器章节有讲解的相应的总线定时器。

 


MCP2515

MCP2515MCU的连接是通过SPI接口来实现的。

MCP2515的波特率的计算如下:

Tbit = tSyncSeg + tPropSeg + tPS1 + tPS2;

同步段(SyncSeq)为NBT的首段,业内关于同步CAN总线上的各个节点。输入信号的调边沿就发生在同步段,该段设置为1TQ

传播段(PropSeg)用于补偿各节点之间的物理传输延迟时间,在此可编程设置为1-8TQ;

相位缓冲段(PS1PS2)用于补偿总线上的边沿相位误差。PS1可设置为1-8TQ,PS2可设置为2-8TQ

其中TQ的设置可参考以下的公式:

TQ = 2×(BRP + 1/FOSC

PS1 = PHSEG1 + 1 )× TQ

PS2 = PHSEG2 + 1 )× TQ

其中BRPCAN的预分频比。

参考《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及以下波特率

你可能感兴趣的:(工业自动化,network,扩展,算法,编程,工作,网络)