Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1566600
  • 博文数量: 354
  • 博客积分: 8137
  • 博客等级: 中将
  • 技术积分: 5137
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 15:40
文章分类

全部博文(354)

文章存档

2010年(300)

2009年(54)

分类: 嵌入式

2010-09-06 11:14:05

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及以下波特率
阅读(8224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~