<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 關于新CAN驅動的錯誤幀定義

     2016-12-30              

      CAN總線產生的錯誤以錯誤幀的形式上報給應用層。設置注冊表[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAN1] BusErrorReport項為1可以讓驅動上報CAN總線錯誤幀,為0,驅動不會上報錯誤幀。


    幀格式


      CAN幀結構體定義如下,當CAN_FRAME中CAN_ID的error為1時,表示該幀為錯誤幀。

      typedef struct{

            unsigned int id:29;

            unsigned int error:1;       

            unsigned int remote:1;

            unsigned int extended:1;

      }CAN_ID;

     

      typedef struct _can_frame

      {

          CAN_ID   can_id;        /* 32 bit CAN_ID + EFF/RTR/ERR flags */

          BYTE    can_dlc;     /* frame payload length in byte*/

          BYTE    data[CAN_MAX_DLEN];

      } CAN_FRAME, *PCAN_FRAME;


    錯誤幀定義


      可以參考例程中庫頭文件sdk_can.h,錯誤幀標記為CAN_ID的error,錯誤類型存放在CAN_ID中,根據不同類型的錯誤,詳細信息存放在幀結構體CAN_FRAME的data中。


      一個錯誤幀中,可以包含多種錯誤類型的錯誤信息。


        1. CAN_ERR_TX_TIMEOUT錯誤

            WINCE中暫時保留。



        2. lost arbitration仲裁丟失錯誤

            #define CAN_ERR_LOSTARB  0x00000002U

            當錯誤幀結構體中CAN_ID& CAN_ERR_LOSTARB為真時,表明該錯誤產生。



        3. controller problems控制器出錯

          #define CAN_ERR_CRTL  0x00000004U

            當錯誤幀結構體中CAN_ID& CAN_ERR_CRTL為真時,表明該錯誤產生。

            詳細信息存放在錯誤幀結構體data[1]中。


                接收buffer溢出

                data[1] &0x01為真,表明該錯誤產生。

            需要及時處理接收到的數據包。


                發送buffer溢出

                data[1] &0x02為真,表明該錯誤產生。

                可能由于瞬間發送的數據包過多導致。


                接收錯誤達到警告級別

                data[1] &0x04為真,表明該錯誤產生。

                當該錯誤提示,表明短期內接收產生的錯誤較多。


                發送錯誤達到警告級別

                data[1] &0x08為真,表明該錯誤產生。

                當該錯誤提示,表明短期內發送產生的錯誤較多。


                接收錯誤達到嚴重錯誤級別

                data[1] &0x10為真,表明該錯誤產生。

                當該錯誤提示,表明短期內接收產生的錯誤過多。應當暫停CAN通信,檢查錯誤原因。


                發送錯誤達到嚴重錯誤級別

           data[1] &0x20為真,表明該錯誤產生。

           當該錯誤提示,表明短期內發送產生的錯誤過多。應當暫停CAN通信,檢查錯誤原因。

     

                恢復到錯誤激活狀態

           data[1] &0x40為真,表明恢復到錯誤激活狀態。



        4. CAN通信協議出錯

          #define CAN_ERR_PROT  0x00000008U

        當錯誤幀結構體中CAN_ID& CAN_ERR_PROT為真時,表明該錯誤產生。

        詳細信息存放在錯誤幀結構體data[2]和data[3]中,其中data[2]表明協議錯誤類型,data[3]表明協議出錯的位置


              (類型)單bit出錯

              data[2] &0x01為真,表明協議單bit出錯。


              (類型)幀格式出錯

              data[2] &0x02為真,表明幀格式出錯。

            

              (類型)位填充出錯

              data[2] &0x04為真,表明位填充出錯。

            

              (類型)dominant bit發送失敗

              data[2] &0x08為真,表明dominant bit發送失敗。

            

              (類型)recessive bit發送失敗

              data[2] &0x10為真,表明recessive bi發送失敗。

            

              (類型)總線過載

              data[2] &0x20為真,表明總線過載。

            

              (類型)active error announcement

              data[2] &0x40為真,active error announcement。

            

              (類型)傳輸出錯

              data[2] &0x80為真,傳輸出錯。

            

                    位置

              data[3]為0x03表明協議SOF幀頭位置

              data[3]為0x02表明協議ID第28-21bits(SFF:10-3)

              data[3]為0x06表明協議ID第20-18bits(SFF:2-0)

              data[3]為0x04表明協議substitute RTR位(SFF:RTR)

              data[3]為0x05表明協議identifier extension標準擴展位

              data[3]為0x07表明協議ID第17-13bits

              data[3]為0x0F表明協議ID第12-5bits

              data[3]為0x0E表明協議ID第4-0bits

              data[3]為0x0C表明協議RTR位

              data[3]為0x0D表明接收bit 1

              data[3]為0x09表明接收bit 0

              data[3]為0x0B表明DLC位

              data[3]為0x0A表明DATA位

              data[3]為0x08表明CRC序列

              data[3]為0x18表明CRC分隔符

              data[3]為0x19表明ACK應答位

              data[3]為0x1B表明ACK分隔符

              data[3]為0x1A表明幀尾

              data[3]為0x12表明間歇



        5. 收發狀態錯誤

          #define CAN_ERR_TRX  0x00000010U

        當錯誤幀結構體中CAN_ID& CAN_ERR_TRX為真時,表明在收發時CAN狀態有誤。

        詳細信息存放在錯誤幀結構體data[4]中,data[4]中1個字節8bit中,高4位表示CANL值,分別代表如下CANH錯誤

    CAN錯誤幀定義.gif

        高4位表示CANH值,分別代表如下CANL錯誤

    CAN錯誤幀定義.gif

        高低位值以排列組合方式存在。



        6無ACK錯誤

          #define CAN_ERR_ACK  0x00000020U

          當錯誤幀結構體中CAN_ID& CAN_ERR_ACK為真時,表明該錯誤產生。



        7總線關閉

          #define CAN_ERR_BUSOFF  0x00000040U

          當錯誤幀結構體中CAN_ID& CAN_ERR_BUSOFF為真時,表明總線關閉。



        8總線錯誤

          #define CAN_ERR_BUSERROR  0x00000080U

       當錯誤幀結構體中CAN_ID& CAN_ERR_BUSERROR為真時,表明該錯誤產生。

       該錯誤通常與其它錯誤一起發出。



        9控制器重啟

          #define CAN_ERR_RESTARTED  0x00000100U 

        當錯誤幀結構體中CAN_ID& CAN_ERR_RESTARTED為真時,表明控制器重啟。



    示例

      當收到一幀錯誤幀,錯誤幀ID為0x88,data數據data[0]~data[4]為0x00,0x00,0x00,0x1b,0x00時

           查ID可知,當前CAN出現總線錯誤+通信錯誤,即0x80 && 0x08。根據通信錯誤data[2]和data[3]可知,上報故障為ACK解析出錯,即data[3]=0x1b。由此判斷有可能CAN總線受到干擾,或者有設備發送協議有錯。

    内射一区二区精品视频在线观看| 99re热这里只有精品视频| 精品一久久香蕉国产二月| 久久五月精品中文字幕| 精品国偷自产在线视频99| 国产精品美女一区二区视频| 国产精品婷婷午夜在线观看| 99国产精品国产精品九九| 国产午夜福利精品一区二区三区| 国产四虎精品8848hh| 95在线观看精品视频| 久久精品亚洲综合一品| 国产精品成人无码久久久久久 | 四虎国产精品永久在线看| 伊人无码精品久久一区二区| 久久精品国产99久久| 国产精品永久免费视频| 国产精品美女自在线观看免费| 精品伊人久久大线蕉色首页| 久草精品视频在线播放| 9久热这里只有精品免费| 国产精品哟哟视频| www.国产精品.com| 91大神在线精品网址| 久久精品国产精品亚洲艾草网| 国产在线91精品入口| 国产91在线精品| 午夜亚洲av永久无码精品 | 青青久久精品国产免费看| 蜜臀91精品国产高清在线观看| 99精品一区二区三区无码吞精 | 黑人巨大精品播放| 精品亚洲成a人在线观看| 2021精品国产综合久久| 亚洲精品午夜视频| 99国产精品99久久久久久| 无码日韩精品一区二区三区免费| 久久线看观看精品香蕉国产| 人妻少妇无码精品视频区| 岛国精品一区免费视频在线观看 | 99re这里只有精品6|