2. S32K3 CAN FD硬件架构解析
S32K3系列MCU内部集成的FlexCAN模块是符合ISO 11898-1:2015标准的CAN FD控制器,支持经典CAN与CAN FD两种帧格式,最高数据段波特率可达8 Mbit/s。理解FlexCAN的硬件架构,是后续进行报文收发配置、RAM分区规划以及PCB设计的基础。本节从模块内部结构出发,逐层剖析消息缓冲区RAM、CAN FD位时序引擎以及收发器接口的硬件设计要点。
FlexCAN模块整体结构
每个FlexCAN实例在S32K3内部由四大部分构成:主机接口与寄存器组、协议引擎(Protocol Engine)、消息缓冲区RAM(Message Buffer RAM)以及位时序与时钟控制逻辑。主机接口通过外设总线与内核相连,提供MCR、CTRL1、CTRL2、ECR、ESR1等控制与状态寄存器;协议引擎负责位填充/去填充、CRC校验、帧格式解析与仲裁;消息缓冲区RAM存放待发送和已接收的报文;位时序引擎则根据CTRL1与CBT寄存器产生采样点和位时间。
S32K3的FlexCAN支持最多64个消息缓冲区(MB),每个MB占用16字节(经典CAN)或更大空间(CAN FD启用时按FDCTRL配置)。RAM总容量与MB数量、是否启用CAN FD、是否启用增强型FIFO(ENFIR)相关。例如,当配置为32个MB且启用CAN FD时,每个MB需要72字节(含8字节控制/状态+64字节数据),总RAM需求约2.3 KB,需在模块初始化时通过MCR寄存器使能并等待FRZACK确认进入冻结模式后再配置。
消息缓冲区RAM的组织与配置
FlexCAN的消息缓冲区RAM是模块内部一块独立的SRAM,不占用系统主SRAM空间。每个MB由控制/状态字段(CS)和数据字段(DATA)组成。在经典CAN模式下,CS占8字节,DATA占8字节,共16字节;启用CAN FD后,若数据长度超过8字节,DATA字段扩展至64字节,单个MB变为72字节。S32K3的FlexCAN支持将多个MB配置为发送或接收,接收MB可进一步组织为FIFO结构以降低CPU中断负载。
配置MB时需注意:首先通过MCR[FRZ]和MCR[HALT]使FlexCAN进入冻结模式,然后设置MCR[RFEN]决定是否启用接收FIFO,再通过RXIMR寄存器设置各MB的接收掩码。每个MB的CS字段中,CODE位域决定该MB的功能(如0b0100为发送数据帧,0b0010为接收数据帧)。发送时,CPU将报文ID、DLC和数据写入MB,然后置位CS[CODE]触发发送;接收时,协议引擎根据掩码匹配ID,将数据写入对应MB并置位CS[CODE]为0b0010,同时置位IFLAG寄存器对应位,CPU通过查询或中断方式读取。
CAN FD位时序引擎
CAN FD与经典CAN最大的区别在于位时序:CAN FD帧的仲裁段使用标称位速率(Nominal Bit Rate),数据段可切换到更高的数据位速率(Data Bit Rate)。S32K3的FlexCAN通过CBT寄存器分别配置两套位时序参数,包括预分频(PRESDIV)、时间段1(TSEG1)、时间段2(TSEG2)和同步跳转宽度(SJW)。
位时间计算公式为:位时间 = (1 + TSEG1 + TSEG2) × 时钟周期 × (PRESDIV + 1)。采样点位于TSEG1结束处,通常建议标称段采样点设在75%~80%,数据段设在70%~80%。以S32K3的CAN时钟40 MHz为例,若标称波特率500 kbit/s,取PRESDIV=0,则每位80个时钟周期,可设TSEG1=59、TSEG2=20,采样点=(1+59)/80=75%。数据段2 Mbit/s时,每位20个时钟周期,设TSEG1=14、TSEG2=5,采样点=(1+14)/20=75%。
需要注意的是,CAN FD的数据段波特率切换发生在BRS位之后,因此收发器必须支持CAN FD的快速边沿。若使用仅支持经典CAN的收发器,数据段高速率会导致位错误。此外,S32K3的FlexCAN支持收发器延迟补偿(TDC),通过FDCTRL[TDCEN]和TDC寄存器配置,用于补偿收发器环路延迟,在数据段波特率高于2 Mbit/s时尤为重要。
收发器接口与硬件设计要点
S32K3的FlexCAN引脚为CAN_TX和CAN_RX,需外接CAN收发器(如TJA1044、TJA1051、TJA1145等)才能接入差分总线。硬件设计需关注以下几点:
- 电源与隔离:收发器通常需要5 V或3.3 V供电,S32K3的IO电平为3.3 V,需确认收发器VIO引脚与MCU电平匹配。若总线侧存在高压或地电位差,应选用带隔离的收发器或外加数字隔离器。
- 终端电阻:CAN总线两端各需一个120 Ω终端电阻,中间节点不接。若使用分裂终端(两个60 Ω串联加中间电容),可改善共模辐射。
- 共模扼流圈:在CAN_H和CAN_L上串联共模扼流圈,可抑制共模噪声,提升EMC性能。
- ESD保护:总线接口处应放置TVS二极管,钳位电压需低于收发器引脚耐压值。
- TX/RX走线:CAN_TX和CAN_RX应尽量短且远离高频时钟线,必要时包地处理。
在S32K3参考设计中,FlexCAN的TX引脚可配置为开漏或推挽输出,RX引脚需使能内部上拉或外部上拉。若使用TJA1145等部分网络收发器,还需通过SPI配置其工作模式,并利用INH引脚控制外部稳压器,实现低功耗唤醒。
典型配置流程与参数示例
以下为S32K3 FlexCAN初始化到CAN FD通信的典型配置顺序(以500 kbit/s仲裁段、2 Mbit/s数据段为例):
1. 使能FlexCAN时钟,释放模块复位
2. 进入冻结模式:MCR[FRZ]=1,等待MCR[FRZACK]=1
3. 配置CTRL1:PRESDIV=0,RJW=3,TSEG1=59,TSEG2=20(500k)
4. 配置CBT:BTF=1,设置数据段TSEG1=14,TSEG2=5(2M)
5. 配置FDCTRL:TDCEN=1,TDCOFF=10,TDCFAIL=0
6. 配置MB:设置RXIMR掩码,初始化发送MB的ID和DLC
7. 退出冻结模式:MCR[FRZ]=0,MCR[HALT]=0
8. 使能中断:IMASK1对应MB位,NVIC使能FlexCAN中断
9. 发送:写MB数据,置CS[CODE]=0b1100(CAN FD发送)
10. 接收:中断中读IFLAG1,清除标志,读取MB数据
上述参数中,TDCOFF=10表示收发器延迟补偿偏移量,需根据实际收发器数据手册的环路延迟(典型值100~200 ns)和CAN时钟周期计算。若CAN时钟为40 MHz,一个时钟周期25 ns,则TDCOFF=延迟/25。例如TJA1044环路延迟约120 ns,TDCOFF取5左右。实际调试时可用示波器观察CAN_H/CAN_L波形,确认采样点位置和位宽是否符合预期。