<i id="2ino5"><pre id="2ino5"><delect id="2ino5"></delect></pre></i>
    <track id="2ino5"><ins id="2ino5"><option id="2ino5"></option></ins></track>
    <acronym id="2ino5"></acronym><mark id="2ino5"><table id="2ino5"></table></mark>
    <video id="2ino5"><ins id="2ino5"><p id="2ino5"></p></ins></video>
  • <video id="2ino5"></video>
  • <i id="2ino5"></i> <wbr id="2ino5"><table id="2ino5"><button id="2ino5"></button></table></wbr>

    <object id="2ino5"><table id="2ino5"></table></object>

    支持CAN FD的擴展模塊介紹

     2020-5-27     作者:黃志超    

      隨著現在工控領域技術的發展,傳輸的數據量越來越多, CAN總線在傳輸速率和帶寬漸漸不能滿足現場的需求。為了解決這個問題,BOSCH公司推出了CAN FD(CAN with Flexible Data rate)協議,該協議可以支持更高的波特率和更長的數據位,最高波特率可達8Mbit/s,支持最長數據位為64byte,并且可以兼容傳統的CAN 2.0B協議。為了在英創Linux工控主板上支持CAN FD,滿足客戶的需求,英創公司基于SBC8XX系列工控應用底板,設計了擴展模塊ETA703。


    eta703側面.png

    ETA703模塊


      ETA703通過SPI總線擴展出一路支持CAN FD的CAN總線,同時將主板的串口隔離后分別轉換為RS232和RS485,并將主板帶有的2路CAN總線也經過隔離后引出,因此模塊上一共包含3路can、3路RS485和1路RS232:


    ETA703工控通訊接口接口數量簡要說明
    CAN-FD高速現場總線1 8Mbps最高波特率,與CAN2.0B兼容
    CAN-2.0B總線2 波特率: 50kbps - 1Mbps
    RS4853 自動方向切換
    RS2321 3線制


      英創公司已經調試好了ETA703的驅動,用戶在使用時調用modprobe eta703命令就能夠加載對應的驅動文件。目前能夠支持ETA703擴展模塊的主板為ESM6800H/E,ESM6802和ESM7000,因為CAN FD是比較新的功能,需要這幾款主板使用的較高版本的交叉工具鏈才能夠支持。


      驅動加載成功后系統會生成新的CAN設備,因為ESMARC系列主板都板載了2路CAN總線(can0和can1),所以加載驅動后生成的設備為can2,可以使用命令ifconfig –a來查看。


      關于ETA703更加具體的參數說明可以參考ETA703的數據手冊。這里主要介紹關于CAN FD的相關概念和程序接口。CAN FD的全稱為CAN with Flexible Data rate,相對于傳統的CAN總線協議,主要有兩點變化:


      第一點從字面上就能夠看出來,即傳輸速率是可變的,最高可達8Mbit/s。


      第二點是相比傳統CAN總線的8byte數據位,CAN FD協議最長可以支持64byte數據位。


      我們可以將CAN FD看作是傳統CAN 2.0B協議的升級版本,并且是向下兼容的,即能夠同時支持CAN 2.0B協議。所以使用原來英創公司提供的CAN總線例程(test_socketcan)就能夠在ETA703上進行正常的通訊,只是沒有啟用CAN FD的功能而已,關于CAN FD協議更加詳細的介紹可以參考網站:https://www.can-cia.org/can-knowledge/can/can-fd/。


      接下來我們介紹如何通過程序啟用CAN FD協議進行通訊。其實Linux系統使用的socketcan接口已經很好的支持了CAN FD,并且同時能夠兼容CAN 2.0B協議。首先來看在<linux/can.h>頭文件中對于CAN和CANFD數據幀的結構體定義:


    struct can_frame {
           canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
           __u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
           __u8    __pad;   /* padding */
           __u8    __res0;  /* reserved / padding */
           __u8    __res1;  /* reserved / padding */
           __u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
    };


      上面是對CAN數據幀的定義,和下面CAN FD數據幀的定義對比,可以發現是兼容的,區別只在于數據位的長度上面:


    struct canfd_frame {
           canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
           __u8    len;     /* frame payload length in byte */
           __u8    flags;   /* additional flags for CAN FD */
           __u8    __res0;  /* reserved / padding */
           __u8    __res1;  /* reserved / padding */
           __u8    data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
    };


      關于數據位的長度,根據前面的介紹應該能夠了解到CAN FD最長支持64byte的數據位,在頭文件中有如下定義:


    /* CAN payload length and DLC definitions according to ISO 11898-1 */
    #define CAN_MAX_DLC 8
    #define CAN_MAX_DLEN 8
     
    /* CAN FD payload length and DLC definitions according to ISO 11898-7 */
    #define CANFD_MAX_DLC 15
    #define CANFD_MAX_DLEN 64


      啟用CAN FD具體命令為ip link set can2 up type can bitrate 1000000 dbitrate 2000000 fd on restart-ms 100,可以看到是在原來使能CAN總線命令的基礎上增加了CAN FD的波特率的設置。同時在程序中也需要調用ioctl來使能CAN FD,具體代碼如下:


    /* try to switch the socket into CAN FD mode */
    canfd_on = 1;
    setsockopt(s, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));


      在使能了CAN FD協議后,數據通訊的部分使用的函數和標準的CAN通訊是相同的,都是使用write和recv函數,驅動會根據傳輸的幀的長度,自動判斷是否為CAN FD數據幀。所以客戶在編寫程序的時候,只需要注意一下填入的傳輸數據長度即可,這里可以利用頭文件中的宏定義:


    #define CAN_MTU           (sizeof(struct can_frame))
    #define CANFD_MTU       (sizeof(struct canfd_frame))


      發送CAN FD數據的具體代碼如下:


    struct canfd_frame   frame;
    frame.len = 64;
    nbytes = write(s, &frame, CANFD_MTU);


      如果將frame.len的值改為8,write函數中的長度改為CAN_MTU,驅動就自動切換成CAN 2.0B協議進行發送。同樣的在接收數據的時候,可以通過recv函數的返回值來判斷,具體代碼如下:


    nbytes = recv(can_sock, &frame, CANFD_MTU, 0 );
    if (nbytes < 0)
    {
           perror("can raw socket read");
           break;
    }
    if ((size_t)nbytes == CAN_MTU) {
           maxdlen = CAN_MAX_DLEN;
    }
    else if ((size_t)nbytes == CANFD_MTU) {
           maxdlen = CANFD_MAX_DLEN;
    }
    else {
           fprintf(stderr, "read: incomplete CAN frame\n");
           return 1;
    }


      從上面的代碼可以看出CAN FD的編程十分簡單,socketcan提供的接口完美的兼容了CAN 2.0B和CAN FD,只需要在原來標準CAN總線的例程中增加對CAN FD的使能就可以了,在數據傳輸時候,根據數據幀長度就能判斷出類型,然后做出對應的處理。


      感興趣的客戶可以和英創的工程師聯系,索取完整的例程代碼。

    色综合久久无码中文字幕,久久亚洲精品无码爱剪辑,亚洲国产天堂久久综合,2020久久天天躁狠狠躁夜夜,年龄最小的无码AV在线观看 亚洲国产在线精品国自产拍影院,免费网站看v片在线无遮挡,免费观看四虎精品国产,自拍偷区亚洲综合美利坚,无码毛片视频一区二区本码 国产日韩久久久久精品影院,国内精品久久久久久影院,亚洲国产日韩欧美高清片,久久亚洲国产精品影院,中文字幕四虎第一页 亚洲国产在线精品国自产拍影院,免费网站看v片在线无遮挡,免费观看四虎精品国产,自拍偷区亚洲综合美利坚,无码毛片视频一区二区本码 天堂v无码亚洲_高无码,一本大道香蕉中文在线视频,亚洲中文无码亚洲人成视不卡,亚洲精品无码不卡在线观看,亚洲综合区图片小说区 免费高清v片在线观看,免费网站看完整v片在线,日本高清视频在线网站,2019中文字幕视频,2019中文字幕视频在线 老司机在线视频体验区,亚洲国产中文字幕新在线,国产亚洲精品在线视频,国产精品高清视频免费,新国产在热线精品视频99
    天堂v无码亚洲_高无码,一本大道香蕉中文在线视频,亚洲中文无码亚洲人成视不卡,亚洲精品无码不卡在线观看,亚洲综合区图片小说区 国产女人久久香蕉精品视,男人靠女人的免费视频,久无码久无码av无码,免费的av网站手机版,亚洲国产欧美国产综合一区 亚洲乱码中文字幕综合,欧美成人无码A片视频,丝袜AV人妻系列制服丝袜,成人 H小视频在线播放,JAPANESE无码中文字幕 日本Av天堂无码一区二区免费,久久精品这里热有精品,亚洲成a人片在线观看无码,亚洲精品无码一区二区三区,国产精品亚洲日韩Av在线 香港经典a毛片免费观看,亚洲日本欧美日韩高观看免费,一级A一片在线播放,免费欧洲毛片a级视频,无码专区视频中文字幕,91精品欧美综合在线 大杳焦伊人在钱,伊人9在线观看免费观看,伊人无码高清,狠狠狠的在啪线香蕉,日本视频高清免费观看,色情亚洲21p 暖暖直播视频在线观看,亚洲国产欧美在线人成,欧美日韩AV中文日本AV三区,国产在热线精品视频99,伊人久久大香线蕉av,久久人与动人物a 欧洲自拍拍偷无码#精品在线视频,亚洲欧洲自拍拍偷无码,亚洲高清国产拍精品,亚洲愉拍自拍另类图片高清无码种子,精品视频在线观看 欧美日本一道本dⅴd在线播放,人体性爱亚洲AV,新超碰www男人的天堂,色偷偷新超碰男人的天堂,在线看片韩国免费人成视频 2020无码最新国产在线观看,亚洲2020天天堂在线观看,精品国产品国语在线不卡,无码精品国产DVD在线观看,亚洲精品国产第一区第二区