1. <delect id="hbm07"><option id="hbm07"></option></delect><s id="hbm07"><option id="hbm07"><bdo id="hbm07"></bdo></option></s>
    <s id="hbm07"></s>

      1. <p id="hbm07"><option id="hbm07"><bdo id="hbm07"></bdo></option></p>

        支持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的使能就可以了,在數據傳輸時候,根據數據幀長度就能判斷出類型,然后做出對應的處理。


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

        酥酥影院18禁止-日本三级吹潮在线观看-国产成人亚洲日韩欧美-无码中文天天av天天爽-欧美人与动牲交A-一本之道高清在线不卡视频-久久99热只有频精品 2021年国产精品青青草原-三级香港三级韩国三级-又色又爽又黄的视频还免费-亚洲老熟女-特级婬片女子高清视频-国产午夜福利1000集-无码AV无码天堂资源网 在线播放国产不卡免费视频-国第一产在线精品亚洲区-人妻少妇久久中文字幕-成 人影片 毛片免费观看-亚洲国产在线精品一区在线观看-亚洲精品国产第一区二区 2021超清国产小视频-亚洲城人在线视频-国产乡下三级-人妻少妇精品无码专区无码-国产在线视频一区二区三区-2021中文一卡二卡三卡-国产在线精品亚洲一区 2021超清国产小视频-亚洲城人在线视频-国产乡下三级-人妻少妇精品无码专区无码-国产在线视频一区二区三区-2021中文一卡二卡三卡-国产在线精品亚洲一区 国产 日产 欧美最新-人妻少妇精品专区性色av-欧美性色av性色在线观看-日本三级韩国-国产真实迷奷学生在线-国产一级特黄高清大片自怕-黑粗硬大欧美在线视频 国产国产人免费人成免费视频-日本三级香港三级人妇电影99-人妻熟女精品视频专区-色综合久久无码中文字幕-人妻丰满熟妇AV无码区影片资源-欧美av色爱综合网欧美av 亚洲va不卡在线-日本A级视频在线播放-亚洲国产精品无码中文字幕-久久无码高潮喷水-欧美老熟妇喷水-丰满巨臀大屁股BBw-JAPANESE55丰满熟妇-亚洲欧美日韩高清一区 久久爱在线播放视频-免费播放观看在线视频-卡通动漫图片-中文字幕熟女人妻一区二区-AV无码AV在线A∨天堂-欧美国产日产一区二区-人妻无码-人人澡人人播色屋av
        2021最新国产在线不卡A-国产精品专区第5页-亚洲图揄拍自拍另类图片-无码专区国产精品-欧美特黄三级免费视频-特级毛片A片全部免费-国产在线视精品在亚洲 免费A级毛片无码A∨-子夜精品视频在线-国产免费精品美女视频-免费人妻少妇精品-日韩人妻无码潮喷中文视频在线-欧美老妇牲交视频-无码少妇一级AV片在线观看 国产好大好硬好爽免费视频-香港三级片电影-免费韩伦影院在线观看-日本熟妇人妻高清无码视频-国产一级伦奷毛片未删减版-国产学生a片-AV爆乳无码专区-浓毛少妇a片 2021超清国产小视频-亚洲城人在线视频-国产乡下三级-人妻少妇精品无码专区无码-国产在线视频一区二区三区-2021中文一卡二卡三卡-国产在线精品亚洲一区 国产精品永久免费-单亲乱L仑视频在线观看-无码 人妻 在线视频-被公侵犯玩弄漂亮人妻-女人高潮抽搐潮.I喷视频-国产成年无码AV片在线观看-亚洲日本无码一区二区 久久爱视频-青青青国产费观看-成年片黄网站色大全男女-国产高清在线看AV片-av无码播放一级毛片免费-97人人超碰国产精品最新-亚洲乱码中文字幕综合-中国丰满熟妇av 120秒试看无码体验区-99国产免费-日本制服美女-中文字幕乱码免费-日韩成视频在线精品-久久婷综合五月-永久免费AV无码网站打屁股-国模无码视频一区 一个人看免费视频WWW-日本三级成本人网站-日本老熟妇无码色视频网站-AV天堂中AV世界中文在线播放-波多野结衣一区二区三区AV高清-成年美女黄网站色奶头大全 亚洲精品熟女国产-五月婷之久久综合丝袜美腿-女神高潮喷水正在播放-少妇人妻系列无码专区视频-亚洲人成网站18禁止-国产一级A片免费无码-av无码在线