CAN协议概览

CAN比特时间分片

比特的布局

为了进行时间分片,CAN总线上的每个比特都分成至少4个基本单元。基本单元逻辑上分成四个组或节:

  • 同步节
  • 传播节
  • 阶段节1
  • 阶段节2

下面是CAN数据位的图例:

比特时间分片1

同步节始终为一个基本时间片长度,用来与时钟进行同步。当总线上数据改变时,此处会存在位边沿。

传播节用来补偿总线线路中的延迟。

如有必要,阶段节可以缩短(阶段节1)或延长(阶段节2),以保持与时钟同步。

总线电平在阶段节1和阶段节2之间的边缘处进行采样。

大部分CAN控制器还提供选项允许在一个位期间进行三次采样。这种情况中,增加的两次采样在采样点前面的两个基本单元的边缘上进行,结果取决于多数解码(至少82527是这样)。

时钟同步

为了调节片上总线时钟,CAN控制器可以以基本单元的整数倍缩短或延长位长度。这些位时间调节的最大值称为同步跳变宽度(SJW)。

在起始位从隐性转向显性时发生硬同步。位时间从该边沿重新开始计时。

报文的同步节中没有出现位边沿时发生重新同步。一个阶段节会缩短或延长,具体数值取决于信号中的阶段错误;可以使用的最大数值由同步跳变宽度参数确定。

比特基本时间单元寄存器计算

大部分CAN控制器允许程序员使用下列参数设置位时间基本单元:

  • 时钟预设值
  • 采样点之前的基本时间单元数
  • 采样点之后的基本时间单元数
  • 同步跳变宽度(SJW)中的基本时间单元数

通常为此目的提供两个寄存器:btr0和btr1。但是,不同控制器之间情况稍有不同,所以请仔细阅读您的产品数据页。

在来自NXP(nee Philips)的82c200和SJA1000上,寄存器布局如下:

7 6 5 4 3 2 1 0
btr0 SJW1 SJW0 BRP5 BRP4 BRP3 BRP2 BRP1 BRP0
btr1 SAM TSEG22 TSEG21 TSEG20 TSEG13 TSEG12 TSEG11 TSEG10

 

  • BRP0..BRP5设置时钟预设值
  • SJW0..SJW1设置SJW的长度
  • TSEG10..TSEG13设置采样点之前的基本时间单元数(未包含起始位)
  • TSEG20..TSEG22设置采样点之后的基本时间单元数。
  • 如果采用三个样本,SAM设置为1。如果一个样本就足够,则设置为0。

注意:这些参数的实际值比写入寄存器的值大1。

例如:如果传给SJA1000的振荡器信号为16 MHz,并且我们想要250 kbit/s的比特率,采样点靠近整个位的62%,以及2个基本时间单元的同步跳变宽度,我们可以设置:

BRP = 4,这将把基本时间单元设置为2 * 4 / 16000000 s = 500 ns,并且
TSEG1 = 5,这将在采样点之前分配5个基本时间单元,并且
TSEG2 = 3,这将在采样点之前分配3个基本时间单元。

这样,每个位将包含5 + 3 = 8个基本时间单元,产生需要的比特率1 / (8 * 500 ns) = 250 kbit/s。那么寄存器值应当是

btr0 = (SJW – 1) * 64 + (BRP -1) =
(2-1)*64 + (4-1) =
67 =
0x43
btr1 = SAM * 128 + (TSEG2 – 1)* 16 + (TSEG1 – 1) =
0*128 + (3-1)*16 + (4-1) = (“4” 因为未包含起始位)
35 =
0x23

 

采样点为位的62.5%(5/8)处。