<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 FD的擴(kuò)展模塊介紹

     2020-5-27     作者:黃志超         
    文章標(biāo)簽:C/C++CAN

      隨著現(xiàn)在工控領(lǐng)域技術(shù)的發(fā)展,傳輸?shù)臄?shù)據(jù)量越來(lái)越多, CAN總線在傳輸速率和帶寬漸漸不能滿足現(xiàn)場(chǎng)的需求。為了解決這個(gè)問(wèn)題,BOSCH公司推出了CAN FD(CAN with Flexible Data rate)協(xié)議,該協(xié)議可以支持更高的波特率和更長(zhǎng)的數(shù)據(jù)位,最高波特率可達(dá)8Mbit/s,支持最長(zhǎng)數(shù)據(jù)位為64byte,并且可以兼容傳統(tǒng)的CAN 2.0B協(xié)議。為了在英創(chuàng)Linux工控主板上支持CAN FD,滿足客戶的需求,英創(chuàng)公司基于SBC8XX系列工控應(yīng)用底板,設(shè)計(jì)了擴(kuò)展模塊ETA703。


    eta703側(cè)面.png

    ETA703模塊


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


    ETA703工控通訊接口接口數(shù)量簡(jiǎn)要說(shuō)明
    CAN-FD高速現(xiàn)場(chǎng)總線1 8Mbps最高波特率,與CAN2.0B兼容
    CAN-2.0B總線2 波特率: 50kbps - 1Mbps
    RS4853 自動(dòng)方向切換
    RS2321 3線制


      英創(chuàng)公司已經(jīng)調(diào)試好了ETA703的驅(qū)動(dòng),用戶在使用時(shí)調(diào)用modprobe eta703命令就能夠加載對(duì)應(yīng)的驅(qū)動(dòng)文件。目前能夠支持ETA703擴(kuò)展模塊的主板為ESM6800H/E,ESM6802和ESM7000,因?yàn)镃AN FD是比較新的功能,需要這幾款主板使用的較高版本的交叉工具鏈才能夠支持。


      驅(qū)動(dòng)加載成功后系統(tǒng)會(huì)生成新的CAN設(shè)備,因?yàn)镋SMARC系列主板都板載了2路CAN總線(can0和can1),所以加載驅(qū)動(dòng)后生成的設(shè)備為can2,可以使用命令ifconfig –a來(lái)查看。


      關(guān)于ETA703更加具體的參數(shù)說(shuō)明可以參考ETA703的數(shù)據(jù)手冊(cè)。這里主要介紹關(guān)于CAN FD的相關(guān)概念和程序接口。CAN FD的全稱為CAN with Flexible Data rate,相對(duì)于傳統(tǒng)的CAN總線協(xié)議,主要有兩點(diǎn)變化:


      第一點(diǎn)從字面上就能夠看出來(lái),即傳輸速率是可變的,最高可達(dá)8Mbit/s。


      第二點(diǎn)是相比傳統(tǒng)CAN總線的8byte數(shù)據(jù)位,CAN FD協(xié)議最長(zhǎng)可以支持64byte數(shù)據(jù)位。


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


      接下來(lái)我們介紹如何通過(guò)程序啟用CAN FD協(xié)議進(jìn)行通訊。其實(shí)Linux系統(tǒng)使用的socketcan接口已經(jīng)很好的支持了CAN FD,并且同時(shí)能夠兼容CAN 2.0B協(xié)議。首先來(lái)看在<linux/can.h>頭文件中對(duì)于CAN和CANFD數(shù)據(jù)幀的結(jié)構(gòu)體定義:


    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)));
    };


      上面是對(duì)CAN數(shù)據(jù)幀的定義,和下面CAN FD數(shù)據(jù)幀的定義對(duì)比,可以發(fā)現(xiàn)是兼容的,區(qū)別只在于數(shù)據(jù)位的長(zhǎng)度上面:


    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)));
    };



      關(guān)于數(shù)據(jù)位的長(zhǎng)度,根據(jù)前面的介紹應(yīng)該能夠了解到CAN FD最長(zhǎng)支持64byte的數(shù)據(jù)位,在頭文件中有如下定義:


    /* 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,可以看到是在原來(lái)使能CAN總線命令的基礎(chǔ)上增加了CAN FD的波特率的設(shè)置。同時(shí)在程序中也需要調(diào)用ioctl來(lái)使能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協(xié)議后,數(shù)據(jù)通訊的部分使用的函數(shù)和標(biāo)準(zhǔn)的CAN通訊是相同的,都是使用write和recv函數(shù),驅(qū)動(dòng)會(huì)根據(jù)傳輸?shù)膸拈L(zhǎng)度,自動(dòng)判斷是否為CAN FD數(shù)據(jù)幀。所以客戶在編寫程序的時(shí)候,只需要注意一下填入的傳輸數(shù)據(jù)長(zhǎng)度即可,這里可以利用頭文件中的宏定義:


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



      發(fā)送CAN FD數(shù)據(jù)的具體代碼如下:


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



      如果將frame.len的值改為8,write函數(shù)中的長(zhǎng)度改為CAN_MTU,驅(qū)動(dòng)就自動(dòng)切換成CAN 2.0B協(xié)議進(jìn)行發(fā)送。同樣的在接收數(shù)據(jù)的時(shí)候,可以通過(guò)recv函數(shù)的返回值來(lái)判斷,具體代碼如下:


    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的編程十分簡(jiǎn)單,socketcan提供的接口完美的兼容了CAN 2.0B和CAN FD,只需要在原來(lái)標(biāo)準(zhǔn)CAN總線的例程中增加對(duì)CAN FD的使能就可以了,在數(shù)據(jù)傳輸時(shí)候,根據(jù)數(shù)據(jù)幀長(zhǎng)度就能判斷出類型,然后做出對(duì)應(yīng)的處理。


      感興趣的客戶可以和英創(chuàng)的工程師聯(lián)系,索取完整的例程代碼。

    文章標(biāo)簽:C/C++CAN
    97精品国产91久久久久久| 99精品久久99久久久久久| 国产精品99久久99久久久| 亚洲国产精品乱码在线观看97| 麻豆国产精品一二三在线观看| 国产精品免费大片一区二区| 久久99国产精品| 国产精品国产国产aⅴ| 国产精品无圣光一区二区| 国产精品久久久久久福利漫画| 亚洲国产综合精品中文字幕| 久久国产免费观看精品3 | 国产精品无码专区| 无码精品蜜桃一区二区三区WW| 日韩国产精品无码一区二区三区| 国产精品色午夜免费视频| 色久综合网精品一区二区| 自拍偷在线精品自拍偷| 国产精品美女午夜爽爽爽免费| 国产精品亚洲精品日韩已满| 精品99久久aaa一级毛片| 日韩精品射精管理在线观看| 国产精品无码日韩欧| 亚洲AV无码一区二区三区久久精品| 中文国产成人精品少久久| 亚洲精品欧美综合四区| 国产精品成人观看视频免费| 91视频国产精品| 久久夜色精品国产亚洲av| 亚洲精品久久久www| 午夜三级国产精品理论三级 | 美女精品永久福利在线| 久久久精品人妻久久影视| 亚洲中文精品久久久久久不卡| 精品九九人人做人人爱| 亚洲精品V欧洲精品V日韩精品| 国产亚洲精品资在线| 国产在线精品一区二区三区不卡 | 精品久久久久国产免费| 国产成人久久精品二三区麻豆| 奇米影视7777久久精品|