tms570 can 接收大量数据_CAN通讯系列--AUTOSAR架构的CAN Interface7
上篇文章簡介了AUTOSAR架構(gòu)的CAN Driver模塊,本文將更進一步,來了解CAN Driver模塊對接的唯一上層模塊--CAN Interface。
9 CAN interface
CAN Interface,顧名思義,CAN接口模塊,位于下層的CAN設(shè)備驅(qū)動(CAN Driver,CAN收發(fā)器驅(qū)動)和上層的通訊服務(wù)層(CAN傳輸協(xié)議層,Pdu Router等)之間,如下圖1所示。
圖1 AUTOSAR CAN Layer Model,引自[1]引自[1]:CAN接口模塊由所有與CAN硬件無關(guān)的任務(wù)組成,這些任務(wù)屬于相應(yīng)ECU的CAN通訊設(shè)備驅(qū)動程序。這些功能在CAN接口模塊中執(zhí)行一次,以便底層CAN設(shè)備驅(qū)動程序只專注于訪問和控制相應(yīng)的特定CAN硬件設(shè)備。
CAN接口模塊滿足PDU路由器和上層通信Com模塊的主控制流和數(shù)據(jù)流要求:發(fā)送請求處理、發(fā)送確認/接收指示等。它的數(shù)據(jù)處理和通知API是基于CAN L-SDU,而用于控制和模式處理的API提供了一個與CAN控制器相關(guān)視角。
對于CAN Driver來說,與上層模塊通訊的唯一接口就是CAN接口模塊,通過這個模塊可實現(xiàn)我們熟知的3個ECU通訊功能:
- CAN通訊,通過接口層到PDU Router模塊;(路徑:CanDrv--CanIf--PduR--Com)
- UDS服務(wù),通過接口層到CANTp模塊;(路徑:CanDrv--CanIf--CanTp--PduR--Dcm)
- XCP服務(wù),通過接口層到XCP模塊。(路徑:CanDrv--CanIf--XCP)
本文關(guān)注的是CAN通訊功能,繼續(xù)采用上篇文章menghuyouyou:CAN通訊系列--AUTOSAR架構(gòu)的CAN Driver6 的思路來介紹CAN接口模塊。
考慮到本文主要基于參考[1]而來,不打算對某些細節(jié)展開說明,將主要介紹CAN發(fā)送和接收相關(guān)的函數(shù)。若真有需要研究CAN通訊在CAN接口模塊的具體實現(xiàn),則肯定需要對實現(xiàn)細節(jié)一一研究,比如上篇文章提到的CAN接收和發(fā)送的前提條件有哪些,是什么。接下來我們來CAN接口模塊的發(fā)送和接收操作:
9.1 發(fā)送操作
由前面內(nèi)容可知,發(fā)送時,PduR模塊調(diào)用CanIf_Transmit函數(shù),然后CanIf_Transmit函數(shù)再去調(diào)用Can模塊的Can_Write函數(shù)。
圖3 經(jīng)Can Interface的發(fā)送過程文檔對CanIf_Transmit函數(shù)的定義和描述如下:
圖4 CanIf_Transmit函數(shù)的定義,引自[1]這個函數(shù)兩個輸入?yún)?shù),由TxPduId可解析出相應(yīng)的CAN控制器和Hth,具體如何實現(xiàn)解析的,后文會解釋;PduInfoPtr包含數(shù)據(jù)的長度和內(nèi)容兩個信息,即要發(fā)送的數(shù)據(jù)。關(guān)于這個函數(shù)大致的動作描述如下:
圖5 CanIf_Transmit的動作說明,引自[1]注意:如果Can_Write函數(shù)返回CAN_BUSY,即發(fā)送拒絕,CanIf可以什么都不做,也可以嘗試存儲一條新的PDU或發(fā)送請求到發(fā)送緩存器中;如果發(fā)送成功,Can模塊將通過調(diào)用CanIf_TxConfirmation通知Can接口模塊,有兩種調(diào)用方式:一種是采用輪詢模式,如下圖6,另一種則是采用中斷模式,如下圖7。
圖6 經(jīng)Can Interface的輪詢模式發(fā)送確認圖7 經(jīng)Can Interface的中斷模式發(fā)送確認,引自[1]文檔對CanIf_TxConfirmation函數(shù)的定義如下,使用Id形式與上層確認發(fā)送成功。
圖8 CanIf模塊的確認函數(shù)定義,引自[1]這個函數(shù)將根據(jù)輸入的CanTxPduId進行處理:首先確認功能(CAN通訊?UDS服務(wù)?XCP服務(wù));然后根據(jù)輸入的CanTxPduId查詢獲得已映射的TxPduId,最后再調(diào)用上層模塊的User_TxConfirmation函數(shù),如圖9所示。
圖9 PduR模塊的確認函數(shù)定義,引自[1]這里不確定具體哪個模塊,而使用User,這樣就使得軟件通用性好。從上可知:CAN通訊,User選擇為PduR模塊; UDS服務(wù),User選擇為CanTp模塊; XCP服務(wù),User選擇為XCP模塊。
以上就是發(fā)送操作的大致過程,更多具體細節(jié)詳見[1]。
9.2 接收操作
由前面內(nèi)容可知,接收時,Can模塊將調(diào)用Can接口模塊的CanIf_RxIndication函數(shù),然后再調(diào)用PduR_RxIndication函數(shù),如下圖10所示。
圖10 經(jīng)Can Interface的的接收通知,引自[1]文檔對CanIf_RxIndication函數(shù)的定義如下:
圖11 CanIf模塊的通知函數(shù)定義,引自[1]這個函數(shù)參數(shù)有Mailbox和PduInfoPtr,這兩者包含Hrh, CanId, DLC和data這些信息。概括地講,該函數(shù)包含的動作有:
當CanIf_RxIndication函數(shù)執(zhí)行完上述動作后,將調(diào)用User_RxIndication函數(shù)向上通知,實際CAN通訊功能調(diào)用的是PduR_RxIndication函數(shù)。
圖12 CanIf的上一層模塊的接收通知函數(shù),引自[1]了解上述相關(guān)函數(shù)的基本內(nèi)容后,若要更清晰地理解CAN通訊的發(fā)送和接收過程,還需要注重從數(shù)據(jù)流角度來看,即CanId,收發(fā)數(shù)據(jù)是如何向上或向下傳輸。這里需要介紹CanId的傳輸,實際上,CanId通過映射方式來轉(zhuǎn)化為相應(yīng)模塊的ID。
9.3 ID的相關(guān)映射
CAN接口模塊設(shè)計的初衷就是不能直接訪問硬件,與硬件保持獨立,這也就意味著CAN接口層只能通過CAN模塊的接口去獲取硬件有關(guān)的內(nèi)容,主要使用的CAN模塊接口有Hth和Hrh。關(guān)于Hth和Hrh,首先涉及一個軟件過濾選擇問題,即當Hth和Hrh配置成BasicCAN,則需要在CanIf模塊執(zhí)行軟件過濾;當Hrh和Hth配置成FullCAN,則不需要在在CanIf模塊執(zhí)行軟件過濾,而是在硬件過濾。然后進入上述提到的CanId映射方式,即不同CanId如何映射到Hrh和Hth,以及Hrh和Hth又如何映射到更上層模塊(暫稱為PDU Id),如下圖13所示。
圖13 PDU Ids和Hoh的映射,引自[1]總的來說上圖非常清晰地展現(xiàn)了各種Id的映射,但為了更好理解,下面詳細介紹:
首先,我們知道CAN Controller中有很多硬件對象處理器(Hoh), 在CAN Driver中將Hoh作為接收和發(fā)送用途,接收的叫做Hrh, 發(fā)送的叫做Hth。然后將Hrh和Hoh分別與對應(yīng)的CanId映射起來,如下圖14所示。
圖14 Hoh--(Hrh, Hth)-- CanId映射示意再分別定義CAN模塊與CAN接口模塊的Hrh和Hth的映射,如下圖15。
圖15 (Hrh--CanIf Hrh), (Hth--CanIf Hth)最后建立CanIf Hrh與RxPduID,CanIf Hth與TxPduID的映射,如圖16,即對于CAN通訊功能,建立起了CAN接口模塊與PduR模塊的ID映射。
圖16 (CanIf Hrh--RxPdu ID), (CanIf Hth--TxPdu ID)建立了上述幾種映射后,就非常好理解不同模塊的相關(guān)函數(shù)的參數(shù)關(guān)系(比如indication函數(shù)和confirmation函數(shù))。以接收indication函數(shù)說明,如下圖17所示。
圖17即CAN模塊讀取相關(guān)寄存器的數(shù)據(jù),其中建立CanId與Hrh的映射1,且兩者均為Mailbox的元素;數(shù)據(jù)長度和數(shù)據(jù)為PduInfoPtr的元素。將這些信息傳遞給上一層CAN接口模塊,CAN接口模塊根據(jù)建立的Hrh與CanIf Hrh的映射獲取CanIf Hrh,CanIf Hrh根據(jù)建立的CanIf Hrh與RxPduId的映射2獲取RxPduId。最后,將RxPduId和CAN模塊傳輸?shù)臄?shù)據(jù)傳遞給PduR模塊。通過這個過程不難發(fā)現(xiàn),如果已知RxPduId,則可知對應(yīng)CanId是多少,反之亦然。
如果有過AUTOSAR工具配置經(jīng)驗,不難發(fā)現(xiàn)配置過程大體是按照這種邏輯去建立各種映射關(guān)系,且配置過程中Id設(shè)置要特別注意,必須得對應(yīng)正確,才能保證功能正確。
通過這兩篇文章對CAN模塊和CAN接口模塊的介紹,基本理順了從硬件到軟件的數(shù)據(jù)傳輸和軟件實現(xiàn)的過程,如下圖18上半部分。也就是軟件在這個部分已經(jīng)獲得了相應(yīng)CanId的8個字節(jié)數(shù)據(jù),那么下一步自然要做的就是將接收的這8個字節(jié)數(shù)據(jù)解析成相應(yīng)報文協(xié)議定義的各個信號,或?qū)l(fā)送的信號打包成8個字節(jié)的數(shù)據(jù)。從下篇文章開始介紹圖18的下半部分內(nèi)容。
圖18Reference:
[1] Specification of CAN Interface.
總結(jié)
以上是生活随笔為你收集整理的tms570 can 接收大量数据_CAN通讯系列--AUTOSAR架构的CAN Interface7的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java json 转map_Java对
- 下一篇: batch normalization_