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驅動器的架構設計、狀態管理、操作流程和錯誤處理機制,為實際應用開發提供重要參考。