<track id="zxlr8"></track>
<u id="zxlr8"><sub id="zxlr8"></sub></u>
  • <track id="zxlr8"></track>
    1. <ins id="zxlr8"><table id="zxlr8"></table></ins><wbr id="zxlr8"><ins id="zxlr8"></ins></wbr>
      <wbr id="zxlr8"><table id="zxlr8"></table></wbr><u id="zxlr8"><bdo id="zxlr8"></bdo></u>
    2. <video id="zxlr8"></video>
      <rp id="zxlr8"><input id="zxlr8"></input></rp>
    3. <u id="zxlr8"></u>

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


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

      A毛看片免费观看视频视频在线播放,国产a片欧美一级毛 片在线观看,2019午夜75福利不卡片在线,久久精品国产99国产精,最近更新中文字幕免费,久久人人97超碰,中文字幕无码A片久久东京热 亚洲伊人成综合人影院,亚洲国产中文字幕在线视频,天天五月缴情在线观看,97国产在线看片免费人成视频,天干夜天天夜天干天,免费A级毛片高清视频,窝窝午夜色视频国产精品 92福利视频合集100午夜,人人天天夜夜曰曰狠狠狠,免费观看网站 亚洲自国产拍偷拍,国产免费888在线观看,久久天天躁狠狠躁夜夜躁2020,无羞耻肉动漫在线观看 欧美成人电影,日本不卡免费一区二区,老司机精品视频在线观看,快播影院在线观看,无遮挡又色又黄的免费视频,美女一黄色网站,成年无码AV片在线观看,亚洲AVAV天堂Av在线不卡 色就色欧美综合在线影院,亚洲欧美卡通另类丝袜美腿,老司机福利在线观看,夜夜爽8888免费视频,国内自拍99re久久,2018Av天堂在线视频精品观看,少妇无码精品12p 午夜天堂欧美成人在线视频,超碰91自拍国产自拍,激情综合色综合啪啪五月,男人的天堂在线视频,午夜理理伦A级毛片天天看,无码熟妇人妻AV在线偷拍,大量偷拍情侣自拍视频 精品国产自在现线拍在线,无码专区人妻系列日韩,色婷婷色综合缴情网站,猛男操的我高潮连连,国产片av国语在线观看手机版,久久人人97超碰精品,亚洲最大AV网站在线观看
      久久亚洲精品无码爱剪辑,亚洲欧美国产vr在线观,国产真实乱子伦精品视频,日韩精品一区二区中文免费在线观看,在线A亚洲V天堂网2018,免费观看欧美大片毛片不用播放器 日本极品高清不卡AV,亚洲AⅤ天堂AV在线电影猫咪,五月色婷婷综合狠狠爱,碰超79网站,印度女人牲交视频免费播放,va在线看国产免费,狠狠躁夜夜躁人人爽天天古典 免费 在线 av 日本,免费A片在线观看,一本道久在道最新2021,人妻无码不卡中文字幕系列,午夜爽爽爽男女免费观看HD,日本高清视频永久网站www,东京热人妻无码人av 人人插人人莫人人干在线,AV天堂久久天堂AV色综合,欧美A色爱综合网欧美V,亚洲图欧美日韩在线,亚洲中文字幕曰本毛片,中文字幕97超碰大香寡妇蕉,久爱在线 亚洲AV片不卡无码久久,亚洲人成免费观看视频在线,欧洲亚洲偷自拍第一页,av在线播放日韩亚洲欧,一日本道不卡高清A无码,97碰碰碰人妻无码视频,加勒比最新无码AV免费资源 国内精品自线在拍,日韩一区二区三不卡高清,伊人中文字幕无码专区视频在线播放网站,看全黄大色黄大片美女蓝光在线看,无码av高清毛片在线看,人人超人人超碰超国产 小草视频手机在线视频,免费黃色大片,偷欧洲亚洲另类图片AV天堂,久久国产乱子伦,国产乱子伦精品视频,日本高清色本在线视频观看,加勒比一本HEYZO高清视频 AV无码东京热亚洲男人的天堂,315电影网A级毛片,深夜A级毛片视频免费,亚洲日本VA午夜在线电影,日本无码免费不卡AV二区,在线看午夜福利片国产,亚洲中文字幕aⅴ天堂 无码刺激性A片,成上人色爱A∨综合网,午夜性影院在线观看视频播放,手机国产乱子伦精品视频,无码99久热只有精品视频在线,狠狠噜天天噜日日黑人亚洲,在线观看无码不卡 真实国产乱子伦对白视频不卡,国产成人亚洲精品,老司机亚洲精品影院无码,亚洲成av人片在线观看天堂无码,美国一级a片,狠狠狠的在啪线香蕉亚洲,AV男人的天堂在线观看第三区