• 如何处理CAN通讯故障


    1、波特率的设定

    首先是几个名词的含义,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)

     

    AN位时序寄存器(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. 采用单次采样。

     

  • 相关阅读:
    python一点通:数据处理顶流Pandas 2.0有什么新功能?
    2.9 场景式文案,原来是这样子写的【玩赚小红书】
    惊喜警报!Mini XMan线上快闪活动即将来袭!
    使用GParted为Ubuntu根目录扩容
    智能排班系统 【管理系统功能、操作说明——中篇】
    ROS 2边学边练(31)-- 管理大工程
    AI+医疗:使用神经网络进行医学影像识别分析
    803_div2(日常垫底- XOR Mixup
    【2023】COMAP美赛数模中的大型语言模型LLM和生成式人工智能工具的使用
    mysql经典案例带解析(你没见过的全新版本)55题
  • 原文地址:https://blog.csdn.net/newzhpfree/article/details/125905036