CAN通信波特率的计算是一个难点,要正确计算设置CAN波特率。CAN2.0协议中定义标称位速率为一理想的发送器在没有重新同步的情况下,每秒发送的位数量,也就是我们说的波特率。
位时间由若干个时间单元(Tq)或者称为时间份额组成。那么位CAN消息中最小的时间份额由下式计算:
PRESDIV 为预分频因子, Fcanclk为CAN模块时钟源频率。
CAN2.0协议中规定要求每一位可以划分为几个不重叠时间片段,分别是:
同步段(Synchronization segment)
传播段(Propagation segment)
相位缓冲段1(Phase segment 1)
相位缓冲段2(Phase segment 2)
同步段:
位时间的同步段用于同步总线上不同的节点。这一段内要有一个跳变沿。
传播段:
传播段用于补偿网络内的物理延时时间。它是总线上输入比较器延时和输出驱动器延时总和的两倍。
相位缓冲段 1、相位缓冲段 2( PHASE SEG1、 PHASE SEG2):
相位缓冲段用于补偿边沿阶段的误差。这两个段可以通过重新同步加长或缩短。
采样点:
采样点是读总线电平并解释各位的值的一个时间点。采样点位于相位缓冲段1( PHASE_SEG1)之后。
信息处理时间 (INFORMATION PROCESSING TIME)
信息处理时间是一个以采样点作为起始的时间段。采样点用于计算后续位的位电平。
同步段(SYNC_SEG)为 1 个时间份额;传播段( PROP_SEG)的长度可设置为 1, 2, …, 8 个时间份额;缓冲段 1 ( PHASE_SEG1)的长度可设置为 1, 2, …, 8 个时间份额;相位缓冲段 2( PHASE_SEG2 )的长度为阶段缓冲段 1 ( PHASE_SEG1 )和信息处理时间( INFORMATIONPROCESSINGTIME)之间的最大值;信息处理时间少于或等于 2 个时间份额。一个位时间总的的时间份额值可以设置在 8—25 的范围。
在清楚了位时间的构成后,我们以飞思卡尔kv4x系列MCU为例说明如何计算CAN波特率
我们知道飞思卡尔KV4xMCU的CAN模块有两种时钟源可选,外设时钟时钟源和晶振时钟源,所以分两种情况来说明
例子:假设系统使用8M晶振,经过PLL倍频后输出144M作为系统时钟,外设也是144M,要求设定波特率为250kbps,CAN模块选择外设时钟源。如果使用peripheral clock 则设置 CAN_CTRL1 bit13 为1。
配置波特率主要是配置控制寄存器1
对照数据手册配置波特率:
首先配置预分频参数PRESDIV 为47
则可计算:
配置寄存器传播段域为2,则传播段时间 = (2 + 1)Tq
配置寄存器相位缓冲段1域为3,则相位缓冲段1时间 = (3+1)Tq
配置寄存器相位缓冲段2域为3,则相位缓冲段2时间 = (3+1)Tq
同步段不用配置,固定为1个Tq
则波特率 = 1/(1+3+4+4)Tq 将(2) 带入可计算出:
其他波特率值可类似计算,具体应用时候还要参考数据手册的限制条件,这四个值都有范围限制。
例子:假设系统使用8M晶振,经过PLL倍频后输出144M作为系统时钟,外设也是144M,要求设定波特率为250kbps,CAN模块选择晶振时钟源。
首先配置预分频参数PRESDIV 为3
其他波特率值可类似计算,具体应用时候还要参考数据手册的限制条件,这四个值都有范围限制。
在CAN 驱动中如果使用外部8M晶振作为CAN模块时钟源,必须配置CAN_CTRL1 bit13为0,选择can模块使用外部时钟,同时必须正确配置MCG_C2和OSC_CR寄存器,才能正常工作,否则CAN模块不能正常通讯。
MCG_C2 |=MCG_C2_EREFS_MASK;
// Enable ERCLK clock to FlexCAN
OSC_CR |= OSC_CR_ERCLKEN_MASK | OSC_CR_EREFSTEN_MASK;
各位亲,是否学会了如何计算CAN通讯波特率呢?如果你喜欢本文,请分享给你的朋友。