CAN总线波特率的设定——以STM32F103为例

CAN总线波特率的设定——以STM32F103为例

波特率的设定

首先是几个名词的含义,CAN里面1个位的构成如下。注意采样点的位置在PBS1和PBS2的中间。根据这个位时序就可以计算波特率了。

最小时间单位(Tq,Time Quantum)

同步段(SS,Synchronization Segment)1Tq

传播时间段(PTS,Propagation Time Segment)1-8Tq

相位缓冲段1(PBS1,Phase Buffer Segment1)1-8Tq

相位缓冲段2(PBS2,Phase Buffer Segment2)2-8Tq

再同步补偿宽度(SJW,reSynchronization Jump Width)1-4Tq

波特率分频器(BRP,Baud Rate Prescaler)

中文参考手册中关于CAN波特率的解释

STM32把传播时间段和相位缓冲段1合并在一起,形成了新的时间段1。

CAN位时序寄存器(CAN_BTR)用于设置TS1、TS2、BRP、SJW等参数,直接决定CAN的波特率。

SJW[1:0]再同步补偿宽度;

TS1[3:0]时间段1;

TS2[2:0]时间段2;

BRP[9:0]波特率分频器;

呀,没有SS同步段的设置,因为SS恒等于1

除此之外,我们还需要设置APB1的时钟频率,STM32F1通常为36MHz(外部8M晶振)。

CAN波特率计算公式(寄存器)

再同步补偿宽度(SJW)的具体作用是增大或减少CAN波特率的容许偏差量,也就是说它的大小和波特率的值没有很大关系,属辅助类的,可以理解为波特率精度调节。这里要注意的是这个值应该设计的尽可能大,满足位宽度容忍测试中,大于3%的要求。

其公式为trjw=tq*(sjw+1),指为了重新同步,该参数定义了CAN硬件在每位中可以延长或者缩短多少个时间单元的上限。在实际写程序时,这个sjw通常被定义为0。关于这个再同步补偿宽度很多资料中都写得很模糊,在这里我举个例子帮助大家理解下。这里先用库函数了,下面的第一个图是CAN_SJW_4tq时,用USBCAN分析仪探测的波特率结果,有5个波特率可以实现CAN通讯;下面的第二个图是CAN_SJW_1tq时,用USBCAN分析仪探测的波特率结果,这时只有3个波特率可以实现CAN通讯了。也就是容错性能变小了。这个值大些好还是小些好,需要日后研究了。

CAN_SJW_4tq时的情况,有效波特率段比较大

CAN_SJW_1tq时的情况,有效波特率段比较小

CAN_BTR寄存器

我们举个例子,假如SJW为0,TS1为8,TS2为7,BRP为3,那么波特率应该是36M/[(1+9+8)*4]=500kbps。

采样率的设定

除了波特率,我们还应该考虑一个叫做采样率的公式。这个公式如下。实际上我们可以看出来,采样率表示的是采样点在整个位中的相对位置。对上面的例子来说,采样率为(1+8+1)/(1+8+1+7+1)=55.6%,偏低。

当波特率大于800kbps时,推荐采样率为75%;当波特率为500k-800kbps时,推荐采样率80%左右;当波特率不大于500kbps时,推荐采样率为87.5%。采样点如果偏离这个标准过多,可能会导致一致性问题。

库函数中需要设置的值

刚才我们说STM32单片机中CAN的波特率主要由4个参数共同决定。他们分别是重新同步跳跃时间单元(tsjw)、时间段1的时间单元(tbs1)、时间段2的时间单元(tbs2)、波特率分频器(brp)。对应到STM32单片机的库函数中,分别对应的是CAN_SJW、CAN_BS1(即tbs1+1)、CAN_BS2(即tbs2+1)、CAN_Prescaler等4个参数。库函数中只需完成这4个参数的设定即可。比如设置CAN_SJW=1tq,CAN_BS1=6tq,CAN_BS2=1tq,CANPrescaler=9,则波特率=36M/[(1+6+1)*9]=500Kbps。

采样率=(1+6)/(1+6+1)=87.5%。要注意CAN_SJW没有参与任何公式的计算波特率公式的那个位置是SS段,故而为1。

在这里推荐一个很不错的STM32-CAN波特率计算软件can_config.exe,如果有需要可以留言。但这个软件中,公式里面提到的CAN_SJW参与波特率运算的说法是错误的,要订正。

硬件设计注意

设计硬件时要注意收发器芯片的选取,如果系统5V供电可以选择NXP的82C251、TJA1050、MCP2551等,如果3.3V供电可以选择VD230。部分芯片的8脚有唤醒功能,需要详细阅读datasheet。MCU引脚的CAN_TX应接到收发器的TXD上,MCU的CAN_RX应接到收发器的RXD上。下图说明了信号的流向,CAN_TX对于MCU来说,属于输出;而CAN_RX对于MCU来说,属于输入

其他

同步跳转宽度(SJW):SJW的值直接影响到重同步时相位缓冲段的可调节的范围,SJW的值可以在1~4之间选择,我们选择3、4可以使总线获得更宽的波特率容忍度;

采样次数:分为单次采样跟三次采样,三次采样在设计之初虽然是为了过滤掉总线上毛刺,但是采用三次采样经常会影响SJW的跳转,所以实际应用中我们一般都会采用单次采样。

建议

波特率选取规则建议如下:

  1. TSEG2 >= SJW;
  2. BRP(波特率预分频)尽量小,SJW(同步跳转宽度)尽量大;
  3. SMP(采样点)选取在75%~85%之间。
  4. 采用单次采样。

附:正点原子STM32F1系列开发板设置的系统时钟大小

SYSCLK(系统时钟)=72MHz

AHB总线时钟(使用SYSCLK)=72MHz

APB1总线时钟(PCLK1)=36MHz CAN、USB、I2C等

APB2总线时钟(PCLK2)=72MHz

PLL时钟=72MHz

扩展阅读:

1.can波特率计算 - 总线与接口 - 电子工程世界网

2.http://blog.chinaunix.net/uid-

  • aaron

    aaron2019-12-07

    作者研究的非常深入,谢谢分享!其他部分都认可,但对于SJW取值有异议。SJW取大值确实会增大的时钟精度的容限,但也会让采样点位置变化过大。近距传输没有问题,远距传输信号延迟很大,采样点往前移动可能会造成采样出错。我认为SJW不宜超过1/8位宽,波特率精度靠晶振控制在1%,而非SJW,毕竟SJW只是“补救措施”。

    ​2​回复​踩​ 举报

  • aaron

    aaron回复aaron2019-12-07

    其次,SJW修正是判断SS段(1个时基)是否同步确定的,只要偏离就进行4个时基的增减修正的话,其实让控制器处于反复增减状态。所以SJW应该是系统性修正,一次修正后面可以坚持好长时间,做到刚好够用就行。

猜你喜欢

转载自blog.csdn.net/m0_38012497/article/details/121923813#comments_27320576