色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

CAN發送的底層邏輯:CANwrite函數機制介紹

冬至子 ? 來源:汽車電子過山車 ? 作者:歡樂皮皮峰 ? 2023-07-17 15:47 ? 次閱讀

1.前言:AUTOSAR通信系列介紹

這個系列是全新的系列,整個系列會通過實際操作,調試實際的代碼,以CAN為例,完整的解析AUTOSAR的從底層MCAL 到COM等上層模塊的通信鏈路層。重點講述數據的流向,以及各個模塊的作用,配置方法。

通過這個系列,將會以代碼的視角,了解如IPDU LPDU SDU HOH HTH HRH MB等AUTOSAR抽象概念的實際實現及其數據結構,以及在真實的AUTOSAR 架構軟件中,CAN CANIF PDUR COM CANTP 等模塊中數據的傳輸,配置參數,函數的調用等各個方面。讓我們在使用AUTOSAR配置通信的同時,不被其架空,不當只會配置的工具人。

系列將會從MCAL自底向上,一步步分析各個模塊,搞清楚整個通信的發送機制,和通信的接收機制。

2.Can_write函數介紹,以及HOH抽象的實施 MessgeBuffer介紹

整個的CAN發送,實際上是由Can模塊里面的Can_write實現的。我們先以S32K14x MCAL代碼為實例,介紹Can_write函數的發送機制,以對L_PDU HOH HTH Message Buffer這些抽象建立起基本的概念。

ECU執行完必要的初始化函數和設置controller模式后,我們就可以調用Can_Write函數來發送報文了。

Can_Write函數的傳入參數有兩個:

  1. hth:hardware transmit handle 硬件傳輸句柄。這個的詳細講解在后面。
  2. PduInfo(此即LPDU Data link Layer protocol)結構體成員如下:
    id:CAN報文ID
    swPduHandle:LPDU 句柄,此句柄在Canif層定義。每個句柄表示的是1個LPDU.用來在發送的最后時刻觸發PDU的tx_confirmation.
    length:LPDU數據長度,即報文的長度。
    sdu:LPDU的數據指針。

實例:Can_write函數介紹,以及HOH抽象的實施 MessgeBuffer介紹

我們以一個簡單的例子說明:

如下是代碼:

圖片

如下是報文:

圖片

這個例子介紹了AUTOSAR發送報文的最底層接口的使用方法,可以先建立一個直觀的印象。

can_write的第一個參數hth是AUTOSAR標準里面的一個概念,接下來的內容的講解目的是為了透徹的理解hth。

AUTOSAR從MCAL開始 就對CAN進行抽象了,抽象出HOH Hardware object handle 硬件處理對象,HOH以發送和接收的不同,分為了HTH,HRH,這倆可以統稱為HOH。

HOH對象包括很多屬性,如

Can Implementation Type(FULL/BASIC

Can ID Message Type(STANDARD/MIXED/EXTEND)

Can Controller Reference (使用哪個can controler)

Number of Hw objects used to implement one HOH

等等屬性。

當我們用其中的一個HOH作為對象來發送報文時,這個報文的發送屬性會繼承這個HOH對象的所有屬性。

舉例說明:

EB(S32K148)中配置了如下幾個HOH:

圖片

這里的配置實際會影響的是Can_PBcfg中的MessgeBuffer的配置結構體,MessgeBuffer結構體數組是HOH的具體實施,它的含義下文詳細描述。Can Object ID即為HOH的ID。

在Can_write例子中我們傳入HTH的是4,即利用HOH_3_EcuTestNode_CanCluster這個HOH作為對象,進行發送。

深入Can_write中,調用的是Can_FlexCan_Write的這個函數:

圖片

他會先搜索Messge Buffer配置結構體中u32HWObjID為hth,即為4的這個配置。

Messge Buffer的配置結構體的部分成員:

static CONST(Can_MBConfigObjectType, CAN_CONST) MessageBufferConfigs0_PB[CAN_MAXMBCOUNT_PB] =
{
    /* HOH_0_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)0x0U, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_RECEIVE, /* Receive/Transmit MB configuration */
        (Can_IdType)0x0U, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x0U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U, /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x0080U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)0U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(boolean)FALSE
        #endif
    },


    /* HOH_3_UDSTX_Node Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
        (Can_IdType)0x7eaU, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x1U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U,   /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x0180U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)16U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(uint8)FALSE
        #endif
    },


    /* HOH_3_NMTX_Node Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
        (Can_IdType)0x424U, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x2U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U,   /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x0190U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)17U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(uint8)FALSE
        #endif
    },


    /* HOH_3_XCPTX_Node Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
        (Can_IdType)0x667U, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x3U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U,   /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x01a0U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)18U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(uint8)FALSE
        #endif
    },


    /* HOH_3_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
        (Can_IdType)0x110U, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x4U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U,   /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x01b0U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)19U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(uint8)FALSE
        #endif
    },
    /* HOH_3_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
        (Can_IdType)0x110U, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x4U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U,   /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x01c0U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)20U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(uint8)FALSE
        #endif
    },........

所以上文函數搜索到的第一個結構體成員一定是第一個Hardware Object ID為4的這個MB 結構體:

/* HOH_3_EcuTestNode_CanCluster Message Buffer of Can Controller ID = 0U*/
    {
        (Can_HwHandleType)CAN_MAXMASKCOUNT, /* uIdMaskIndex */
        (uint8)0U, /* ControllerId  - based on the order from CanController list */
        (CanIdType)CAN_STANDARD, /* ID type: EXTENDED, STANDARD, MIXED */
        (Can_ObjType)CAN_TRANSMIT, /* Receive/Transmit MB configuration */
        (Can_IdType)0x110U, /* MessageId */
        (uint8)0x0U, /* Local priority bits used for arbitration */
        (Can_HwHandleType)0x4U, /* Hardware Object ID */
        #if (CAN_FD_MODE_ENABLE == STD_ON)
        (uint8)0U,
        #endif
        /* Read/Write period reference used when POLLING mode is selected for the controller */
        (uint8)0U,   /* HOH configured for INTERRUPT mode, reference not used */

        (uint16)0x01b0U,       /* Address of Message Buffer  */
        (uint8)8U,    /* Payload lenth of Message Buffer */
        (uint8)19U    /* The index of MB in message buffer memory */
        #if (CAN_TRIGGER_TRANSMIT_EN == STD_ON)
        /* The parameter is used to detect the MB which run with trigger transmit feature */
        ,(uint8)FALSE
        #endif
    },

以這個成員的配置去改變對應的寄存器,從而讓發送的報文繼承這里面的屬性。

我們現在需要搞明白的就剩這個MessgeBuffer配置結構體。

結構體里面的屬性的含義,這些看EB的CAN模塊的配置手冊可以搞明白,我想介紹的是MessgeBuffer這個機制。這是S32K Flex CAN的機制

圖片

這是 Flex CAN的報文緩沖。報文緩沖有很多,配置好相關寄存器,最后將報文數據寫入報文緩沖,可完成發送。

我們注意到MessageBufferConfigs0_PB中的每個結構體成員都有表示Address of Message Buffer的屬性和表示The index of MB in message buffer memory的屬性。這屬性各個成員全不同并且是序號,地址按順序遞增的現象。所以這些結構體成員就是一個一個不同的Messagebuffer。再注意到之前提到的Can_Write中傳入的Hth即是這里的Hardware Object ID。最后兩個結構體,你發現他們雖然Message Buffer的地址不同,但是共用一個Hth號4.實際上完整的Messagebuffer的定義,有十個結構體成員都是共用4號Hth.

這是由EB配置項Number of Hw objects used to implement one HOH配為10決定的。這里 Hw objects即不同的MessageBuffer。但是他們關聯了同個Hth。換言之1個Hth中可以包括多個MessageBuffer。即HTH是比MessageBuffer是更高層的抽象,例子中向Can_Write傳入這個ID為4的hth,可以有10個MessageBuffer供選擇寫入數據,一個MessgeBuffer被占了我再找下個MessageBuffer。這樣的配置作用就是使用這個HTH,可以在極短時間同時支持最多10個報文的發送。

以上例子Can_write函數的底層實現的邏輯簡化說明如下:
1.輪詢Messge Buffer配置結構體中u32HWObjID為hth是4的MB結構體成員。

2找到第一個hth為4的MessageBuffer。傳入LPDU數據,嘗試更新MessageBuffer發送,再判斷是否是CAN_BUSY狀態。假如是,找下一個Hth為4的MB繼續嘗試發送,直到成功發送出去一次,返回CAN_OK。

這期的介紹就到這里,本期我們可以搞清楚什么是LPDU,什么是HOH和HTH。從HOH的實際實施可以看出,所謂的AUTOSAR抽象,即將某個對象的所有配置,用結構體數組打包在一起,然后給他們編號。這個編號和各個對象的配置一一對應。后面需要使用這個對象的時候即使用編號去索引對應的結構體數組即可。這個思路會貫穿整個的AUTOSAR實現。

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

    關注

    31

    文章

    5342

    瀏覽量

    120297
  • CAN通信
    +關注

    關注

    5

    文章

    93

    瀏覽量

    17831
  • 緩沖器
    +關注

    關注

    6

    文章

    1922

    瀏覽量

    45478
  • AUTOSAR
    +關注

    關注

    10

    文章

    362

    瀏覽量

    21570
  • PDU
    PDU
    +關注

    關注

    0

    文章

    94

    瀏覽量

    16979
收藏 人收藏

    評論

    相關推薦

    邏輯函數邏輯問題的介紹

    本帖最后由 gk320830 于 2015-3-9 22:17 編輯 邏輯函數邏輯問題的描述  在討論了與、或、非三種基本邏輯運算后,下面將從工程實際出發,提出
    發表于 04-06 23:57

    ESM6802 Android版支持雙CAN通信

    libCanControl.so文件的C/C++源碼做參考。這樣,對于Android應用開發的客戶來說,只需要專注于Java層的應用邏輯開發。  CanControl類的四個native函數簡單介紹如下
    發表于 10-20 11:32

    請問CAN接收中斷DSP底層會怎么樣?

    請教:正常流程:CAN設置成中斷接收方式,通過CAN調試助手,發送一幀數據,產生一個CAN接收中斷,并進行數據處理;異常流程:如果我發送
    發表于 10-17 14:37

    EPP邏輯接口WinDriver底層驅動的可視化

    取自外部CAN總線系統的+5V電源;發光二極管用做電源和主、備節點的收發指示。2 EPP和SJAl000之間的接口邏輯設計 在EPP接口和SJAl000之間加入適當的邏輯接口,可以避免傳統設計中對EPP
    發表于 11-29 14:51

    iTOP-iMX6開發板-Android-can測試例程介紹

    Java_can_hardware_hardwareControl_canWrite這是 can發送接口。JNIEXPORT jobject JNICALL
    發表于 03-11 10:24

    can底層驅動配置好的前提下,向DSP發送任何數據,can就能接收到數據嗎

    我想問下在can底層驅動配置好的前提下,我向DSP發送任何數據,can就能接收到數據嗎,然后將RMP=1即ECanaShadow.CANRMP.bit.RMP1 = 1;還是說必須
    發表于 07-08 15:39

    邏輯代數與邏輯函數

    邏輯代數與邏輯函數:本章主要討論分析和設計數字邏輯功能的數學。首先介紹邏輯代數中的基本運算、基本
    發表于 09-01 09:11 ?0次下載

    邏輯函數邏輯問題的描述

    邏輯函數邏輯問題的描述   在討論了與、或、非三種基本邏輯運算后,下面將從工程實際出發,提出邏輯命題,然后用真值表加以描述,從真值表可以
    發表于 04-06 23:56 ?1373次閱讀
    <b class='flag-5'>邏輯</b><b class='flag-5'>函數</b>與<b class='flag-5'>邏輯</b>問題的描述

    STM32_CAN發送和接收過濾原理

    STM32_CAN發送和接收過濾原理介紹
    發表于 07-22 17:04 ?9次下載

    CAN為什么會發送失敗

    CAN總線調試過程中出現報文發送失敗,很多工程師都對此只知其一不知其二,這里就CAN報文發送失敗的問題我們來做一次探討。在了解CAN報文為什
    發表于 07-19 18:47 ?1.9w次閱讀
    <b class='flag-5'>CAN</b>為什么會<b class='flag-5'>發送</b>失敗

    03 底層函數

    03 底層函數
    發表于 10-11 09:29 ?7次下載
    03 <b class='flag-5'>底層</b>庫<b class='flag-5'>函數</b>

    邏輯NOT函數功能介紹

    邏輯NOT函數輸出在其單個輸入為false時為true,在單個輸入為true時為false邏輯NOT函數僅為單個輸入反相器將邏輯電平“1”的
    的頭像 發表于 06-23 05:48 ?9125次閱讀
    <b class='flag-5'>邏輯</b>NOT<b class='flag-5'>函數</b>功能<b class='flag-5'>介紹</b>

    CAN底層驅動數據的傳輸需要注意什么

    ,但經典CAN還是使用最多和最頻繁的,在底層驅動中,我們要注意數據的傳輸。 如我們在讀取CAN數據幀的時候需要做調整,我們以NXP的 Kinetis系列為例子, 同樣在發送傳輸的時候,
    的頭像 發表于 06-04 14:49 ?1916次閱讀
    <b class='flag-5'>CAN</b><b class='flag-5'>底層</b>驅動數據的傳輸需要注意什么

    IGBT驅動優化的底層邏輯是什么

    ——驅動優化的底層邏輯是什么?
    的頭像 發表于 04-29 16:15 ?2898次閱讀

    PduR模塊的發送機制 PduR這個模塊對什么進行了抽象呢?

    前兩期,我們講了CAN模塊的發送邏輯,Canif模塊的發送邏輯發送確認
    的頭像 發表于 07-17 15:54 ?3205次閱讀
    PduR模塊的<b class='flag-5'>發送機制</b> PduR這個模塊對什么進行了抽象呢?
    主站蜘蛛池模板: 无码国产成人777爽死| 久久综合亚洲色hezyo| 观看免费做视频| yy8090韩国理伦片在线| a视频在线观看| max girls 大感谢祭| seba51久久精品| jizzhd中国| 高H高肉强J短篇校园| 国产成人精品系列在线观看 | 日本69xxxxx| 轻点慢点1V2啊高H抽插| 青柠在线观看视频在线高清完整| 欧美xxxxxbb| 热久久视久久精品18| 日日噜噜夜夜躁躁狠狠| 手机国产视频福利| 性色少妇AV蜜臀人妻无码| 嘟嘟嘟WWW在线观看视频高清| AV久久久囯产果冻传媒| yellow免费| 芳草地社区在线视频| 国产盗摄一区二区| 国产在线公开视频| 久久精品视频15人人爱在线直播| 超碰caopro熟女m超碰分类| 抽插内射高潮呻吟V杜V| 国产精品久久久久久久人人看| 国产精品无码人妻99999| 果冻传媒AV精品一区| 久久综合老色鬼网站| 欧美一区二区视频在线观看| 色婷婷狠狠97成为人免费| 亚洲成人免费观看| 长泽梓黑人初解禁bdd07| vagaa哇嘎黄短片| 国产精品人成在线播放新网站| 黄色三级网络| 免费精品一区二区三区AA片 | 嫩草影院成人| 色宅男午夜电影网站|