can的波特率
can的波特率
can控制器只需要进行少量的设置就可以进行通信,就像RS232那样。其中较难设置的部分就是通信波特率的计算。can总线能够在一定范围内容忍总线上can节点的通信波特率的偏差,这种技能使得can总线有很强的容错性,同时也降低了对每个节点的振荡器精度。
实际上,can总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200-300KB/S(具体取决于寄存器的设置)。
简单介绍一下波特率的计算,在can的底层协议里将can数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:位同步时间Tsync,时间段1Tseg1,时间段2Tseg2.
其中位同步时间占用1个Tscl;,时间段1占用(Tseg1+1)个Tscl;时间段2占用Tseg2+1个Tscl,所以can控制器的位时间TBit就是:
TBit = Tseg1+Tseg2+Tsync=(Tseg1+Tseg2+3)*Tscl,那么can的波特率canbps就是1/TBit。
但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时,不同节点的晶体的误差等因数,使得网络can的波特率的计算变得复杂起来。can在技术上引入了重同步的概念,以更好的解决这些问题。
这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转宽度SJW+1),要么时间段减少TSJW,因此can的波特率实际上有一个范围:
1/(TBit+TSJW) <= CANbps <= 1/(TBit-TSJW)
CAN波特率的值由以下几个元素决定:
1. 最小时间段Tscl
2. 时间段1 Tseg1
3. 时间段2 Tseg2
4. 同步跳转宽度 SJW
那么Tscl是怎么计算的呢?
这是总线时序寄存器中的预分频寄存器BRP派上了用场,Tscl = (BRP+1)/FVBP,FVBP为微处理器的外设时钟。
tscl = pclk。
Tseg1和Tseg2又是怎么划分的呢?
Tseg1和Tseg2的长度决定了CAN数据的采样点,这种方式允许宽范围的数据传输延迟和晶体的误差。其中Tseg1用来调整数据传输延迟时间造成的误差,而Tseg2则用来调整不同点节点晶体频率的误差。
但是他们由于过于灵活,而使初次接触CAN的人有点无所适从。TSEG1与TSEG2的是分大体遵循以下规则: Tseg2≥Tscl2,Tseg2≥2TSJW,Tseg1≥Tseg2
总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为: BitRate = Fpclk/( (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1)
最后,我们来说说如何计算波特率。
can总线有两个总线时钟寄存器BTR0、BTR1。
can系统时钟公式:
tscl = 2*tclk*(32*BRP.5 + 16*BRP.4 + 8*BRP.3 + 4*BRP.2 + 2*BRP.1 +BRP.0 + 1)
其中tclk=1/晶振频率=pclk。
同步跳转宽度:
Tsjw = “tscl”*(2*SJW.1 + SJW.0 + 1)
位周期T
TBit = Tseg1+Tseg2+Tsync=(Tseg1+Tseg2+3)*Tscl
Tseg1 = tscl*(8*TSEG1.3 + 4*TSEG1.2 +2*TSEG1.1 + TSEG1.0 + 1)
Tseg2 = tscl*(4*TSEG2.2 +2*TSEG2.1 + TSEG2.0 + 1)
CAN波特率=APB总线频率/BRP分频器/(1+tBS1+tBS2)。
比如:
总线时钟寄存器BTR0:0x2,;总线时钟寄存器BTR1:0x14。
TBit = tscl(1+5+2)=8tscl
tscl = 2tclk*(3) = 6tclk
TBit =48tclk
tclk = 1/48000000
TBit = 1/1000000
即can的波特率canbps就是1/TBit=1MHz。