CAN协议概览
有用的工具
比特时间片计算器
使用计算器为给出的输入频率和给出的总线速度计算CAN总线参数的所有可能集合。
开始使用同步节始终为一个基本时间片长度,用来与时钟进行同步。当总线上数据改变时,此处会存在位边沿。
传播节用来补偿总线线路中的延迟。
如有必要,阶段节可以缩短(阶段节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)处。