CAN 波特率及采样点
CAN采用的是NRZ编码,数据流中是不含有时钟信息的,因此,报文接收设备要使用发射设备的时钟进行同步操作,从而获取数据。
CAN的标称位时(Nominal bit timing)可以分为四个段:
同步段(sync_seg )
传播时间段(prop_seg )
相位缓冲段1(phase_Seg1 )
相位缓冲段2(phase_Seg2)
首先,通过对这些字段的配置,可以确定CAN的波特率,例如我们常见的250kbps,500kbps等。
例如我们的CAN时钟频率是30MHz,要配置成250kbps的波特率,则应该是30*1000/250=120,也就是120个时间片(Time Quantum,以下简称tq)
所以我们要把位时的和凑成120,也就是sync_seg + prop_seg + phase_seg1 + phase_seg2=120
请注意,还有一个概念是同步跳转宽度SJW(synchronization jump width),这个是用来限定延长phase_seg1 或者缩短phase_seg2的最大宽度,不计入该位时的。
这四个时段,并不是随便取值就可以,每一个都有一定的范围和要求。
同步段是固定一个tq,所以sync_seg=1tq;其次,prop_seg + phase_seg1有些设备中是合在一起设定,phase_seg2单独设定。
还有如下要求:
prop_seg + phase_seg1>phase_seg2
phase_seg2>SJW
但是,即使是已知上面的这些信息,仍有很多种组合方式, 还不足以确定选用什么样的组合能取得较好的效果,这个时候就要引入采样点说明了。
定义是:(sync_seg + prop_seg + phase_seg1)/(sync_seg + prop_seg + phase_seg1 + phase_seg2)×100%
根据CiA(CAN in Automation)的建议是:
(1)一般配置在75-80%的位置
(2)选择采样点位置在85%左右为佳
(3)波特率 > 800K:75% 波特率 > 500K:80% 波特率 <= 500K:87.5%
因此,我们继续以上面的为例,由于波特率为250kbps,因此,选择采样点为靠近87.5%为目标。
120tq*87.5%=105tq
因此,很容易算出phase_seg2=15tq
sync_seg + prop_seg + phase_seg1=1+prop_seg + phase_seg1=105 tq,因此prop_seg + phase_seg1=104 tq
当然,有些设备的位时控制取值可能没有这么大的范围,例如MCP2515,prop_seg 取值范围是1~8 tq,phase_seg1是1~8 tq,phase_seg2是2~8 tq;而LPC54608控制器的CAN外设,prop_seg + phase_seg1的取值在0~ 255 tq,phase_seg2是0~ 127 tq。显然,可选择的范围越大,能够调控的采样点也就越 精细。
所以就有可能采样点配置不到恰好87.5%的位置,但是这个要求是尽可能满足,是在满足不了就在75%到80%之间就行了。
为了保证有效的通信,对于一个只有两个节点的CAN网络,其两边距离不超过最大的传输延迟和每个节点的时钟容差能够正确地接收和解码每个传输的消息,这需要每个节点都能对每个位正确采样。CAN总线的每一帧可以看作一连串的电平信号。大多数设备使用单点采样,也就是在一个位时间内从采样点的位置读取一个电平信号,以此确定这个“位”的显隐性。在CAN网络中,当每个节点的采样点位置不一样时,由于总线过长引起的通信延迟或现场对总线的干扰,就容易发生读取的电平不一致现象,产生CRC错误报文。为了提高CAN网络的通信成功率,各节点的采样点应设置一致。
对于一些带CAN外设的微控制器,例如STM32或者LPC系列的某些产品,还带有CAN预分频功能,就是把CAN的输入时钟进行分频,分频可以降低频率,可以简单理解为增大tq,将上述的四个时间段配置好以后,需要修改波特率,可以调整分频数,如果配置500kbps的时候没有使用预分频(分频寄存器内容为0,分频数为1),接下来只要将分频数分别配置为2或者5,就可以获得250kbps或者100kbps的波特率了。