前言
最近在研究AUTOSAR通信協(xié)議棧的時候發(fā)現(xiàn)對IPDU的Trigger Transmit很是疑惑,產(chǎn)生了以下幾個問題:
(1)Com模塊的IPDU的trigger發(fā)送和CanIf或者Can模塊的Trigger發(fā)送一樣嗎?
(2)怎么通過CanIf模塊發(fā)送trigger IPDU?
(3)哪個模塊完成Can trigger IPDU的判斷?
(4)請說明Can IPDR的Trigger Transmit的整個過程?
(5)Lin IPUD和Can IPDU的trigger transmit有何異同?
本文先梳理一遍CAN、LIN報文的發(fā)送過程,然后回答這些問題。
AUTOSAR 通信服務(wù)-Com模塊概念詳解
AUTOSAR 通信服務(wù)-PDU Router
AUTOSAR CAN通信協(xié)議棧分析(3)-CanIf
Can通信協(xié)議棧分析(1)-Can Driver
正文
1.CAN報文IPDU的發(fā)送過程
1.1 COM模塊發(fā)送IPDU
在COM模塊中,周期報文通過Com_MainFunctionTx周期調(diào)度函數(shù)發(fā)送,事件觸發(fā)型報文通過Com_TriggerIPDUSend通信服務(wù)接口發(fā)送。無論是Com_MainFunctionTx還是Com_TriggerIPDUSend最后都是調(diào)用PDUR模塊的PduR_ComTransmit來發(fā)送報文,且傳入到PduR模塊的PduInfo->SDU數(shù)據(jù)buffer指針不為NULL。
1.2 PDUR模塊發(fā)送IPDU
強調(diào)Com模塊過來的Can IPDU->SDU一定不為NULL是因為它會影響報文的發(fā)送方式(1.3章節(jié)詳解)。PduR模塊對于Com模塊的CAN IPDU直接調(diào)用CanIf_Transmit發(fā)送,CanIf收到IPDU發(fā)送請求后直接調(diào)用CanDriver的接口發(fā)送報文,Copy Data到CanController發(fā)送。
PduR模塊的PduRestPdu配置容器提供了PduRDestPduDatProvision配置參數(shù)來配置每一個發(fā)送報文是直接發(fā)送還是觸發(fā)式發(fā)送。
Note: 在ETAS的集成配置環(huán)境ISOLAR中這個參數(shù)無論配置成啥都不影響PduR模塊的配置代碼。個人認為這個PduR模塊對于Can報文的發(fā)送都是直接調(diào)用CanIf_Transmit,確實不需要這個參數(shù),所以到底是ISOLAR有問題還是確實這個參數(shù)不影響代碼的生成還有待研究。
1.3 CanIf模塊發(fā)送IPDU
CanIf模塊提供CanIfTrggerTransmitSupport配置參數(shù)來配置CanIf模塊是否支持Trigger方式發(fā)送報文。
CanIf為每一Tx IPDU提供了CanIfTxPduTriggerTransmit的配置參數(shù)。如果該報文的上層發(fā)送模塊是PduR模塊且配置了該參數(shù)為True,這在PduR模塊就是生成PduR_CanIfTriggerTransmit的函數(shù)。
1.3.1 DIRECT發(fā)送
CanIf模塊的CanIf_Transmit接口函數(shù)本身并不會判斷傳入的IPDU是否是需要Trigger發(fā)送(僅僅會做一些Det的檢測),而是直接調(diào)用Can_Write來發(fā)送IPDU,由Can模塊通過傳入的IpduInfo->Sdu是否為NULL來確定是DIRECT發(fā)送還是TRIGGER發(fā)送IPDU。
如果是IpduInfo->Sdu不為NULL,則為DIRECT發(fā)送方式,Can_Write直接完成Copy Data into controller完成報文的發(fā)送。
1.3.2 Trigger發(fā)送
如果是IpduInfo->Sdu為NULL,則為TRIGGER發(fā)送方式,Can_Write --> CanIf_TriggerTransmit --> PduR_CanIfTriggerTransmit --> Com_TriggerTransmit完成IpduInfo->Sdu into Controller的數(shù)據(jù)拷貝,也就是所謂的Trigger數(shù)據(jù)發(fā)送。
1.4 Can模塊發(fā)送IPDU
Can模塊提供CanTriggerTransmitEnable配置參數(shù)來配置是否使用Trigger Transmit功能。Can模塊完成IPDUD最終的Trigger發(fā)送。
2.LIN報文IPUD的發(fā)送過程
2.1 COM模塊發(fā)送IPDU
COM模塊統(tǒng)一了所有IPUD的處理方式,和1.1節(jié)完全一樣。
2.2 PDUR模塊發(fā)送IPDU
2.2.1 Lin偶發(fā)幀sporadic frame發(fā)送
Lin報文的周期發(fā)送是通過調(diào)度表實現(xiàn)的,而Lin調(diào)度表存在于LinIf模塊,LinIf模塊在周期調(diào)用調(diào)度表的時候通過callback的方式實現(xiàn)IPDU的trigger transmit,也就是向上獲取到sdu數(shù)據(jù),然后調(diào)用Lin_SendFrame發(fā)送報文。調(diào)度表中的報文都是需要周期發(fā)送處理的報文,對于偶發(fā)sporadic frame的發(fā)送,COM --> PDUR -->CanIf_Transmit中設(shè)置發(fā)送flag,實現(xiàn)偶發(fā)幀發(fā)送。
2.2.2 Lin非偶發(fā)幀sporadic frame發(fā)送
2.3 LinIf模塊發(fā)送IPDU
LinIf模塊實現(xiàn)Lin調(diào)度表中報文的周期發(fā)送,且所有報文都是通過調(diào)用pdur模塊的PduR_TriggerTransmit的callback函數(shù)完成sdu數(shù)據(jù)的獲取。
LinIf模塊的LinIfTxPdu配置容器中提供了LinifTxTriggerTransmitUL的配置參數(shù),但是這個參數(shù)依賴于LinIfUserTxUL參數(shù),如果LinIfUserTxUL配置為PDUR,則LinifTxTriggerTransmitUL參數(shù)不管有無配置,則
2.4 Lin模塊發(fā)送IPDU
Lin模塊沒有trigger transmit的判斷,提供Lin_SendFrame的接口即可。
3.問題回答
問題1:Com模塊的IPDU的trigger發(fā)送和CanIf或者Can模塊的Trigger發(fā)送一樣嗎?
答:Com模塊的IPDU的trigger發(fā)送和CanIf或者Can模塊的Trigger發(fā)送不一樣。
Com模塊的trigger transmit是某個事件觸發(fā)是調(diào)用Com_TriggerIPDUSend發(fā)送IPDU,但是無論是Com的周期發(fā)送Com_MainFunctionTx還是Com_TriggerIPDUSend發(fā)送IPDU,都是調(diào)用PduR_ComTransmit,而PDUR->CanIf->Can對于Com來的IPDU都是統(tǒng)一以DIRECT的方式直接Copy Data到Can Controller。
CanIf模塊本身不做IPDU是否需要trigger transmit的判斷,而是直接將IpudInfoPtr傳遞給Can模塊,Can模塊中通過IpduInfoPtr->Sdu是否為NULL來絕對是使用DIRECT的方式還是trigger transmit/也就是向上調(diào)用callback后set buffer來發(fā)送報文。
問題2:怎么通過CanIf模塊發(fā)送trigger IPDU?
答:CanIfUser(可以自定義一個模塊,或者是其他模塊)在調(diào)用CanIf_Transmti發(fā)送報文的時候傳入的IpduInfoPtr->Sdu == NULL同時CAN模塊需要enable trigger transmit就可以實現(xiàn)CAN IPDU使用CanIf模塊trigger transmit。
問題3:哪個模塊完成Can trigger IPDU的判斷?
答:CanDriver模塊。
問題4:請說明Can IPDR的Trigger Transmit的整個過程?
答:CanDriver模塊通過判斷CanIf模塊傳入的IpduInfoPtr-Sdu為NULL且Can模塊enbale了trigger transmit后調(diào)用CanIf_TriggerTransmt -> PduR_TriggerTransmt -> Com_TriggerTransmt完成Copy Data into Controller的數(shù)據(jù)拷貝操作,之后通過Can發(fā)送報文。
問題5:Lin IPDU和Can IPDU的trigger transmit有何異同?
答:
相同點:IPDU的trigger transmit都是最后調(diào)用Com_TriggerTransmit函數(shù)實現(xiàn)的。
不同點:Lin IPDU如果是非偶發(fā)幀(sporadic frame)在通過調(diào)度表發(fā)送時都是使用trigger transmit分方式發(fā)送的且COM -> PDUR對LIN IPDU的發(fā)送無影響;而Can IPDU的周期發(fā)送主要是通過COM -> PDUR向下傳遞IpduInfoPtr通過DIRECT方式發(fā)送的。
審核編輯:郭婷
-
CAN
+關(guān)注
關(guān)注
57文章
2885瀏覽量
466721 -
LIN
+關(guān)注
關(guān)注
4文章
223瀏覽量
40933
原文標題:Can/Lin報文的觸發(fā)發(fā)送(Trigger Transmit)
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
使用CAN以及CANIF配置了S32K310的CAN驅(qū)動模塊,如何進行報文的接收呢?
STM32G473 CAN發(fā)送數(shù)據(jù)出現(xiàn)丟幀怎么解決?
CAN總線與LIN總線的區(qū)別
基于APM32E103 SPI轉(zhuǎn)CAN芯片MCP2515移植測試

CAN底層報文抓到了,卻不知怎么解析?以及如何看到信號運行狀態(tài)?

CAN總線的報文類型介紹
如何在CANtest上通過報文發(fā)送實現(xiàn)CCP指令的發(fā)送
基于VB6.0 實現(xiàn) CAN信號收發(fā) Demo

CYT2BL和SDL v8.0.0是否有可能實現(xiàn)以相同ID發(fā)送和接收CAN報文(RxID、TxID)的功能?
北斗短報文終端如何進行雙向通信?

TC3XX can發(fā)送報文,周期上下波動嚴重怎么解決?
試圖從CAN卡向TC375發(fā)送報文時,TC375始終收不到,為什么?
TSMaster 中不同總線報文消息過濾的操作方式

評論