AUTOSAR TTCAN分析与实现指南
基于AUTOSAR标准的时间触发CAN通信解决方案
目录
- [1. 概述](#1. 概述)
- [2. TTCAN架构](#2. TTCAN架构)
- [2.1 TTCAN架构概述](#2.1 TTCAN架构概述)
- [2.2 架构组件详解](#2.2 架构组件详解)
- [3. TTCAN配置模型](#3. TTCAN配置模型)
- [3.1 配置模型概述](#3.1 配置模型概述)
- [3.2 配置参数详解](#3.2 配置参数详解)
- [4. TTCAN通信流程](#4. TTCAN通信流程)
- [4.1 时间窗口通信序列](#4.1 时间窗口通信序列)
- [4.2 通信场景详解](#4.2 通信场景详解)
- [5. 总结](#5. 总结)
1. 概述
TTCAN(Time-Triggered CAN)是AUTOSAR标准中为实现确定性通信而定义的CAN通信扩展。它基于ISO 11898-4:2004标准,提供了时间触发通信能力,使CAN网络能够以预定义的时间点进行消息传输,从而提高通信的确定性和实时性。
TTCAN的主要特点包括:
- 基于时间窗口的消息调度
- 支持时间同步通信
- 兼容传统的事件触发CAN通信
- 可配置的通信模式
本文档将详细分析AUTOSAR中TTCAN的架构、配置模型和通信流程,以帮助开发者理解和实现TTCAN功能。
2. TTCAN架构
2.1 TTCAN架构概述
AUTOSAR中的TTCAN实现遵循分层设计原则,通过多个组件的协作实现时间触发通信功能。下图展示了TTCAN在AUTOSAR BSW架构中的位置及其与其他组件的关系:

2.2 架构组件详解
-
CAN Driver
- 功能:实现TTCAN硬件抽象,提供硬件对象管理
- 关键特性 :
- 硬件对象可映射到不同类型的时间窗口(SRS_TtCan_41003)
- 支持预编译、链接时和运行后配置(SRS_TtCan_41003)
- 实现ISO 11898-4:2004配置接口(SRS_TtCan_41014)
- 代码示例:
c/* CAN Driver初始化示例,配置TTCAN功能 */ typedef struct { uint8 CanTimeTriggeredMode; /* TTCAN模式启用标志 */ uint8 CanControllerBaseAddress; /* 控制器基地址 */ uint8 CanControllerID; /* 控制器ID */ uint8 CanTimeWindowCount; /* 时间窗口数量 */ uint16 CanCycleTime; /* 通信周期时间(微秒)*/ } Can_TTConfigType; Std_ReturnType Can_Init(const Can_ConfigType* Config) { /* 1. 基本CAN初始化 */ /* 2. TTCAN特定初始化 */ if (Config->CanTimeTriggeredMode == CAN_TT_MODE_ENABLE) { /* 配置TTCAN参数 */ SetControllerTimeTriggeredMode(Config->CanControllerID, TRUE); ConfigureTimeWindows(Config->CanControllerID, Config->TimeWindowConfig, Config->CanTimeWindowCount); } return E_OK; }
-
TTCAN Manager
- 功能:管理TTCAN通信模式和时间窗口
- 关键特性 :
- 配置和管理时间窗口
- 支持ISO 11898-4:2004配置接口
- 支持TTCAN Level 1和Level 2(SRS_TtCan_41001)
- 管理硬件对象到时间窗口的映射
- 代码示例:
c/* TTCAN管理器API示例 */ typedef enum { TTCAN_STATE_UNINIT, /* 未初始化状态 */ TTCAN_STATE_STOPPED, /* 停止状态 */ TTCAN_STATE_STARTED, /* 启动状态 */ TTCAN_STATE_SYNCHRONIZING /* 同步状态 */ } TTCan_StateType; /* 初始化TTCAN管理器 */ Std_ReturnType TTCan_Init(const TTCan_ConfigType* ConfigPtr) { if (ConfigPtr == NULL) { return E_NOT_OK; } /* 配置TTCAN时间窗口 */ for (uint8 i = 0; i < ConfigPtr->TTCanWindowCount; i++) { ConfigureTimeWindow( ConfigPtr->TTCanWindowConfig[i].WindowId, ConfigPtr->TTCanWindowConfig[i].WindowType, ConfigPtr->TTCanWindowConfig[i].WindowStartTime, ConfigPtr->TTCanWindowConfig[i].WindowLength); } /* 配置硬件对象映射 */ for (uint8 j = 0; j < ConfigPtr->TTCanHwObjCount; j++) { MapHwObjectToTimeWindow( ConfigPtr->TTCanHwObjConfig[j].HwObjectId, ConfigPtr->TTCanHwObjConfig[j].TimeWindowType); } return E_OK; }
-
CAN Interface
- 功能:向上层提供统一接口,管理TTCAN帧的传输
- 关键特性 :
- 提供统一API给上层服务
- 转发TTCAN相关配置给CAN Driver
- 处理TTCAN特定消息传输
- 代码示例:
c/* CAN接口发送函数,支持TTCAN */ Std_ReturnType CanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr) { Can_PduType CanPdu; CanIf_TxPduConfigType* TxPduCfgPtr; /* 获取PDU配置 */ TxPduCfgPtr = &CanIf_TxPduConfig[TxPduId]; /* 构建CAN PDU */ CanPdu.id = TxPduCfgPtr->CanId; CanPdu.length = PduInfoPtr->SduLength; CanPdu.sdu = PduInfoPtr->SduDataPtr; /* 如果配置了TTCAN时间窗口,设置相关参数 */ if (TxPduCfgPtr->TTCanWindowId != CANIF_NO_TTCAN_WINDOW) { CanPdu.ttWindowId = TxPduCfgPtr->TTCanWindowId; } /* 发送PDU */ return Can_Write(TxPduCfgPtr->CanHwObjectId, &CanPdu); }
-
应用层与TTCAN的交互
- 应用层通过COM模块发送消息,不需要直接感知TTCAN的实现细节
- COM和PDU Router负责将应用消息路由到正确的CAN控制器
- TTCAN的时间窗口配置对应用是透明的,由底层BSW管理
3. TTCAN配置模型
3.1 配置模型概述
TTCAN的配置模型定义了如何设置和管理时间窗口和硬件对象的映射关系。下图展示了TTCAN配置的主要类及其关系:

3.2 配置参数详解
-
TTCanConfig
- 功能:TTCAN的主配置类,包含所有TTCAN相关配置
- 关键属性 :
- ConfigurationTypes:配置类型(预编译、链接时或运行后)
- HardwareObjectsConfig:硬件对象配置列表
- TimeWindowsConfig:时间窗口配置列表
- 代码示例:
c/* TTCAN配置结构定义 */ typedef struct { uint8 TTCanConfigId; /* 配置ID */ TTCan_ConfigType ConfigType; /* 配置类型 */ uint8 TTCanHwObjCount; /* 硬件对象数量 */ TTCan_HwObjConfigType* TTCanHwObjConfig; /* 硬件对象配置指针 */ uint8 TTCanWindowCount; /* 时间窗口数量 */ TTCan_WindowConfigType* TTCanWindowConfig; /* 时间窗口配置指针 */ } TTCan_ConfigType; /* 配置初始化示例 */ const TTCan_ConfigType TTCanConfig = { .TTCanConfigId = 0, .ConfigType = TTCAN_CONFIG_PRECOMPILE, .TTCanHwObjCount = 3, .TTCanHwObjConfig = TTCanHwObjConfigData, .TTCanWindowCount = 5, .TTCanWindowConfig = TTCanWindowConfigData };
-
TTCanHardwareObject
- 功能:定义硬件对象的配置,使其能够映射到特定时间窗口
- 关键属性 :
- HardwareObjectId:硬件对象的唯一标识符
- TimeWindowType:硬件对象映射的时间窗口类型
- TransmitReceiveConfig:发送或接收配置
- 代码示例:
c/* 硬件对象配置类型定义 */ typedef struct { uint8 HwObjectId; /* 硬件对象ID */ TTCan_WindowTypeEnum TimeWindowType; /* 时间窗口类型 */ TTCan_DirectionType Direction; /* 发送或接收 */ uint8 ControllerId; /* 控制器ID */ } TTCan_HwObjConfigType; /* 硬件对象配置示例 */ const TTCan_HwObjConfigType TTCanHwObjConfigData[3] = { { .HwObjectId = 0, .TimeWindowType = TTCAN_EXCLUSIVE_WINDOW, .Direction = TTCAN_TX, .ControllerId = 0 }, { .HwObjectId = 1, .TimeWindowType = TTCAN_ARBITRATION_WINDOW, .Direction = TTCAN_TX, .ControllerId = 0 }, { .HwObjectId = 2, .TimeWindowType = TTCAN_FREE_WINDOW, .Direction = TTCAN_RX, .ControllerId = 0 } };
-
TTCanTimeWindow
- 功能:定义TTCAN通信周期中的时间窗口
- 关键属性 :
- WindowId:窗口的唯一标识符
- WindowType:窗口类型(独占、仲裁或自由)
- WindowStartTime:窗口开始时间
- WindowLength:窗口持续时间
- 窗口类型说明 :
- 独占窗口:专用于单一消息发送,确保确定性
- 仲裁窗口:多个消息通过标准CAN仲裁机制竞争
- 自由窗口:可自由使用的窗口,无特定限制
- 代码示例:
c/* 时间窗口配置类型定义 */ typedef struct { uint8 WindowId; /* 窗口ID */ TTCan_WindowTypeEnum WindowType; /* 窗口类型 */ uint16 WindowStartTime; /* 窗口开始时间(微秒) */ uint16 WindowLength; /* 窗口长度(微秒) */ } TTCan_WindowConfigType; /* 窗口类型枚举 */ typedef enum { TTCAN_EXCLUSIVE_WINDOW = 0, /* 独占窗口 */ TTCAN_ARBITRATION_WINDOW, /* 仲裁窗口 */ TTCAN_FREE_WINDOW /* 自由窗口 */ } TTCan_WindowTypeEnum; /* 时间窗口配置示例 */ const TTCan_WindowConfigType TTCanWindowConfigData[5] = { { .WindowId = 0, .WindowType = TTCAN_EXCLUSIVE_WINDOW, .WindowStartTime = 0, .WindowLength = 500 }, { .WindowId = 1, .WindowType = TTCAN_ARBITRATION_WINDOW, .WindowStartTime = 500, .WindowLength = 1000 }, { .WindowId = 2, .WindowType = TTCAN_EXCLUSIVE_WINDOW, .WindowStartTime = 1500, .WindowLength = 500 }, { .WindowId = 3, .WindowType = TTCAN_ARBITRATION_WINDOW, .WindowStartTime = 2000, .WindowLength = 1000 }, { .WindowId = 4, .WindowType = TTCAN_FREE_WINDOW, .WindowStartTime = 3000, .WindowLength = 1000 } };
4. TTCAN通信流程
4.1 时间窗口通信序列
TTCAN通信过程包括初始化、配置和不同类型时间窗口中的消息传输。下图展示了典型的TTCAN通信序列:

4.2 通信场景详解
-
初始化阶段
- 过程描述 :
- TTCAN管理器配置CAN驱动的时间窗口映射关系
- CAN驱动将配置应用到CAN控制器硬件
- 完成ISO 11898-4:2004接口配置
- 代码示例:
c/* TTCAN初始化示例 */ void InitializeTTCAN(void) { /* 初始化TTCAN管理器 */ TTCan_Init(&TTCanConfig); /* 启动TTCAN通信 */ TTCan_Start(); /* 等待TTCAN同步 */ while (TTCan_GetState() != TTCAN_STATE_STARTED) { /* 等待同步完成 */ } }
- 过程描述 :
-
独占时间窗口通信
- 过程描述 :
- 应用程序通过COM模块发送消息
- 消息通过PDU Router和CAN接口传递到CAN驱动
- CAN驱动在预定义的独占时间窗口发送消息
- 确保消息在分配的时间窗口内发送,提供确定性
- 特点 :
- 确保关键消息在预定时间发送
- 无需仲裁,避免总线竞争
- 适用于周期性关键数据传输
- 代码示例:
c/* 在独占窗口发送消息的函数示例 */ Std_ReturnType SendExclusiveWindowMessage(uint8 data[8]) { PduInfoType PduInfo; /* 准备PDU数据 */ PduInfo.SduDataPtr = data; PduInfo.SduLength = 8; /* 使用预配置的PDU ID发送消息 */ /* 此PDU已映射到独占时间窗口 */ return Com_SendSignal(COM_SIGNAL_EXCLUSIVE_WINDOW, &PduInfo); }
- 过程描述 :
-
仲裁时间窗口通信
- 过程描述 :
- 应用程序发送消息经过与独占窗口相同的路径
- CAN驱动在仲裁时间窗口内发送消息
- 多个消息可能同时尝试发送,遵循标准CAN仲裁机制
- 特点 :
- 支持多个消息基于优先级的发送
- 保留CAN总线仲裁机制
- 适用于事件触发型消息
- 代码示例:
c/* 在仲裁窗口发送消息的函数示例 */ Std_ReturnType SendArbitrationWindowMessage(uint8 data[8], uint8 priority) { PduInfoType PduInfo; /* 准备PDU数据 */ PduInfo.SduDataPtr = data; PduInfo.SduLength = 8; /* 基于优先级选择PDU ID */ PduIdType PduId = COM_SIGNAL_ARBITRATION_BASE + priority; /* 发送消息,将参与CAN仲裁 */ return Com_SendSignal(PduId, &PduInfo); }
- 过程描述 :
-
事件同步时间触发通信
- 过程描述 :
- CAN控制器接收参考消息
- 参考消息触发时间同步
- TTCAN管理器调整时间窗口
- 同步参数应用到CAN控制器
- 特点 :
- 保持网络节点间的时间同步
- 支持分布式时钟同步
- 确保时间触发通信的准确性
- 代码示例:
c/* 参考消息接收回调示例 */ void TTCan_ReferenceMessageReceived(uint8 ControllerId) { /* 处理参考消息 */ TTCan_SynchronizeTimeBase(ControllerId); /* 更新本地时间 */ TTCan_AdjustLocalTime(ControllerId); /* 触发同步事件通知 */ TTCan_NotifySynchronizationEvent(); }
- 过程描述 :
5. 总结
AUTOSAR TTCAN实现提供了确定性、可配置的CAN通信解决方案,适用于需要严格时间控制的汽车应用场景。主要优势包括:
-
确定性通信
- 通过独占时间窗口确保关键消息在预定时间发送
- 提高系统的实时性和可预测性
-
灵活配置
- 支持多种时间窗口类型(独占、仲裁、自由)
- 支持多种配置时机(预编译、链接时、运行后)
-
标准兼容性
- 完全遵循ISO 11898-4:2004标准
- 兼容传统CAN通信
-
可扩展性
- 支持TTCAN Level 1和Level 2
- 可适应不同复杂度的应用需求
TTCAN特别适用于以下应用场景:
- 安全关键系统(如车辆动态控制、制动系统)
- 分布式控制系统(如动力传动系统)
- 需要确定性通信的传感器-执行器网络
- 要求高实时性的诊断和监控系统