记得最早是在15年就给大家推送过关于CAN通信波特率的设置,当时是以NXP的kinetis系列之KV46为例子来给大家介绍的,最近推送了几篇有关CAN通信的文章,后台又有人问起这个问题,今天我们就来在给大家详细普及下,今天以我最近使用的NXP的汽车级芯片KEAZ64的mscan为例,之前的文章也可供参考。
mscan跟flexcan两者使用不同的芯片IP,所以在寄存器级别上有不小区别,今天我们来一步步看如何在mscan上配置can的比特率,首先要搞明白CAN标准对位时间的定义,CAN通信波特率的计算是一个难点,要正确计算设置CAN波特率。CAN2.0协议中定义标称位速率为一理想的发送器在没有重新同步的情况下,每秒发送的位数量,也就是我们说的波特率。位时间由若干个时间单元(Tq)或者称为时间份额组成。每一位的组成如下图所示:
CAN2.0协议中规定要求每一位可以划分为几个不重叠时间片段,分别是:
同步段(Synchronization segment)
传播段(Propagation segment)
相位缓冲段1(Phase segment 1)
相位缓冲段2(Phase segment 2)
同步段:
位时间的同步段用于同步总线上不同的节点。这一段内要有一个跳变沿。
传播段:
传播段用于补偿网络内的物理延时时间。它是总线上输入比较器延时和输出驱动器延时总和的两倍。
相位缓冲段1、相位缓冲段2(PHASESEG1、PHASE SEG2):
相位缓冲段用于补偿边沿阶段的误差。这两个段可以通过重新同步加长或缩短。
采样点:
采样点是读总线电平并解释各位的值的一个时间点。采样点位于相位缓冲段1(PHASE_SEG1)之后。
除过同步段是一个时间份额外,其他几个域都在寄存器的不同位设置,需要特别注意的一点是在mscan中将传播段和相位缓冲段放在一个寄存器中设置
更波特率配置相关的寄存器,MSCAN总线定时器0和MSCAN总线定时器1,首先来看总线定时器0
其中BRP为就是用来设置波特率预分频器的,也就是设置时间量子的时钟。
总线定时器1主要就是来设置位时间的几个域,TSEG1段用于设置传播段和相位缓冲段1,TSEG2用于设置相位缓冲段2,搞清楚这几个域的配置后,我们就可以来动手配置了,例如要求配置波特率位250k,使用总线时钟24MHz为CAN模块时钟(CAN模块时钟也可以配置为外部晶振,推荐正式项目,配置为外部晶振,当然如果你的板子有晶振的话),则我们可以配置如下:
预分频配置为11,则根据数据手册描述,预分频为12
TSEG1 配置为3,则根据数据手册描述,传输段加相位缓冲段1位4个时间量子 TSEG2配置为 2, 则根据数据手册描述,相位缓冲段2位3个时间量子
根据CAN标准,同步段一般为一个时间量子,
则波特率计算如下
波特率 = 1/(4+ 3 + 1) * 24000000/12 = 250kbps, 同理可配置其他波特率,当然同一种波特率,这几个域可以配为不同的值。也可以参考以下推送,里面有详细的推导过程。
精彩推荐:
一起来学习CAN FD(CAN with Flexible Data-Rate)
嵌入式程序猿工作室同时承接嵌入式设计,嵌入式开发培训,合作开发,项目外包等服务,欢迎来电详询 18706715925。