一、簡介
該規范描述了CAN收發器驅動程序模塊的功能,API和配置。 CAN收發器驅動程序模塊負責處理ECU上的CAN收發器硬件芯片。
CAN收發器是一種硬件設備,可將CAN總線上使用的信號電平調整為微控制器識別的邏輯(數字)信號電平。此外,收發器還能夠
檢測電氣故障,例如布線問題,接地偏移或長主導信號的傳輸。 根據與微控制器的接口,它們會標記檢測到的錯誤,該錯誤由單個端口引腳匯總,或者由SPI非常詳細。
一些收發器支持電源控制並通過CAN總線喚醒。 不同的喚醒/睡眠和電源概念在市場上很普遍。
在汽車環境中,主要使用三種不同的CAN總線物理方法。 它們是用於高速CAN(最高1Mbits / s)的ISO11898,用於低速CAN(最高125Kbits / s)的ISO11519和用於單線CAN的SAE J2411。
最新發展包括系統基礎芯片(SBC),其中除了CAN之外還實現了電源控制和高級看門狗。 它們被封閉在一個殼體中並且通過單個接口(例如,通過SPI)進行控制。
介紹操作模式跳轉狀態圖,幾種模式POWER_ON, NOT_ACTIVE, ACTIVE, SLEEP,NORMAL, STANBY mode ,根據收發器的不同可以多幾個模式狀態。
通過CanTrcv_SetOpMode(CANTRCV_TRCVMODE_NORMAL) 調用切換模式。
1.1 三種喚醒類型:
1.1.1
MCU未上電。
包括CAN收發器硬件在內的ECU部件均已通電。
所考慮的CAN收發器處於休眠模式。
CAN收發器硬件檢測到CAN總線上的喚醒事件。
CAN收發器硬件導致MCU上電。
就AUTOSAR而言,這是冷啟動,而不是喚醒。
1.1.2
MCU處於低功耗模式。
ECU的部分(包括CAN收發器硬件)已通電。
所考慮的CAN收發器處於STANDBY模式。
CAN收發器硬件檢測到CAN總線上的喚醒事件。
CAN收發器硬件導致SW中斷喚醒。
就AUTOSAR而言,這是作為CAN通道和MCU的喚醒而保持的。
1.1.3
MCU處於全功率模式。
至少包括ECU收發器硬件在內的ECU部件已通電。
所考慮的CAN收發器處於待機模式。
CAN收發器硬件檢測到CAN上的喚醒事件。
CAN收發器硬件或者導致SW中斷喚醒,或者被周期性地輪詢喚醒事件。
就AUTOSAR而言,這被保留為CAN通道的喚醒
1.2啟用/禁用喚醒通知
CanTrcv驅動程序應使用ICU驅動程序提供的以下API來啟用和禁用喚醒事件通知:
-Icu_EnableNotification
-Icu_DisableNotification
CanTrcv驅動程序應確保以下幾點以避免丟失喚醒事件:
當收發器轉換到待機模式時,它將啟用ICU通道
當收發器轉換到正常模式時,它將禁用ICU通道
CAN收發器驅動程序提供兩種喚醒模式:
在NOT_SUPPORTED模式下,CAN收發器驅動程序不產生任何喚醒。 所有CAN收發器硬件類型均支持此模式。
在輪詢模式下,CAN收發器驅動程序產生的喚醒可能會導致CAN通道喚醒。 在這種模式下,無法喚醒MCU。
該模式假定使用的CAN收發器硬件類型支持。 喚醒模式POLLING需要源代碼中包含函數CanTrcv_CheckWakeup和主函數CanTrcv_MainFunction。
主要功能CanTrcv_MainFunction將由BSW調度程序調用,而CanTrcv_CheckWakeup將由CanIf調用。
喚醒模式的選擇由配置參數CanTrcvWakeUpSupport完成。 可以通過配置參數CanTrcvWakeup-ByBusUsed為每個CAN收發器單獨打開和關閉喚醒支持。
注意:在兩種模式下,均應存在功能CanTrcv_CheckWakeup,但該功能應基於配置的喚醒模式(NOT_SUPPORTED或POLLING)。
實施提示:
如果在檢測到喚醒后CAN收發器需要由軟件啟動的特定狀態轉換(例如,睡眠->正常),則可以在執行CanTrcv_CheckWakeup期間由CanTrcv模塊完成。 此行為是特定於實現的。
必須通過模塊的配置來保證,當收發器需要特定的狀態轉換時,涉及喚醒過程(EcuM,CanIf,ICU等)的模塊將調用CanTrcv_CheckWakeup。
1.3驅動程序初始化的前提條件
CanTrcv模塊的環境應確保在調用CanTrcv_Init之前,所有必需的BSW驅動程序(由CanTrcv模塊使用)已初始化且可用。 ⌋(SRS_BSW_00172)
CAN總線收發器驅動程序使用Spi和Dio驅動程序來控制CAN總線收發器硬件。 因此,在初始化CAN總線收發器驅動程序之前,這些驅動程序必須可用並且可以運行。
CAN收發器驅動程序可能對初始化序列和對收發器設備的訪問有時序要求,這些使用的底層驅動程序必須滿足這些要求。
1)CAN總線收發器驅動程序初始化的調用必須在加電后非常早地執行,以便能夠為ECU中的所有其他用戶及時從收發器硬件中讀取所有必要的信息。
2) 所使用的基礎服務的運行時間非常短且同步,以使驅動程序能夠使其自身的時序要求受到所使用的硬件設備的限制。
3)由於某些硬件設備將端口引腳級別配置,因此驅動程序的運行時間可能會延長。 在再次將其更改為特定狀態(例如睡眠)之前需要50μs。
1.4實例概念
等待狀態
為了更改操作模式,CAN收發器硬件可能必須執行等待狀態。
[SWS_CanTrcv_00230] CANCAN收發器驅動程序應使用時間服務Tm_BusyWait1us16bit來實現收發器狀態更改的等待時間。
1.5具有選擇性喚醒功能的收發器
例如TJA1131
本節介紹了具有選擇性喚醒功能的CAN收發器的要求。
部分聯網是CAN系統中的一種狀態,其中某些節點處於低功耗模式,而其他節點正在通信。 這減少了整個網絡的功耗。 低功耗模式下的節點被預定義的喚醒幀喚醒。
除了普通收發器提供的喚醒模式喚醒(WUP)之外,還可以通過喚醒幀/幀(WUF)喚醒支持選擇性喚醒的收發器。
如果收發器硬件支持選擇性喚醒,則應使用配置參數CanTrcvHwPnSupport進行指示
用於選擇性喚醒功能(CanTrcvPartialNetwork)和以下API的配置容器:
-8.4.7 CanTrcv_GetTrcvSystemData,
-8.4.8 CanTrcv_ClearTrcvWufFlag,
-8.4.9 CanTrcv_ReadTrcvTimeoutFlag,
-8.4.10 CanTrcv_ClearTrcvTimeoutFlag和
-8.4.11 CanTrcv_ReadTrcvSilenceFlag
僅在CanTrcvHwPnSupport = TRUE時存在
如果支持選擇性喚醒,則必須將CAN收發器配置為使用參數CanTrcvPnFrameCanId,CanTrcvPnFrameCanIdMask和CanTrcvPnFrameDataMask在特定的CAN幀或一組CAN幀上喚醒。
如果收發器具有識別總線故障的能力(並區分總線故障和其他硬件故障),則應使用配置參數CanTrcvBusErrFlag指示該收發器以用於總線診斷目的
對於支持選擇性喚醒功能的CAN收發器,在正常模式(CANTRCV_TRCVMODE_NORMAL)期間可以檢測喚醒幀。 收發器WUF標志用信號通知檢測到的喚醒幀。 這樣可確保在過渡到待機模式期間不會丟失喚醒幀
(CANTRCV_TRCVMODE_STANDBY
二、函數定義
2.1 CanTrcv_Init
void CanTrcv_Init( const CanTrcv_ConfigType* ConfigPtr )
初始化CanTrcv模塊。
CanTrcv_Init函數將根據所有連接的CAN收發器的初始化順序和配置(由參數ConfigPtr提供)對它們進行初始化。 同時,它還應支持AUTOSAR堆棧的配置順序
CanTrcv_Init函數應將CAN收發器硬件設置為由配置參數CanTrcvInitState配置的狀態。
請注意,在加電和調用CanTrcv_Init之間的時間間隔內,CAN收發器硬件可能處於不同的狀態。 這取決於硬件和SPAL驅動程序配置。
復位(例如加電)后的初始化順序是CAN收發器驅動器的關鍵階段。
此API應在初始化期間存儲喚醒事件(如果有)。
如果得到硬件支持,CanTrcv_Init將驗證是否由於收發器活動而喚醒,如果為TRUE,則應通過API EcuM_SetWakeupEvent向EcuM進行報告,並在CanTrcvWakeupSourceRef中引用喚醒源
如果啟用了選擇性喚醒並由硬件支持,則必須通過CanTrcv_Init API檢查收發器狀態的POR和SYSERR標志。
如果設置了SYSERR標志,則應通過API EcuM_SetWakeupEvent將喚醒報告給EcuM,該喚醒源的值根據CanTrcvSyserrWakeupSourceRef引用的符號名稱值在位位置的位置為“ 1”,其他位置為“ 0”。
如果與收發器的通信不存在/通信不正確,則CanTrcv_Init函數應將運行時錯誤代碼CANTRCV_E_NO_TRCV_CONTROL報告給默認錯誤跟蹤器,並返回E_NOT_OK。
例如,存在不同的收發器類型和不同的訪問方式(端口連接,SPI)。 如果您發現與硬件的任何通訊錯誤,則應發出此開發錯誤的信號。 根據連接類型和收發器硬件的不同,您可能無法在必須用信號通知錯誤的情況下運行。
為了實現AUTOSAR局部網絡機制,CAN收發器必須支持喚醒幀的數據掩碼的定義(CanTrcvPnFrameDataMask的配置結構是強制性的)
2.2 CanTrcv_SetOpMode
Std_ReturnType CanTrcv_SetOpMode( uint8 Transceiver, CanTrcv_TrcvModeType OpMode )
將收發器的模式設置為值OpMode
如果收發器處於CANTRCV_TRCVMODE_NORMAL模式,則CanTrcv模塊的用戶應調用OpMode = CANTRCV_TRCVMODE_STANDBY或CANTRCV_TRCVMODE_NORMAL的函數CanTrcv_SetOpMode。
如果收發器處於CANTRCV_TRCVMODE_STANDBY模式,則CanTrcv模塊的用戶應調用OpMode = CANTRCV_TRCVMODE_SLEEP或CANTRCV_TRCVMODE_STANDBY的函數CanTrcv_SetOpMode。
此API適用於每個收發器,其參數CanTrcv_SetOpMode的每個值均與收發器硬件是否支持這些模式無關。 這是為了簡化CanIf到分配的總線的視圖。
如果底層收發器硬件不支持請求的模式,則函數CanTrcv_SetOpMode將返回E_NOT_OK
如果硬件支持選擇性喚醒:收發器狀態的標志POR和SYSERR將由CanTrcv_SetOpMode API檢查。
如果設置了POR標志,則收發器應重新初始化以運行收發器的配置序列
如果未設置SYSERR標志且請求的模式為CANTRCV_NORMAL,則收發器應為相應的抽象CanIf Trans-ceiverId調用API CanIf_ConfirmPnAvailability()。
CanIf_ConfirmPnAvailability通知CanNm(通過CanIf和CanSm)啟用了選擇性喚醒。
如果與收發器的通信不正確/不正確,則函數CanTrcv_SetOpMode將向默認錯誤跟蹤器報告運行時錯誤代碼CANTRCV_E_NO_TRCV_CONTROL並返回E_NOT_OK。
如果為模塊CanTrcv啟用了開發錯誤檢測:
如果使用OpMode = CANTRCV_TRCVMODE_STANDBY調用函數CanTrcv_SetOpMode,並且收發器不在CANTRCV_TRCVMODE_NORMAL或CANTRCV_TRCVMODE_STANDBY模式下,則CanTrcv_SetOpMode函數將產生開發錯誤E_NOT_OK
如果為模塊CanTrcv啟用了開發錯誤檢測:
如果以OpMode = CANTRCV_TRCVMODE_SLEEP調用函數CanTrcv_SetOpMode,並且收發器不在CANTRCV_TRCVMODE_STANDBY或CANTRCV_TRCVMODE_SLEEP模式下,則CanTrcv_SetOpMode函數將引發開發錯誤E_NOT_OK
.
如果為模塊CanTrcv啟用了開發錯誤檢測:
如果在CanTrcv模塊初始化之前調用,函數CanTrcv_SetOpMode將向其他方向引發開發錯誤CANTRCV_E_UNINIT(如果禁用了DET),返回E_NOT_OK
如果啟用了模塊CanTrcv的開發錯誤檢測:如果使用無效的收發器編號調用,則函數CanTrcv_SetOpMode將引發開發錯誤CANTRCV_E_INVALID_TRANSCEIVER,否則(如果禁用了DET)則返回E_NOT_OK。
如果啟用了針對模塊CanTrcv的開發錯誤檢測:如果使用無效的OpMode調用,則函數CanTrcv_SetOpMode將引發開發錯誤CANTRCV_E_PARAM_TRCV_OPMODE,否則(如果禁用了DET)則返回E_NOT_OK。
2.3 CanTrcv_GetOpMode
獲取收發器的模式並以OpMode返回
2.4CanTrcv_GetBusWuReason
獲取收發器的喚醒原因,並在參數Reason中返回它
功能CanTrcv_GetBusWuReason將在參數Reason中收集CAN收發器檢測到的喚醒原因。 ⌋()
檢測和區分可能的喚醒原因的能力在很大程度上取決於CAN收發器硬件。
請注意,如果有多個總線可用,則每條總線可能會報告不同的喚醒原因。 例如。 如果ECU具有CAN,則可能會發生CAN喚醒,並且傳入的數據可能會引起另一CAN總線的內部喚醒。
CAN收發器驅動程序具有“每條總線”視圖,並且在內部不投票更重要的原因或順序。 如果例如 一個收發器控制電源,另一個收發器僅通電或不通電。
在配置階段靜態設置了受支持的總線數
如果與收發器的通信不正確/不正確,則函數CanTrcv_GetBusWuReason必須將運行時錯誤代碼CANTRCV_E_NO_TRCV_CONTROL報告給默認錯誤跟蹤器,並返回E_OK。
2.5CanTrcv_ SetWakeupMode
根據TrcvWakeupMode啟用,禁用或清除收發器的喚醒事件。
啟用:如果使用TrcvWakupMode = CANTRCV_ WUMODE_ENABLE調用功能CanTrcv_SetWakeupMode,並且如果CanTrcv模塊具有針對所尋址總線的暫掛存儲喚醒事件,
則CanTrcv模塊應將其喚醒事件更新為“ present”。 ⌋
禁用:如果使用TrcvWakeupMode = CANTRCV_ WUMODE_DISABLE調用功能CanTrcv_SetWakeupMode,則在所尋址的收發器上禁用喚醒事件。
收發器設備和收發器驅動程序需要檢測喚醒事件並將其存儲在內部,以便在再次啟用喚醒模式時引發喚醒事件。
清除:如果使用TrcvWakeupMode = CANTRCV_ WUMODE_CLEAR調用功能CanTrcv_SetWakeupMode,則在尋址的收發器上清除存儲的喚醒事件
當禁用喚醒通知時,必須使用喚醒事件清除功能,以清除所有在高層控制下存儲的喚醒事件。
2.6 CanTrcv_GetTrcvSystemData
讀取收發器配置/狀態數據,並通過參數TrcvSysData返回。 僅當CanTrcvHwPnSupport = TRUE時,此API才存在。
功能CanTrcv_GetTrcvSystemData將讀取CAN收發器的配置/狀態,並將讀取的數據存儲在外部參數TrcvSysData中。 如果成功,則應返回E_OK。
2.7 CanTrcv_ClearTrcvWufFlag
清除收發器硬件中的WUF標志。 僅當CanTrcvHwPnSupport = TRUE時,此API才存在。
CanTrcv_ClearTrcvWufFlag函數應清除CAN收發器中的喚醒標志。 如果成功,則應返回E_OK。
實施提示:
CanSM模塊將使用此API來確保在進入低功耗模式期間不會丟失任何幀喚醒事件。 該API清除WUF標志。
清除WUF標志后,應將CAN收發器置於待機模式(CANTRCV_STANDBY)。
如果在啟用選擇性喚醒功能時發生系統錯誤(SYSERR,例如配置錯誤),則收發器將禁用該功能。 收發器將在下一個CAN喚醒模式(WUP)下喚醒。
如果發生其他任何硬件錯誤(例如幀檢測錯誤),如果收發器內部的錯誤計數器溢出,則收發器將喚醒
CanTrcv應通過回調通知CanIf_ClearTrcvWufFlagIndication來通知CanIf已為請求的收發器清除了喚醒標志,該回調通知引用了具有抽象CanIf TransceiverId的相應CAN收發器
2.8 CanTrcv_ReadTrcvTimeoutFlag
從收發器硬件讀取超時標志的狀態。 僅當CanTrcvHwPnSupport = TRUE時,此API才存在。
2.8 CanTrcv_ClearTrcvTimeoutFlag
2.9 CanTrcv_ReadTrcvSilenceFlag
從收發器硬件讀取靜音標志的狀態。 僅當CanTrcvHwPnSupport = TRUE時,此API才存在。
3.10 CanTrcv_CheckWakeup
如果檢測到喚醒中斷,基礎CANIF將調用服務
3.11 CanTrcv_SetPNActivationState
API將收發器的喚醒配置為待機和睡眠模式:通過遠程喚醒模式(標准CAN喚醒)或配置的遠程喚醒幀喚醒CAN收發器
3.12 CanTrcv_CheckWakeFlag
請求從收發器硬件檢查喚醒標志的狀態
CanTrcv應通過回調通知CanIf_CheckTrcvWakeFlagIndication通知CanIf已檢查具有相應TransceiverId的CAN收發器的喚醒標志。
3.13 CanTrcv_DeInit
取消初始化CanTrcv模塊。
功能CanTrcv_DeInit必須將CAN收發器硬件設置為NOT_ACTIVE狀態。⌋(SRS_Can_01108)
在狀態NOT_ACTIVE中,CAN收發器硬件允許以新的配置順序進行重新配置
3.14 CanTrcv_MainFunction
CanTrcv_MainFunction必須掃描STANDBY和SLEEP中的所有總線以了解喚醒事件。
該功能應設置喚醒事件標志以執行這些事件
3.15 CanTrcv_MainFunctionDiagnostics
定期讀取收發器的診斷狀態,並相應地設置產品/開發。
循環功能CanTrcv_MainFunctionDiagnostics應定期讀取收發器狀態,並相應地報告生產/開發錯誤。
僅當CanTrcvBusErrFlag = TRUE時,循環函數CanTrcv_MainFunctionDiagnostics才存在。
由於CanTrcv是驅動程序模塊,因此它不為底層模塊提供任何回調函數。
3.2 強制性接口
CanIf_TrcvModeIndication
該服務指示收發器狀態轉換,該狀態參考具有抽象CanIf TransceiverId的對應的CAN收發器
Det_ReportRuntimeError
報告運行時錯誤的服務。 如果已經配置了標注,則應調用該標注