<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CAN、LIN報文的發送過程詳解

832065824 ? 來源:汽車電子嵌入式 ? 作者:汽車電子嵌入式 ? 2022-11-14 10:02 ? 次閱讀

前言

最近在研究AUTOSAR通信協議棧的時候發現對IPDU的Trigger Transmit很是疑惑,產生了以下幾個問題:

(1)Com模塊的IPDU的trigger發送和CanIf或者Can模塊的Trigger發送一樣嗎?

(2)怎么通過CanIf模塊發送trigger IPDU?

(3)哪個模塊完成Can trigger IPDU的判斷?

(4)請說明Can IPDR的Trigger Transmit的整個過程?

(5)Lin IPUD和Can IPDU的trigger transmit有何異同?

本文先梳理一遍CAN、LIN報文的發送過程,然后回答這些問題。

AUTOSAR 通信服務-Com模塊概念詳解

AUTOSAR 通信服務-PDU Router

AUTOSAR CAN通信協議棧分析(3)-CanIf

Can通信協議棧分析(1)-Can Driver

73bed7f6-63a7-11ed-8abf-dac502259ad0.png

正文

1.CAN報文IPDU的發送過程

1.1 COM模塊發送IPDU

73ed8394-63a7-11ed-8abf-dac502259ad0.png

在COM模塊中,周期報文通過Com_MainFunctionTx周期調度函數發送,事件觸發型報文通過Com_TriggerIPDUSend通信服務接口發送。無論是Com_MainFunctionTx還是Com_TriggerIPDUSend最后都是調用PDUR模塊的PduR_ComTransmit來發送報文,且傳入到PduR模塊的PduInfo->SDU數據buffer指針不為NULL。

740b9f1e-63a7-11ed-8abf-dac502259ad0.png

74573bea-63a7-11ed-8abf-dac502259ad0.png

1.2 PDUR模塊發送IPDU

747d2cf6-63a7-11ed-8abf-dac502259ad0.png

強調Com模塊過來的Can IPDU->SDU一定不為NULL是因為它會影響報文的發送方式(1.3章節詳解)。PduR模塊對于Com模塊的CAN IPDU直接調用CanIf_Transmit發送,CanIf收到IPDU發送請求后直接調用CanDriver的接口發送報文,Copy Data到CanController發送。

74ac4220-63a7-11ed-8abf-dac502259ad0.png

PduR模塊的PduRestPdu配置容器提供了PduRDestPduDatProvision配置參數來配置每一個發送報文是直接發送還是觸發式發送。

Note: 在ETAS的集成配置環境ISOLAR中這個參數無論配置成啥都不影響PduR模塊的配置代碼。個人認為這個PduR模塊對于Can報文的發送都是直接調用CanIf_Transmit,確實不需要這個參數,所以到底是ISOLAR有問題還是確實這個參數不影響代碼的生成還有待研究。

1.3 CanIf模塊發送IPDU

74df1128-63a7-11ed-8abf-dac502259ad0.png

CanIf模塊提供CanIfTrggerTransmitSupport配置參數來配置CanIf模塊是否支持Trigger方式發送報文。

7510126e-63a7-11ed-8abf-dac502259ad0.png

CanIf為每一Tx IPDU提供了CanIfTxPduTriggerTransmit的配置參數。如果該報文的上層發送模塊是PduR模塊且配置了該參數為True,這在PduR模塊就是生成PduR_CanIfTriggerTransmit的函數。

1.3.1 DIRECT發送

75a1dc80-63a7-11ed-8abf-dac502259ad0.png

CanIf模塊的CanIf_Transmit接口函數本身并不會判斷傳入的IPDU是否是需要Trigger發送(僅僅會做一些Det的檢測),而是直接調用Can_Write來發送IPDU,由Can模塊通過傳入的IpduInfo->Sdu是否為NULL來確定是DIRECT發送還是TRIGGER發送IPDU。

如果是IpduInfo->Sdu不為NULL,則為DIRECT發送方式,Can_Write直接完成Copy Data into controller完成報文的發送。

1.3.2 Trigger發送

75c9977a-63a7-11ed-8abf-dac502259ad0.png

如果是IpduInfo->Sdu為NULL,則為TRIGGER發送方式,Can_Write --> CanIf_TriggerTransmit --> PduR_CanIfTriggerTransmit --> Com_TriggerTransmit完成IpduInfo->Sdu into Controller的數據拷貝,也就是所謂的Trigger數據發送。

1.4 Can模塊發送IPDU

75fa0fd6-63a7-11ed-8abf-dac502259ad0.png

Can模塊提供CanTriggerTransmitEnable配置參數來配置是否使用Trigger Transmit功能。Can模塊完成IPDUD最終的Trigger發送。

2.LIN報文IPUD的發送過程

2.1 COM模塊發送IPDU

COM模塊統一了所有IPUD的處理方式,和1.1節完全一樣。

2.2 PDUR模塊發送IPDU

2.2.1 Lin偶發幀sporadic frame發送

761b5812-63a7-11ed-8abf-dac502259ad0.png

Lin報文的周期發送是通過調度表實現的,而Lin調度表存在于LinIf模塊,LinIf模塊在周期調用調度表的時候通過callback的方式實現IPDU的trigger transmit,也就是向上獲取到sdu數據,然后調用Lin_SendFrame發送報文。調度表中的報文都是需要周期發送處理的報文,對于偶發sporadic frame的發送,COM --> PDUR -->CanIf_Transmit中設置發送flag,實現偶發幀發送。

2.2.2 Lin非偶發幀sporadic frame發送

76501642-63a7-11ed-8abf-dac502259ad0.png

2.3 LinIf模塊發送IPDU

76775be4-63a7-11ed-8abf-dac502259ad0.png

LinIf模塊實現Lin調度表中報文的周期發送,且所有報文都是通過調用pdur模塊的PduR_TriggerTransmit的callback函數完成sdu數據的獲取。

76a35622-63a7-11ed-8abf-dac502259ad0.png

LinIf模塊的LinIfTxPdu配置容器中提供了LinifTxTriggerTransmitUL的配置參數,但是這個參數依賴于LinIfUserTxUL參數,如果LinIfUserTxUL配置為PDUR,則LinifTxTriggerTransmitUL參數不管有無配置,則一定為PduR_TriggerTransmit,也就是PduR模塊一定會生成一個PduR_TriggerTransmit配置callback函數。

2.4 Lin模塊發送IPDU

Lin模塊沒有trigger transmit的判斷,提供Lin_SendFrame的接口即可。

3.問題回答

問題1:Com模塊的IPDU的trigger發送和CanIf或者Can模塊的Trigger發送一樣嗎?

答:Com模塊的IPDU的trigger發送和CanIf或者Can模塊的Trigger發送不一樣。

Com模塊的trigger transmit是某個事件觸發是調用Com_TriggerIPDUSend發送IPDU,但是無論是Com的周期發送Com_MainFunctionTx還是Com_TriggerIPDUSend發送IPDU,都是調用PduR_ComTransmit,而PDUR->CanIf->Can對于Com來的IPDU都是統一以DIRECT的方式直接Copy Data到Can Controller。

CanIf模塊本身不做IPDU是否需要trigger transmit的判斷,而是直接將IpudInfoPtr傳遞給Can模塊,Can模塊中通過IpduInfoPtr->Sdu是否為NULL來絕對是使用DIRECT的方式還是trigger transmit/也就是向上調用callback后set buffer來發送報文。

問題2:怎么通過CanIf模塊發送trigger IPDU?

答:CanIfUser(可以自定義一個模塊,或者是其他模塊)在調用CanIf_Transmti發送報文的時候傳入的IpduInfoPtr->Sdu == NULL同時CAN模塊需要enable trigger transmit就可以實現CAN IPDU使用CanIf模塊trigger transmit。

問題3:哪個模塊完成Can trigger IPDU的判斷?

答:CanDriver模塊。

問題4:請說明Can IPDR的Trigger Transmit的整個過程?

答:CanDriver模塊通過判斷CanIf模塊傳入的IpduInfoPtr-Sdu為NULL且Can模塊enbale了trigger transmit后調用CanIf_TriggerTransmt -> PduR_TriggerTransmt -> Com_TriggerTransmt完成Copy Data into Controller的數據拷貝操作,之后通過Can發送報文。

問題5:Lin IPDU和Can IPDU的trigger transmit有何異同?

答:

相同點:IPDU的trigger transmit都是最后調用Com_TriggerTransmit函數實現的。

不同點:Lin IPDU如果是非偶發幀(sporadic frame)在通過調度表發送時都是使用trigger transmit分方式發送的且COM -> PDUR對LIN IPDU的發送無影響;而Can IPDU的周期發送主要是通過COM -> PDUR向下傳遞IpduInfoPtr通過DIRECT方式發送的。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CAN
    CAN
    +關注

    關注

    56

    文章

    2497

    瀏覽量

    460484
  • LIN
    LIN
    +關注

    關注

    4

    文章

    193

    瀏覽量

    39978

原文標題:Can/Lin報文的觸發發送(Trigger Transmit)

文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何通過CAN報文TC375傳輸數據?

    從示例 MCMCAN_1_KIT_TC375_LK 和 ADC_Single_Channel_1_TC375_LK 開始,我必須用 CAN 報文發送從模擬通道獲取的數值。 我就是這么做的: void
    發表于 05-28 08:30

    TC387從App跳回PBL在下載SBL,進入SBL后上位機發送CAN報文響應超時,怎么解決?

    你好,我目前實現了 PBL SBL 但目前的問題是:將SBL下載到RAM區域后,通過SBL下載App正常;但從App跳回PBL在下載SBL,進入SBL后上位機發送CAN 報文響應超時。我在SBL中
    發表于 05-24 08:12

    CAN報文為什么會發送失???

    CAN總線調試過程中出現報文發送失敗。很多工程師都對此只知其一不知其二,今天我們就以CAN報文
    的頭像 發表于 04-12 08:25 ?585次閱讀
    <b class='flag-5'>CAN</b><b class='flag-5'>報文</b>為什么會<b class='flag-5'>發送</b>失???

    CAN報文格式和發送總流程

    在標準格式中,報文的起始位稱為幀起始(SOF),然后是由11位標識符和遠程發送請求位(RTR)組成的仲裁場。RTR位標明是數據幀還是請求幀,在請求幀中沒有數據字節。
    發表于 04-11 10:07 ?1071次閱讀
    <b class='flag-5'>CAN</b>的<b class='flag-5'>報文</b>格式和<b class='flag-5'>發送</b>總流程

    TC387模塊CAN0的節點2作為CANA使用,CANA既收不到報文也發不出報文如何解決?

    TC387模塊CAN0的節點2作為CANA使用,CAN1的節點0作為CANB使用,配置基本相同。但CANB的通信正常,而在TJA1145正常情形下,CANA既收不到報文,也發不出報文,
    發表于 02-19 06:43

    MCU怎樣判斷CAN發送狀態?

    (); } 如此配置發現在一幀報文發送完了后,不能進入can發送中斷, 2、能有別的標志位來判斷can
    發表于 02-18 08:33

    CAN FD在發送報文時會有發不出去的現象怎么解決?

    現象描述: 在發送多幀報文數據時,出現了較為嚴重的報文丟失現象。編寫測試程序,在for循環中循環發送id為0-7ff的報文,對返回值進行了判
    發表于 02-02 07:48

    TC364&amp;TJA1145特定CAN報文丟失怎么解決?

    客戶現場進行急加速和急減速過程中,出現了特定ID的報文丟失,其它報文發送正常,CAN這一塊用的工具配置生成,家里進行測試Busoff后能正常
    發表于 01-23 06:03

    TSMaster報文發送的信號生成器操作說明

    信號生成器功能是TSMaster分析中的報文發送模塊。信號生成器用于發送和配置每個CAN/LIN信號的值變化行為,簡而言之,這是一個可以控制
    的頭像 發表于 12-23 08:21 ?443次閱讀
    TSMaster<b class='flag-5'>報文</b><b class='flag-5'>發送</b>的信號生成器操作說明

    接收UDP報文過程

    物理網線發送到網卡 網絡驅動程序會把網絡中的報文讀出來放到 ring buffer 中,這個過程使用 DMA(Direct Memory Access),不需要 CPU 參與 內核從 ring
    的頭像 發表于 11-11 11:22 ?552次閱讀
    接收UDP<b class='flag-5'>報文</b>的<b class='flag-5'>過程</b>

    車載時鐘同步can_tsync同步原理

    master在t01時刻以廣播的形式發送一個sync報文,并把時間秒部分的時間放到報文上,發送到time slave;使用can conf
    的頭像 發表于 10-27 14:32 ?1201次閱讀
    車載時鐘同步<b class='flag-5'>can</b>_tsync同步原理

    CAN FD報文時間計算

    1us),數據域波特率為5Mbps(位時間200ns)時,其報文時間 = 1us * 26 + 33 * 200ns = 32.6us。 那么一秒鐘最多可以發送報文呢?由于報文發送成功
    的頭像 發表于 07-18 10:49 ?1728次閱讀
    <b class='flag-5'>CAN</b> FD<b class='flag-5'>報文</b>時間計算

    一幀CAN報文多少字節

    一幀CAN FD報文位數 根據CAN FD幀結構組成,可以算出一幀CAN FD報文位數: CAN
    的頭像 發表于 07-18 10:48 ?5862次閱讀

    詳解常用的CAN總線(上):報文

    CAN總線是一種常用的總線,對于剛開始接觸CAN總線的,面對著各式各樣的資料,可能不知道從何看起,今天科普一下CAN總線的基礎知識。
    發表于 06-19 17:20 ?1612次閱讀
    <b class='flag-5'>詳解</b>常用的<b class='flag-5'>CAN</b>總線(上):<b class='flag-5'>報文</b>幀

    M453單片機的CAN中斷接力發送發送報文數量丟失怎么解決?

    發送狀態,但是在發送過程中由于我使用查詢發送請求寄存器來判斷是否發送完成,該步驟可能有問題,導致待發送出去的
    發表于 06-15 07:26
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>