摘要
本篇笔记主要记录MPC5744p的CAN通信波特率计算,以及需要注意的问题
CAN 位时间
记得最早是在2015年就给大家推送过关于CAN通信波特率的设置,当时是以NXP的kinetis系列之KV46为例子来给大家介绍的,最近推送了几篇有关CAN通信的文章,后台又有人问起这个问题,今天我们就来在给大家详细普及下,今天以NXP的汽车级芯片MPC5744p的flexCAN为例,MPC系列是基于PowerPC架构的,和ARM架构的芯片时由区别的,但NXP家的PPC架构和ARM架构如果都是flexCAN的IP,那么驱动基本上可以通用,之前的文章也可供参考。
今天我们来一步步看如何在flexcan上配置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
CAN波特率
对于MPC57xx系列,主要时配置寄存器CAN_CTRL1
其中PRESDIV位域就是用来设置波特率预分频器的,也就是设置时间量子的时钟。
首先CAN控制器的时钟由两个入口
CAN总线控制寄存器1主要就是来设置位时间的几个域,TSEG1段用于设置传播段和相位缓冲段1,TSEG2用于设置相位缓冲段2,搞清楚这几个域的配置后,我们就可以来动手配置了,例如要求配置波特率位500k,使用总线时钟160MHz 4分频为CAN模块时钟(CAN模块时钟也可以配置为外部晶振,推荐正式项目,配置为外部晶振,当然如果你的板子有晶振的话),则我们可以配置如下:
预分频配置为4,
传输段配置为7,则为8个时间量子
PSEG1 配置为7,则根据数据手册描述,相位缓冲段1为8个时间量子 PSEG2配置为 2, 则根据数据手册描述,相位缓冲段2为3个时间量子
根据CAN标准,同步段一般为一个时间量子,
则波特率计算如下
波特率 = 1/(8 + 8 + 3 + 1) * 40000000/4 = 500kbps, 同理可配置其他波特率,当然同一种波特率,这几个域可以配为不同的值。也可以参考以下推送,里面有详细的推导过程。
如果时采用SDK 配置, 那么SDK只需要填入波特率,便会主动分配每个段的值,但是我们还是要知道和搞清楚会自己配置。