TTCAN驱动器详细规范
目录
- 1. 概述
- 2. TTCAN控制器状态机
- 3. TTCAN模块架构
- 4. TTCAN时间触发操作序列
- 5. TTCAN错误处理流程
- 6. 总结
1. 概述
TTCAN(Time-Triggered CAN)驱动器是AUTOSAR基础软件模块,基于ISO 11898-4标准实现时间触发通信。本文档基于AUTOSAR_SWS_TTCANDriver规范,通过PlantUML图表详细展示TTCAN驱动器的架构、状态机、操作序列和错误处理机制。
TTCAN驱动器作为CAN驱动器的扩展,提供以下核心功能:
- 时间触发通信:支持基于时间窗口的消息传输调度
- 全局时间同步:实现网络节点间的精确时间同步
- 错误检测与处理:提供多级错误检测和恢复机制
- 主从模式支持:支持时间主节点和从节点的角色管理
2. TTCAN控制器状态机
2.1 状态机概述
TTCAN控制器状态机定义了控制器在运行过程中的各种状态及其转换条件。状态机包含四个主要状态:STOPPED、SYNCHRONIZING、IN_GAP和IN_SCHEDULE。
TTCAN控制器状态机图展示了控制器的四种主要状态及其转换关系
2.2 状态详细说明
2.2.1 STOPPED状态
- 含义:控制器停止状态,不参与总线通信
- 特征:
- 控制器完全停止,不发送或接收任何消息
- 等待启动命令
- 硬件资源处于低功耗状态
- 进入条件:系统初始化或严重错误后
- 退出条件:收到
Can_SetControllerMode(CAN_CS_STARTED)
调用
2.2.2 SYNCHRONIZING状态
- 含义:控制器正在尝试与总线同步
- 特征:
- 尝试与全局总线时间同步
- 不发送错误帧和确认
- 监听参考消息以获取时间基准
- 进入条件:从STOPPED状态启动后
- 退出条件:同步完成或发生严重错误
2.2.3 IN_GAP状态
- 含义:控制器在基本周期结束间隙中
- 特征:
- 等待下一个参考消息
- 准备进入调度状态
- 处理时间间隙相关操作
- 进入条件:同步完成或基本周期结束
- 退出条件:参考消息结束,进入调度状态
2.2.4 IN_SCHEDULE状态
- 含义:控制器正常时间触发操作
- 特征:
- 按矩阵周期传输消息
- 执行预定义的时间窗口调度
- 处理独占和仲裁时间窗口
- 进入条件:参考消息结束
- 退出条件:基本周期结束或发生错误
2.3 状态转换说明
2.3.1 正常转换流程
- STOPPED → SYNCHRONIZING:通过
Can_SetControllerMode(CAN_CS_STARTED)
启动 - SYNCHRONIZING → IN_GAP:同步完成后自动转换
- IN_GAP → IN_SCHEDULE:参考消息结束后转换
- IN_SCHEDULE → IN_GAP:基本周期结束后转换
2.3.2 错误转换流程
- 任何状态 → STOPPED:发生严重错误(S3)时强制转换
- 错误转换会取消待处理消息并禁用自动错误恢复
2.4 代码示例
/* TTCAN控制器状态机实现 */
typedef enum {TTCAN_STATE_STOPPED, /* 停止状态 */TTCAN_STATE_SYNCHRONIZING, /* 同步状态 */TTCAN_STATE_IN_GAP, /* 间隙状态 */TTCAN_STATE_IN_SCHEDULE /* 调度状态 */
} TTCAN_ControllerStateType;/* 状态机处理函数 */
void TTCAN_ControllerStateMachine(void)
{TTCAN_ControllerStateType currentState;TTCAN_ErrorLevelType errorLevel;/* 获取当前状态 */currentState = TTCAN_Internal_GetControllerState();/* 检查错误级别 */TTCAN_GetErrorLevel(&errorLevel);switch (currentState) {case TTCAN_STATE_STOPPED:/* 处理停止状态 */if (TTCAN_Internal_IsStartRequested()) {TTCAN_Internal_SetState(TTCAN_STATE_SYNCHRONIZING);TTCAN_Internal_StartSynchronization();}break;case TTCAN_STATE_SYNCHRONIZING:/* 处理同步状态 */if (TTCAN_Internal_IsSynchronized()) {TTCAN_Internal_SetState(TTCAN_STATE_IN_GAP);TTCAN_Internal_EnterGapMode();} else if (errorLevel.errorLevel == TTCAN_ERROR_S3) {TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);TTCAN_Internal_HandleSevereError();}break;case TTCAN_STATE_IN_GAP:/* 处理间隙状态 */if (TTCAN_Internal_IsReferenceMessageReceived()) {TTCAN_Internal_SetState(TTCAN_STATE_IN_SCHEDULE);TTCAN_Internal_StartSchedule();} else if (errorLevel.errorLevel == TTCAN_ERROR_S3) {TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);TTCAN_Internal_HandleSevereError();}break;case TTCAN_STATE_IN_SCHEDULE:/* 处理调度状态 */if (TTCAN_Internal_IsBasicCycleEnd()) {TTCAN_Internal_SetState(TTCAN_STATE_IN_GAP);TTCAN_Internal_EnterGapMode();} else if (errorLevel.errorLevel == TTCAN_ERROR_S3) {TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);TTCAN_Internal_HandleSevereError();} else {TTCAN_Internal_ProcessTimeWindows();}break;default:/* 错误处理 */TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);break;}
}
3. TTCAN模块架构
3.1 架构概述
TTCAN模块采用分层架构设计,包含应用层、中间层和硬件抽象层。该架构确保了模块间的清晰分离和良好的可维护性。
TTCAN模块架构图展示了从应用层到硬件层的完整组件结构
3.2 层次结构说明
3.2.1 应用层
- TTCAN应用:使用TTCAN服务的上层应用程序
- 职责:提供业务逻辑和用户接口
- 功能点:
- 调用TTCAN接口API
- 处理TTCAN事件通知
- 管理应用级配置
3.2.2 中间层
-
TTCAN接口(TtcanIf):提供统一的应用接口
- 职责:API抽象和事件管理
- 功能点:
- 提供标准化的API接口
- 管理事件通知和回调
- 数据格式转换和验证
- 错误处理和状态管理
-
TTCAN驱动器(TtcanDrv):核心驱动模块
- 职责:硬件控制和业务逻辑实现
- 功能点:
- 时间触发通信管理
- 全局时间同步控制
- 错误检测和处理
- 调度管理
3.2.3 硬件抽象层
- TTCAN控制器:硬件控制器抽象
- CAN收发器:物理层通信组件
- 看门狗驱动器:系统监控组件
3.3 接口说明
3.3.1 时间API
- 提供的服务:时间查询和设置服务
- 调用方式:同步调用,返回当前时间信息
3.3.2 同步API
- 提供的服务:同步状态查询和控制服务
- 调用方式:同步调用,管理同步参数
3.3.3 错误通知
- 提供的服务:错误事件通知服务
- 调用方式:异步回调,通知错误状态变化
3.3.4 硬件控制
- 提供的服务:硬件资源控制服务
- 调用方式:直接硬件访问,控制硬件状态
3.4 代码示例
/* TTCAN模块接口定义 */
#define TTCAN_E_OK 0x00 /* 操作成功 */
#define TTCAN_E_NOT_INITIALIZED 0x01 /* 模块未初始化 */
#define TTCAN_E_INVALID_PARAM 0x02 /* 参数无效 */
#define TTCAN_E_TIMEOUT 0x03 /* 操作超时 *//* TTCAN接口函数声明 */
Std_ReturnType TtcanIf_Init(const TtcanIf_ConfigType* ConfigPtr);
Std_ReturnType TtcanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr);
Std_ReturnType TtcanIf_ReadRxPduData(PduIdType RxPduId, PduInfoType* PduInfoPtr);
Std_ReturnType TtcanIf_GetControllerTime(uint8 Controller, TTCAN_TimeType* GlobalTime,TTCAN_TimeType* LocalTime,TTCAN_TimeType* CycleTime,uint8* CycleCount);/* TTCAN驱动器函数声明 */
Std_ReturnType Ttcan_Init(const Ttcan_ConfigType* ConfigPtr);
Std_ReturnType Ttcan_SetControllerMode(uint8 Controller, Ttcan_ControllerStateType Transition);
Std_ReturnType Ttcan_Write(Ttcan_HwHandleType Hth, const Ttcan_PduType* PduInfoPtr);
void Ttcan_MainFunction_Write(void);
void Ttcan_MainFunction_Read(void);/* 错误通知回调函数 */
void TtcanIf_TTSevereError(uint8 Controller, TtcanIf_TTSevereErrorEnumType ErrorType);
void TtcanIf_TTTimingError(uint8 Controller, TtcanIf_TTTimingErrorIRQType ErrorType);/* 模块配置结构 */
typedef struct {uint8 moduleId; /* 模块标识符 */boolean moduleEnabled; /* 模块启用状态 */uint8 maxControllers; /* 最大控制器数量 */Ttcan_ControllerConfigType* controllerConfig; /* 控制器配置数组 */
} Ttcan_ConfigType;/* 控制器配置结构 */
typedef struct {uint8 controllerId; /* 控制器标识符 */boolean controllerEnabled; /* 控制器启用状态 */Ttcan_MasterSlaveModeType masterSlaveMode; /* 主从模式 */Ttcan_SyncModeType syncMode; /* 同步模式 */uint16 cycleTime; /* 周期时间 */uint8 matrixCycleCount; /* 矩阵周期计数 */
} Ttcan_ControllerConfigType;
4. TTCAN时间触发操作序列
4.1 操作序列概述
TTCAN时间触发操作序列展示了从系统初始化到正常通信的完整流程,包括初始化、启动、时间触发传输和错误处理等关键阶段。
TTCAN时间触发操作序列图展示了完整的系统交互流程
4.2 序列阶段说明
4.2.1 系统初始化阶段
- 场景:系统启动时的初始化过程
- 触发条件:系统上电或复位
- 参与者:
- TTCAN应用:发起初始化请求
- TTCAN接口:处理初始化请求
- TTCAN驱动器:执行硬件初始化
- TTCAN控制器:完成硬件配置
4.2.2 控制器启动阶段
- 场景:控制器从停止状态启动并同步
- 触发条件:初始化完成后
- 参与者:
- TTCAN应用:发起启动请求
- TTCAN接口:调用启动函数
- TTCAN驱动器:控制启动过程
- TTCAN控制器:执行状态转换
- CAN总线:提供参考消息
4.2.3 时间触发传输阶段
- 场景:正常的时间触发通信过程
- 触发条件:控制器进入调度状态
- 参与者:
- TTCAN应用:提供传输数据
- TTCAN接口:管理传输请求
- TTCAN驱动器:执行传输调度
- TTCAN控制器:硬件传输执行
- CAN总线:物理传输介质
4.2.4 错误处理阶段
- 场景:错误检测和处理过程
- 触发条件:检测到错误事件
- 参与者:
- TTCAN控制器:错误检测
- TTCAN驱动器:错误处理
- TTCAN接口:错误通知
- TTCAN应用:错误响应
4.3 关键函数说明
4.3.1 Can_Init()
- 描述:初始化TTCAN驱动器,配置硬件参数和数据结构
- 参数:
- ConfigPtr [输入]:配置参数指针,类型:const Ttcan_ConfigType*
- 返回值:
- E_OK:初始化成功
- E_NOT_OK:初始化失败
- 相关函数:
- 上层:TtcanIf_Init()
- 下层:硬件初始化函数
4.3.2 Can_SetControllerMode()
- 描述:设置控制器运行模式,控制状态转换
- 参数:
- Controller [输入]:控制器ID,类型:uint8
- Transition [输入]:目标状态,类型:Ttcan_ControllerStateType
- 返回值:
- E_OK:模式设置成功
- E_NOT_OK:模式设置失败
- 相关函数:
- 上层:TtcanIf_SetControllerMode()
- 下层:硬件控制函数
4.3.3 Can_Write()
- 描述:写入传输数据到硬件对象
- 参数:
- Hth [输入]:硬件传输句柄,类型:Ttcan_HwHandleType
- PduInfoPtr [输入]:PDU信息指针,类型:const Ttcan_PduType*
- 返回值:
- E_OK:写入成功
- E_NOT_OK:写入失败
- 相关函数:
- 上层:TtcanIf_Transmit()
- 下层:硬件写入函数
4.4 代码示例
/* TTCAN系统初始化示例 */
Std_ReturnType TTCAN_SystemInit(void)
{Std_ReturnType result;Ttcan_ConfigType config;/* 配置TTCAN模块 */config.moduleId = TTCAN_MODULE_ID;config.moduleEnabled = TRUE;config.maxControllers = 1;/* 配置控制器 */config.controllerConfig[0].controllerId = 0;config.controllerConfig[0].controllerEnabled = TRUE;config.controllerConfig[0].masterSlaveMode = TTCAN_SLAVE_MODE;config.controllerConfig[0].syncMode = TTCAN_SYNC_MODE;config.controllerConfig[0].cycleTime = 1000; /* 1ms */config.controllerConfig[0].matrixCycleCount = 64;/* 初始化TTCAN接口 */result = TtcanIf_Init(&config);if (result != E_OK) {return E_NOT_OK;}/* 初始化TTCAN驱动器 */result = Ttcan_Init(&config);if (result != E_OK) {return E_NOT_OK;}return E_OK;
}/* TTCAN控制器启动示例 */
Std_ReturnType TTCAN_StartController(uint8 controllerId)
{Std_ReturnType result;/* 设置控制器为启动状态 */result = Ttcan_SetControllerMode(controllerId, TTCAN_CS_STARTED);if (result != E_OK) {return E_NOT_OK;}/* 等待控制器进入同步状态 */TTCAN_ControllerStateType state;uint8 retryCount = 0;do {Ttcan_GetControllerState(controllerId, &state);if (state == TTCAN_STATE_SYNCHRONIZING) {break;}if (retryCount++ > TTCAN_MAX_RETRY_COUNT) {return E_NOT_OK; /* 超时 */}/* 延时等待 */Os_DelayMs(10);} while (TRUE);return E_OK;
}/* TTCAN时间触发传输示例 */
Std_ReturnType TTCAN_TransmitMessage(uint8 controllerId, uint32 messageId, uint8* data, uint8 dataLength)
{Std_ReturnType result;Ttcan_PduType pduInfo;Ttcan_HwHandleType hth;/* 配置PDU信息 */pduInfo.id = messageId;pduInfo.length = dataLength;pduInfo.sdu = data;pduInfo.swPduHandle = 0;/* 获取硬件传输句柄 */hth = Ttcan_GetHth(controllerId, messageId);if (hth == TTCAN_INVALID_HTH) {return E_NOT_OK;}/* 写入传输数据 */result = Ttcan_Write(hth, &pduInfo);if (result != E_OK) {return E_NOT_OK;}return E_OK;
}/* TTCAN主函数示例 */
void TTCAN_MainFunction(void)
{/* 处理传输 */Ttcan_MainFunction_Write();/* 处理接收 */Ttcan_MainFunction_Read();/* 处理状态机 */TTCAN_ControllerStateMachine();
}
5. TTCAN错误处理流程
5.1 错误处理概述
TTCAN错误处理流程定义了系统如何检测、分类、评估和处理各种类型的错误,确保系统的可靠性和安全性。
TTCAN错误处理流程图展示了完整的错误检测和处理机制
5.2 错误分类说明
5.2.1 开发错误
- CAN_TT_E_NOT_MASTER (0x08):TTCAN控制器不是潜在时间主节点
- CAN_TT_E_NOT_CURRENT_MASTER (0x09):TTCAN控制器不是当前时间主节点
- CAN_TT_E_CONSEQUTIVE_DISC (0x0a):连续发送两个Disc_bit设置的参考消息
- CAN_TT_E_SYNC_DISABLED (0x0b):外部同步在配置期间被禁用
5.2.2 运行时错误
- 无运行时错误定义:TTCAN规范中未定义运行时错误
5.2.3 瞬态故障
- 无瞬态故障定义:TTCAN规范中未定义瞬态故障
5.2.4 生产错误
- 无生产错误定义:TTCAN规范中未定义生产错误
5.2.5 扩展生产错误
- 无扩展生产错误定义:TTCAN规范中未定义扩展生产错误
5.3 错误级别评估
5.3.1 S0 - 无错误
- 处理方式:继续正常操作
- 恢复策略:无需特殊处理
5.3.2 S1 - 警告
- 处理方式:调用
CanIf_TTTimingError()
通知应用层 - 恢复策略:系统继续运行,但记录警告信息
5.3.3 S2 - 错误
- 处理方式:调用
CanIf_TTTimingError()
通知应用层 - 恢复策略:记录错误状态,可能需要干预
5.3.4 S3 - 严重错误
- 处理方式:调用
CanIf_TTSevereError()
通知应用层 - 恢复策略:
- 停止控制器
- 进入STOPPED状态
- 取消待处理消息
- 禁用自动错误恢复
5.4 错误恢复机制
5.4.1 自动恢复
- 适用条件:错误级别 < S3
- 恢复过程:
- 尝试错误恢复
- 检查系统状态
- 评估恢复结果
- 必要时升级错误级别
5.4.2 手动干预
- 适用条件:错误级别 = S3
- 干预方式:
- 系统重启
- 手动复位操作
- 硬件重置
5.5 代码示例
/* TTCAN错误处理函数 */
void TTCAN_ErrorHandler(uint8 controllerId, TTCAN_ErrorType errorType)
{TTCAN_ErrorLevelType errorLevel;Std_ReturnType result;/* 获取错误级别 */result = Ttcan_GetErrorLevel(controllerId, &errorLevel);if (result != E_OK) {return;}/* 根据错误级别处理 */switch (errorLevel.errorLevel) {case TTCAN_ERROR_S0:/* 无错误,继续正常操作 */break;case TTCAN_ERROR_S1:case TTCAN_ERROR_S2:/* 警告或错误级别 */TTCAN_HandleTimingError(controllerId, errorType);break;case TTCAN_ERROR_S3:/* 严重错误级别 */TTCAN_HandleSevereError(controllerId, errorType);break;default:/* 未知错误级别 */break;}
}/* 时间错误处理 */
void TTCAN_HandleTimingError(uint8 controllerId, TTCAN_ErrorType errorType)
{/* 调用接口层错误通知 */CanIf_TTTimingError(controllerId, (TtcanIf_TTTimingErrorIRQType)errorType);/* 记录错误信息 */TTCAN_LogError(controllerId, errorType, TTCAN_ERROR_TIMING);/* 尝试自动恢复 */if (TTCAN_CanAutoRecover(controllerId)) {TTCAN_AttemptRecovery(controllerId);}
}/* 严重错误处理 */
void TTCAN_HandleSevereError(uint8 controllerId, TTCAN_ErrorType errorType)
{/* 调用接口层严重错误通知 */CanIf_TTSevereError(controllerId, (TtcanIf_TTSevereErrorEnumType)errorType);/* 停止控制器 */Ttcan_SetControllerMode(controllerId, TTCAN_CS_STOPPED);/* 取消待处理消息 */TTCAN_CancelPendingMessages(controllerId);/* 禁用自动错误恢复 */TTCAN_DisableAutoRecovery(controllerId);/* 记录严重错误 */TTCAN_LogError(controllerId, errorType, TTCAN_ERROR_SEVERE);
}/* 错误恢复尝试 */
Std_ReturnType TTCAN_AttemptRecovery(uint8 controllerId)
{TTCAN_ControllerStateType currentState;Std_ReturnType result;/* 获取当前状态 */Ttcan_GetControllerState(controllerId, ¤tState);switch (currentState) {case TTCAN_STATE_SYNCHRONIZING:/* 重新尝试同步 */result = TTCAN_RetrySynchronization(controllerId);break;case TTCAN_STATE_IN_SCHEDULE:/* 重新进入调度 */result = TTCAN_RetrySchedule(controllerId);break;default:/* 其他状态无需特殊恢复 */result = E_OK;break;}return result;
}/* 错误日志记录 */
void TTCAN_LogError(uint8 controllerId, TTCAN_ErrorType errorType, TTCAN_ErrorCategory category)
{TTCAN_ErrorLogEntry entry;/* 填充错误日志条目 */entry.timestamp = TTCAN_GetSystemTime();entry.controllerId = controllerId;entry.errorType = errorType;entry.category = category;entry.errorLevel = TTCAN_GetErrorLevel(controllerId);/* 写入错误日志 */TTCAN_WriteErrorLog(&entry);
}/* 开发错误检查 */
Std_ReturnType TTCAN_CheckDevelopmentError(uint8 controllerId, TTCAN_OperationType operation)
{TTCAN_MasterStateType masterState;Std_ReturnType result;switch (operation) {case TTCAN_OP_SET_TIME_COMMAND:/* 检查是否为时间主节点 */result = Ttcan_GetMasterState(controllerId, &masterState);if (result == E_OK) {if (masterState.masterSlaveMode != TTCAN_CURRENT_MASTER) {return TTCAN_E_NOT_CURRENT_MASTER;}}break;case TTCAN_OP_GLOBAL_TIME_PRESET:/* 检查是否为潜在时间主节点 */result = Ttcan_GetMasterState(controllerId, &masterState);if (result == E_OK) {if (masterState.masterSlaveMode == TTCAN_MASTER_OFF) {return TTCAN_E_NOT_MASTER;}}break;default:break;}return E_OK;
}
6. 总结
6.1 技术优势
TTCAN驱动器通过PlantUML图表清晰展示了其架构设计和操作流程,具有以下技术优势:
- 时间触发通信:提供确定性的消息传输时间,满足实时性要求
- 全局时间同步:实现网络节点间的精确时间同步,确保系统一致性
- 分层架构设计:清晰的层次分离,便于维护和扩展
- 完善的错误处理:多级错误检测和恢复机制,提高系统可靠性
- 主从模式支持:灵活的主从角色管理,适应不同应用场景
6.2 应用场景
TTCAN驱动器适用于以下应用场景:
- 汽车电子系统:发动机控制、制动系统、车身电子等
- 工业自动化:实时控制、数据采集、设备监控等
- 航空航天:飞行控制系统、导航系统等
- 医疗设备:实时监控、精确控制等
6.3 关键特性
- 确定性通信:基于时间窗口的确定性消息传输
- 高可靠性:完善的错误检测和处理机制
- 可配置性:灵活的配置参数,适应不同应用需求
- 标准化接口:符合AUTOSAR标准的API接口
- 向后兼容:与标准CAN协议兼容
通过本文档的PlantUML图表和详细解释,读者可以深入理解TTCAN驱动器的架构设计、状态管理、操作流程和错误处理机制,为实际应用开发提供重要参考。