4. S32K3时钟与CAN FD位时序配置
CAN FD的通信可靠性,本质上由位时序参数决定。S32K3的FlexCAN模块并不直接使用系统时钟,而是从CAN协议时钟(CAN Protocol Engine Clock)分频得到位时间基准。因此,配置CAN FD的第一步不是打开外设,而是把时钟树理顺,再计算位时序。
一、CAN时钟源选择
S32K3的FlexCAN实例通常挂载在AIPS或AIPS_LS总线上,其协议时钟来自MC_CGM(Clock Generation Module)的CAN_PE时钟分支。该分支的源可选:
- PLL_PHI0:主PLL输出,频率高、抖动小,适合高波特率CAN FD。
- FIRC:快速内部RC,约48 MHz,精度较低,仅适合低速或调试。
- SIRC:慢速内部RC,约32 kHz,一般不用于CAN通信。
工程上推荐使用PLL_PHI0作为CAN_PE源。以S32K344为例,若PLL_PHI0为160 MHz,通过CAN_PE分频器(DCU)可得到80 MHz或40 MHz的CAN协议时钟。注意:FlexCAN的CTRL1[PRESDIV]预分频器是在CAN_PE时钟基础上再分频,得到CAN位时间的基本时间单位Tq。
二、位时序参数计算
CAN FD位时间由四段组成:同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段1(PSEG1)和相位缓冲段2(PSEG2)。在FlexCAN中,这些参数通过CBT和FDCBT寄存器分别配置仲裁段和数据段。
设CAN_PE时钟为f_can_pe,预分频值为PRESDIV,则:
Tq = (PRESDIV + 1) / f_can_pe
位时间 = (SYNC_SEG + PROP_SEG + PSEG1 + PSEG2) × Tq
波特率 = 1 / 位时间
其中SYNC_SEG固定为1个Tq。FlexCAN中CTRL1[PROPSEG]、CTRL1[PSEG1]、CTRL1[PSEG2]均以Tq为单位,且PSEG1和PSEG2实际写入值需减1。
以仲裁段500 kbps、数据段2 Mbps为例,假设CAN_PE = 80 MHz,取PRESDIV = 0,则Tq = 12.5 ns。仲裁段位时间需为2 μs,即160个Tq。可分配为:SYNC_SEG=1,PROP_SEG=63,PSEG1=64,PSEG2=32,合计160 Tq。采样点位于SYNC_SEG+PROP_SEG+PSEG1之后,即(1+63+64)/160 = 80%。
数据段位时间需为500 ns,即40个Tq。可分配为:SYNC_SEG=1,PROP_SEG=15,PSEG1=16,PSEG2=8,合计40 Tq,采样点同样为80%。
三、采样点优化
采样点位置直接影响抗干扰能力和同步余量。CiA 301推荐:仲裁段采样点约87.5%,数据段约70%~80%。S32K3的FlexCAN允许通过CTRL1[SMP]选择单次或三次采样,但CAN FD通常使用单次采样。
优化原则:
- 总线越长、收发器延迟越大,PROP_SEG应越大,采样点适当后移。
- 数据段速率高,PSEG2不宜过小,否则同步跳转宽度不足。
- 同一网络所有节点采样点应尽量一致,偏差不超过几个百分点。
若发现通信误码率偏高,可先用示波器观察CAN_H/CAN_L差分波形,确认位宽与采样点位置,再微调PSEG1/PSEG2。
四、S32K3 Clock Configuration工具使用
S32 Design Studio提供Clock Configuration图形化工具,可直观配置时钟树。操作路径:打开Clock Config视图,选择CAN_PE分支,设置源为PLL_PHI0,调整DCU分频,使CAN_PE输出目标频率。工具会实时显示各节点频率,并生成Clock_Ip_Cfg.c初始化代码。
配置完成后,需在FlexCAN初始化中写入CBT/FDCBT寄存器。注意:修改位时序前应先进入Freeze模式(MCR[FRZ]=1,MCR[HALT]=1),配置完成后再退出。
五、配置检查与验证
完成寄存器写入后,可通过以下方式验证:
- 读取
CBT和FDCBT寄存器,确认写入值与计算一致。 - 用CAN分析仪(如PCAN-USB FD)连接总线,发送标准帧,观察是否出现错误帧。
- 逐步提高数据段速率,记录误码率变化,找到稳定边界。
- 若使用S32K3的Loopback模式,可先自测位时序,再接入真实总线。
CTRL1[PRESDIV]或CBT寄存器前,必须置位MCR[FRZ]和MCR[HALT],否则写入无效。退出Freeze后,FlexCAN会等待总线空闲再同步,期间不应发送报文。
实际项目中,建议将位时序参数整理为配置表,随时钟频率变化同步更新。例如当CAN_PE从80 MHz切换到40 MHz时,PRESDIV需相应调整,否则波特率会减半。S32K3的Clock Configuration工具可导出时钟配置,但位时序寄存器仍需在FlexCAN驱动中手动设置,两者需保持一致。