从AUTOSAR角度理解CAN以及CANFD
一、AUTOSAR对CAN和CAN FD的基础定位
- CAN:基于传统CAN 2.0B协议,是AUTOSAR早期版本(如4.0.3及之前)的核心车载通信协议,支持最大8字节 payload,仲裁段波特率通常≤1Mbps,适用于低带宽、高实时性场景(如车身控制、底盘控制)。
- CAN FD:作为CAN的扩展协议,在AUTOSAR 4.2.2及以上版本中被正式支持,解决了传统CAN带宽限制问题,支持可变数据速率(仲裁段保持低波特率兼容传统CAN,数据段可提升至8Mbps)和更长payload(最大64字节,部分硬件支持2048字节),适用于高带宽场景(如自动驾驶传感器数据、诊断报文)。
二、AUTOSAR通信栈模块中的CAN与CAN FD差异
AUTOSAR通信栈对CAN/CAN FD的支持通过分层模块实现,核心模块包括Can Driver
(硬件驱动层)、CanIf
(CAN接口层)、CanTp
(CAN传输协议层)、PDU Router
(PDU路由层)等,两者的差异主要体现在以下模块:
1. Can Driver(硬件抽象层,MCAL层)
- 功能定位:直接与CAN控制器硬件交互,负责帧的发送/接收、波特率配置、错误检测等底层操作。
- CAN与CAN FD的核心差异:
- 波特率配置:
- CAN仅需配置单一波特率(仲裁段=数据段);
- CAN FD需配置双波特率:
- 标称波特率(Nominal Bit Rate):仲裁段使用,需与传统CAN节点兼容(如500kbps);
- 数据波特率(Data Bit Rate):数据段使用,可更高(如2Mbps、5Mbps),由
BRS
(Bit Rate Switch)位触发切换。
- 位时间配置:
- CAN的位时间由
SYNC_SEG
+PROP_SEG
+PHASE_SEG1
+PHASE_SEG2
组成(固定结构); - CAN FD需分别配置仲裁段位时间(与CAN兼容)和数据段位时间(更短,支持高速率),且需设置
SJW
(同步跳转宽度)适配时钟偏差。
- CAN的位时间由
- 帧格式支持:
- CAN仅支持标准帧(11位ID)和扩展帧(29位ID),payload≤8字节;
- CAN FD支持
FD帧
(含FDF
位标识),payload可配置为64字节(基础)或2048字节(扩展,需硬件支持),且需处理EDL
(扩展数据长度)、BRS
、ESI
(错误状态指示)等新增控制位。
- 波特率配置:
2. CanIf(CAN接口层,服务层)
- 功能定位:作为
Can Driver
与上层模块(如CanTp
、PDU Router
)的中间层,负责帧的路由、优先级管理、状态反馈等。 - CAN与CAN FD的核心差异:
- 帧类型区分:
- CanIf需通过
PduId
区分CAN帧和CAN FD帧,在配置中明确帧的类型(CanIfFrameType
:CAN_FRAME_STD
/CAN_FRAME_EXT
vsCAN_FD_FRAME_STD
/CAN_FD_FRAME_EXT
)。
- CanIf需通过
- payload长度适配:
- 对于CAN帧,CanIf限制payload≤8字节;
- 对于CAN FD帧,CanIf需支持64/2048字节的payload,并确保与下层
Can Driver
的缓冲区大小匹配(配置CanIfTxBufferSize
、CanIfRxBufferSize
)。
- 回调函数扩展:
- 新增针对CAN FD的状态回调(如
CanIf_Callback_FdTxConf
、CanIf_Callback_FdRxInd
),通知上层CAN FD帧的发送确认/接收指示。
- 新增针对CAN FD的状态回调(如
- 帧类型区分:
3. CanTp(CAN传输协议层,服务层)
- 功能定位:负责长帧的分段与重组(基于ISO 15765-2),支持超过8字节的payload传输。
- CAN与CAN FD的核心差异:
- 分段需求减少:
- 传统CAN因payload≤8字节,长帧需大量分段(如100字节数据需13个分段帧);
- CAN FD支持64字节payload,长帧分段数显著减少(如100字节仅需2个分段帧),降低
CanTp
的处理开销。
- 超时配置适配:
- CAN FD数据段波特率更高,
CanTp
需调整超时参数(如N_As
、N_Ar
),避免因传输速度提升导致的超时误判。
- CAN FD数据段波特率更高,
- 分段需求减少:
4. 诊断与错误管理
- 错误处理:
- CAN与CAN FD共享基础错误检测机制(如CRC校验、位填充错误、ACK错误),但CAN FD的CRC字段更长(32位,传统CAN为15位),错误检测能力更强;
- AUTOSAR的
Can
模块通过Can_GetErrorState
接口反馈错误状态(如CAN_ERROR_ACTIVE
/CAN_ERROR_PASSIVE
),CAN FD需额外处理因波特率切换导致的同步错误。
- 诊断报文:
- 诊断服务(如UDS)通过
CanTp
传输,CAN FD可支持更长的诊断报文(如大容量DTC数据),减少交互次数。
- 诊断服务(如UDS)通过
三、AUTOSAR配置工具中的CAN与CAN FD差异
在AUTOSAR配置工具(如Vector DaVinci Configurator、EB tresos Studio)中,CAN与CAN FD的配置差异主要体现在:
- 控制器配置:需为CAN FD控制器单独设置
Nominal Bit Rate
和Data Bit Rate
,并关联对应的位时间参数(TSEG1
、TSEG2
、SJW
)。 - 帧配置:在
CanIf
模块中,需为CAN FD帧指定Frame Format
为CAN_FD
,并设置Max Data Length
(64/2048)。 - 硬件抽象层(MCAL)适配:需选择支持CAN FD的
Can Driver
(如Vector VN1630的驱动),并配置控制器的FD Mode
使能。
四、兼容性与迁移要点
- 向下兼容:CAN FD节点可与传统CAN节点共存于同一总线(仲裁段波特率兼容),但传统CAN节点无法解析CAN FD帧(会将其视为错误帧)。
- AUTOSAR版本依赖:若需支持CAN FD,ECU的AUTOSAR版本需≥4.2.2,且
Can
、CanIf
、CanTp
模块需启用FD功能(通过CanFdSupport
开关配置)。
总结
从AUTOSAR角度看,CAN FD是对传统CAN的功能扩展,而非替代:
- 两者共享核心通信栈架构(
Can Driver
→CanIf
→CanTp
),但CAN FD在波特率配置、payload长度、帧格式上引入了新特性; - AUTOSAR通过分层模块的功能扩展(如双波特率支持、长帧处理),实现了对CAN FD的兼容,同时保持与传统CAN的互操作性;
- 实际应用中需根据带宽需求(低带宽用CAN,高带宽用CAN FD)和AUTOSAR版本,选择合适的协议并配置对应的模块参数。