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