AUTOSAR进阶图解==>AUTOSAR_SRS_TTCAN

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 架构组件详解

  1. 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;
    }
  2. 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;
    }
  3. 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);
    }
  4. 应用层与TTCAN的交互

    • 应用层通过COM模块发送消息,不需要直接感知TTCAN的实现细节
    • COM和PDU Router负责将应用消息路由到正确的CAN控制器
    • TTCAN的时间窗口配置对应用是透明的,由底层BSW管理

3. TTCAN配置模型

3.1 配置模型概述

TTCAN的配置模型定义了如何设置和管理时间窗口和硬件对象的映射关系。下图展示了TTCAN配置的主要类及其关系:

3.2 配置参数详解

  1. 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
    };
  2. 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
        }
    };
  3. 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 通信场景详解

  1. 初始化阶段

    • 过程描述
      • 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) {
            /* 等待同步完成 */
        }
    }
  2. 独占时间窗口通信

    • 过程描述
      • 应用程序通过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);
    }
  3. 仲裁时间窗口通信

    • 过程描述
      • 应用程序发送消息经过与独占窗口相同的路径
      • 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);
    }
  4. 事件同步时间触发通信

    • 过程描述
      • CAN控制器接收参考消息
      • 参考消息触发时间同步
      • TTCAN管理器调整时间窗口
      • 同步参数应用到CAN控制器
    • 特点
      • 保持网络节点间的时间同步
      • 支持分布式时钟同步
      • 确保时间触发通信的准确性
    • 代码示例
    c 复制代码
    /* 参考消息接收回调示例 */
    void TTCan_ReferenceMessageReceived(uint8 ControllerId) {
        /* 处理参考消息 */
        TTCan_SynchronizeTimeBase(ControllerId);
        
        /* 更新本地时间 */
        TTCan_AdjustLocalTime(ControllerId);
        
        /* 触发同步事件通知 */
        TTCan_NotifySynchronizationEvent();
    }

5. 总结

AUTOSAR TTCAN实现提供了确定性、可配置的CAN通信解决方案,适用于需要严格时间控制的汽车应用场景。主要优势包括:

  1. 确定性通信

    • 通过独占时间窗口确保关键消息在预定时间发送
    • 提高系统的实时性和可预测性
  2. 灵活配置

    • 支持多种时间窗口类型(独占、仲裁、自由)
    • 支持多种配置时机(预编译、链接时、运行后)
  3. 标准兼容性

    • 完全遵循ISO 11898-4:2004标准
    • 兼容传统CAN通信
  4. 可扩展性

    • 支持TTCAN Level 1和Level 2
    • 可适应不同复杂度的应用需求

TTCAN特别适用于以下应用场景:

  • 安全关键系统(如车辆动态控制、制动系统)
  • 分布式控制系统(如动力传动系统)
  • 需要确定性通信的传感器-执行器网络
  • 要求高实时性的诊断和监控系统