单片机
返回首页

飞思卡尔s12系列CAN波特率计算

2021-08-10 来源:eefocus

最近在看飞思卡尔s12系列CAN部分,发现波特率计算这块没有一个讲的详细的,在数据手册里也没有详细说明。


经过仔细研究,特将CAN部分波特率计算总结出来。


引用部分CAN波特率计算资料如下:


简单介绍一个波特率的计算,在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:

A. 位同步时间(Tsync)

B. 时间段1(Tseg1)

C. 时间段2(Tseg2)


其中位同步时间占用1个Tscl;时间段2占用(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有波特率的值四以下几个元素决定:

A. 最小时间段Tscl;

B. 时间段1 TSEG1;

C. 时间段2 TSEG2;

D. 同步跳转宽度 SJW


那么Tscl又是怎么计算的呢?这是总总线时序寄存器中的预分频寄存器BRP派上了用场,Tscl=(BRP+1)/FVBP。FVBP为微处理器的外设时钟。


下面用一个例子来举例说明。


注:本例中时钟使用总线时钟,若选择外设时钟,则外设时钟=晶振频率/2


比如,总线时钟fbus=16M,准备设定的波特率 CANbps=250K,则


(1)位时间TBit=1/250k=4us.


同时,


(2)TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,


一般 (TSEG1+TSEG2+3)的值取16(8~25之间),则


Tscl=4us/16=250ns


而同时(3)Tscl=(BRP+1)/fbus


fbus为微处理器的总线时钟。则


250ns=(BRP+1)/16M,


计算之后BRP=3;


假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2个分频系数寄存器;它们的乘积是一个扩展的分频系数。即:


BTR0×BTR1=fbus/CANbps   (4)


此例中,BTR0*BTR1=16M/250K=64. 


此例中,BRP=3,其作为BTR0的组成部分,表示预分频值为4,则BTR1的预分频值为


(5)64/4=16;


(CAN规范中规定其取值在8~25之间)

 

TSEG1和TESG2的值(TSEG1+TSEG2+3)=16,而根据CIA推荐:


75%     when 波特率 > 800K

80%     when 波特率 > 500K

87.5%   when 波特率 <= 500K


CiA计算方式:


sample =(1+(TSEG1+1))/(1+(TSEG1+1)+(TSEG2+1))               (6)


sample = ( 1 +  CAN_BS1) /  (1 +  CAN_BS1 +  CAN_BS2)        (6)


在这里,CAN_BS1=TSEG1+1,CAN_BS2=TSEG2+1;


则CAN_BS1和CAN_BS2的取值要符合要求。


此处令CAN_BS1取13,CAN_BS2取2, 采样率=(1+13)/(1+13+2)=87.5%    BTR1=0001 1100B


则CANBTR1的值为0x1c;


其实,用一个公式总结则为


CANbps = fbus/( (BRP+1) * (CAN_BS1+CAN_BS2+1))


本例中 250K=16M/(3+1)*(13+2+1)=16M/64;


总之,BRP(BTR0的值)和CAN_BS1,CAN_BS2的值可以自定,但是要符合(CAN_BS1+CAN_BS2)=15,且符合CIA推荐的标准。


总体配置保持CAN_BS1>=CAN_BS2 , CAN_BS1>=1个CAN时钟周期 ,CAN_BS2>=2SJW ,


本例中,CAN_BS2=2,则SJW=1;即BRT0的bit7和bit6均为0


SAM的确定:低频时,选SAM=1,即采样3次。高频100K以上时,取SAM=0,即采样1次。


总结:


BTR0:  SJW和CAN_BS2有关,CAN_BS2>=2SJW 


BTR1:  SAM的确定:低频时,选SAM=1,即采样3次。高频100K以上时,取SAM=0,即采样1次。


CANbps = fbus/( (BRP+1) * (CAN_BS1+CAN_BS2+1))    最重要的公式


CANbps为要设定的CAN波特率;


fbus为总线时钟频率,若采用外部时钟时,则外部时钟=晶振时钟/2;


BRP为BTR0的低6位值;


CAN_BS1为BTR1的bit0~bit3的值-1;


CAN_BS2为BTR1的bit4~bit6的值-1;

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章