
汽車電子嵌入式(公眾號/CSDN)開始更新全新的AUTOSAR項目實戰專欄內容,從0到1搭建一個AUTOSAR工程,內容會覆蓋AUTOSAR通信協議棧、存儲協議棧、診斷協議棧、MCAL、系統服務、標定、Bootloader、復雜驅動、功能安全等所有常見功能和模塊,全網同步更新開發設計文檔(后期也會更新視頻內容)。本文為MCAL系列配置-CanTrcv模塊配置實踐。
CanTrcv正常工作是CAN通信正常工作的必要條件,在以下文章中我們詳細介紹過各類收發器的細節內容,其中最主要的就CanTrcv用于休眠喚醒時的功能作用,CanTrcv相關的參考文章:
AUTOSAR架構下CanTrcv休眠喚醒問題再探
TJA1145收發器重要功能介紹
ECU系統休眠后通過診斷報文喚醒ECU且喚醒網絡后快發NM報文
網絡關閉但ECU沒有休眠前如何網絡喚醒
AUTOSAR架構下基于TJA1145收發器通信丟失問題分析
TJA1145異常設置喚醒源導致ECU休眠失敗問題分析
AUTOSAR架構下ECU休眠后連續發送NM報文3S后ECU網絡才被喚醒問題分析
本文作為CanTrcv的基礎入門介紹,僅介紹從0到1如何配置一個CanTrcv模塊并測試其基本功能。
AUTOSAR BSW Tool:Vector
AUTOSAR MCAL Tool:EB
Hardware Platform: Infineon Tricore TC387
Build Tool: Tasking
Debug Tool: UDE
AUTOSAR項目實戰系列文章:
AUTOSAR項目實戰(1)-數據地址訪問對齊問題分析
AUTOSAR項目實戰(2)-內存訪問異常問題分析
AUTOSAR項目實戰(3)-OsCounter訪問權限問題分析
AUTOSAR項目實戰(4)-系統總線及外設錯誤問題分析
AUTOSAR項目實戰(5)-MCU模塊配置實踐
AUTOSAR項目實戰(6)-Port及Dio模塊配置實踐
AUTOSAR項目實戰(7)-程序的啟動地址分析
AUTOSAR項目實戰(8)-Load Bus Error異常問題分析
AUTOSAR架構下XCP從0到1開發配置實踐
AUTOSAR架構下XCP DAQ功能配置實現
SMU Bring up關鍵步驟及注意事項
Retention Ram的具體實現

如上圖所示,TC387的開發板使用了英飛凌公司自己的收發器TLE9251VSJ(一般常用NXP公司的TJA1044, TJA1043, TJA1145這幾個收發器),Pin腳和NXP的TJA1044收發器類似。
VIO和VCC是給芯片供電的,硬件設計上常供電,不需要用戶額外控制供電(一般車載量產控制器收發器的供電是可以通過MCU控制的,應該是考慮的ECU的低功耗)。
STB引腳是高有效(原理圖上的STB上如果有一個“—”就是低有效,沒有“—”就是高有效),開發板直接STB接地(GND),也就是收發器永遠是Normal模式(STB有效就是Standby模式),也就是收發器硬件設計上就永遠處于正常工作狀態。
TXD和RXD和MCU的TXD(Pin20.8)RXD(Pin20.7)直連,CANH和CANL和CAN總線直連。
在《AUTOSAR項目實戰(6)-Port及Dio模塊配置實踐》一文中我們詳細介紹了CanTrcv的Rx和Tx引腳的Port和Dio模塊配置。

CanTrcvGeneral里面沒有特殊需求的時候保持默認配置就行,這里著重介紹幾個比較重要(實際項目中會用到)的配置項:
Dev Error Detect: 是否是能Det, 這個參數在項目開發階段建議勾上,方便我們測試時發現一些低級問題(比如模塊沒有初始化.e.g.)。
User Config File: 可以配置一個xxx.h文件,工具生成代碼的時候會將xxx.h文件中的內容copy到CanTrcv_Cfg.h的最后。通過這個參數可以重映射一些宏定義或者一定函數,在功能安全的函數跨OsApplication中會使用到。可以參考《硬件設計導致Cantrcv靜態代碼不匹配問題分析及解決方案》一文。
Wake Up Support: 配置CanTrcv模塊是否支持喚醒源檢測,這個需要根據實際需求配置。CAN的被動喚醒是一個涉及多模塊的聯動過程,需要一個專題將各個模塊串起來講解才能理解,這里僅將要介紹,深入的相關分析介紹可以參考以下幾篇文章:《AUTOSAR架構下CanTrcv休眠喚醒問題再探》

CanTrcvChannel里面沒有特殊需求的時候保持默認配置就行,這里著重介紹幾個比較重要的配置項:
Icu Channel Ref: CanTrcv模塊中的這個參考一般不會用到。但是關于Icu的Ref參數很多模塊都會有(CanTrcv, Lin, Can .e.g.)詳細的ICU喚醒可以參考《AUTOSAR架構下ICU喚醒詳解》一文。
Por Wakeup Source Ref和Syserr Wakeup Source Ref這兩個參數在使用IO控制的CanTrcv模塊不會用到(引腳也沒有這兩個喚醒源,TJA1043.e.g.),但是SPI控制的CanTrcv硬件(TJA1145.e.g.)有這兩個硬件喚醒事件,需要根據實際需求配置。關于TJA1145的相關功能可以參考《TJA1145異常設置喚醒源導致ECU休眠失敗問題分析》。
Wakeup By Bus Used: 配置CAN總線喚醒是否使能。一個CAN階段的ECU一般都會有一路CAN支持CAN喚醒,根據實際需求配置。
Wakeup Source Ref: 如果這路CAN支持CAN喚醒,這個參數引用一個EcuM模塊的喚醒源。CanTrcv檢測到喚醒事件收會調用EcuM_SetWakeupEvent通知到EcuM模塊,EcuM模塊開始喚醒源校驗。詳細內容可由參考《AUTOSAR 架構下EcuM喚醒源事件詳解》一文。

引用我們在DIO模塊里面配置的CanTrcv的STB和Rx的Dio Channel就行。CanTrcv模塊會使用Dio_ReadChannel和Dio_WriteChannel來讀寫Cantrcv的Rx/STB硬件。
注意:由1章節可知我們的硬件的STB引腳是引腳直接接地的,實際是無法通過軟件控制的。但是為了適配Vector的CanTrcv配置,這里引用的CAN00_STB實際不是CanTrcv的STB引腳引腳。
實際項目中User不會直接調用CanTrcv模塊的API函數來控制CanTrcv, 都是Can Stack的上層模塊調用使用。站在CanTrcv單個模塊來看,我們只要知道:
1.CanTrcv模塊的關鍵API的主要功能以及誰在什么場景下會調用即可。
2.CanTrcv在系統啟動,運行中,下電過程中應該處于什么邏輯狀態即可(關鍵狀態變量)。
CanTrcv_Init: 需要用戶mapping到EcuM的start sequence中去,在ECU的啟動階段由EcuM調用。
CanTrcv_MainFunction: 需要用戶mapping到Os的10ms/其他Task中,Os的10ms任務運行起來后周期調用。
CanTrcv_SetOpMode: ComM的狀態切換會trigger CanSM的狀態切換,CanSM狀態切換后會調用CanIf_SetCanTrcvMode->CanTrcv_SetOpMode來控制CanTrcv切換到Standby, Normal模式。
CanTrcv_CheckWakeup: CanTrcv切換到Standby或者Sleep模式后會調用EcuM_CheckWakeup --> CanIf_CheckWakeup --> CanTrcv_CheckWakeup來檢測CAN Bus喚醒事件。
Vector的TJA1040 SIP包代碼提供了CanTrcv_30_Tja1040_Prob全局變量來觀測CanTrcv的內部狀態。
/* ! The following type includes CAN transceiver channel specific settings. */typedef struct{/* ---- Common attributes ---- *//* ! Last detected wakeup reason */CanTrcv_30_Tja1040_TrcvWakeupReasonType wakeUpReason;/* ! Specifies whether or not to report wakeups */CanTrcv_30_Tja1040_TrcvWakeupModeType wakeUpReport;/* ! HW specific attributes */} CanTrcv_30_Tja1040_Prob_Type;
奇怪的是CanTrcv_30_Tja1040_Prob_Type中并沒有變量可以觀測CanTrcv的邏輯狀態。有問題的時候需要我們Debug代碼去分析當前CanTrcv軟件處于什么邏輯狀態。
CAN報文發送

如果Can報文能正常的發送出來,說明我們的CanTrcv(Can Stack)配置的基本沒有什么問題。
CAN報文接收

我們發送了一陣XCP報文,XCP模塊能正常接收,說明CanTrcv的Rx功能正常。
注意:實際項目中Can的收發中斷最接近硬件狀態,如果通過上冊模塊測試不符合預期,可以通過測試CAN的收發中斷來驗證CanTrcv功能。

CanTrcv_CheckWakeupAPI在我們的項目中暫時沒有場景觸發,CanTrcv_Init和CanTrcv_MainFunction場景比較容易理解,這里不在展示。僅給出CanTrcv_SetOpMode的使用場景。

本文是AUTOSAR架構下CanTrcv模塊的入門級介紹,較為詳細的介紹了如何根據硬件原理圖來配置CanTrcv模塊以及CanTrcv模塊的主要功能和測試方法。雖然CanTrcv模塊相對比較容易簡單,但是在實際工程項目中你可能還得深入了解以下內容:
1.CanTrcv_TJA1040/CanTrcv_TJA1043/CanTrcv_TJA1145的軟硬件是如何配合起來檢測喚醒源的?
2.CanTrcv_TJA1040/CanTrcv_TJA1043/CanTrcv_TJA1145三類典型收發器在項目中切換使用(硬件上換芯片)時需要注意什么事項?
3.ECU的CAN Bus喚醒不了或者喚醒時間太慢該怎么分析?
......等很多細節的問題分析起來也不容易,這就需要量產項目的捶打才能明明。或者關注作者會深入分析這一系列的工程實際問題。
最后,本文第三章節提到的CanTrcv模塊的使用方法可以觸類旁通到其他模塊的學習,需要讀者自己去體會。
End
「汽車電子嵌入式在CSDN上同步推出AUTOSAR精進之路專欄,本專欄每個模塊完全按實際項目中開發及維護過程來詳細介紹。模塊核心概念介紹、實際需求描述、實際工程配置、特殊需求介紹及背后原理、實際工程使用經驗總結。 目的是讓讀者看完每一個章節后能理解原理后根據需求完成一個模塊的配置或者解決一個問題。」
點擊文章最后左下角的閱讀原文可以獲取更多信息
或者復制如下鏈接到瀏覽器獲取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.為便于技術交流,創建了汽車電子嵌入式技術交流群,可盡情探討AP,CP,DDS,SOME/IP等前沿熱點話題,后臺回復“加群”即可加入;
注:本文引用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!
推薦閱讀
汽車電子嵌入式精彩文章匯總第一期:20210530-20230703
汽車電子嵌入式精彩文章匯總第2期
汽車電子嵌入式精彩文章匯總第3期
汽車電子嵌入式精彩文章匯總第4期
End
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,都是我最大的動力!
汽車電子嵌入式
微信掃描二維碼,關注我的公眾號