《電子技術應用》
您所在的位置:首頁 > 電子元件 > 業界動態 > 教程:如何用FPGA實現CAN總線通信控制器

教程:如何用FPGA實現CAN總線通信控制器

2023-01-30
來源:FPGA技術江湖

  CAN 總線(Controller Area Network)是控制器局域網的簡稱,是 20 世紀 80 年代初德國 BOSCH 公司為解決現代汽車中眾多的控制與測試儀器之間的數據交換而開發的一種串行數據通信協議。目前,CAN 總線已經被列入 ISO 國際標準,稱為 ISO11898。CAN 總線已經成為工業數據通信的主流技術之一。

  CAN 總線作為數字式串行通信技術,與其他同類技術相比,在可靠性、實時性和靈活性方面具有獨特的技術優勢,主要特點如下:

  CAN 總線是一種多主總線,總線上任意節點可在任意時刻主動地向網絡上其他節點發送信息而不分主次,因此可在各節點之間實現自由通信。

  CAN 總線采用非破壞性總線仲裁技術。但多個節點同時向總線發送信息時,優先級低的節點會主動退出發送,而最高優先級的節點可以不受影響地繼續傳輸數據,從而大大節省總線沖突的仲裁時間。即使在網絡負載很重的情況下也不會發生網絡癱瘓情況。

  CAN 總線的通信介質可以是雙絞線、同軸電纜或光導纖維,選擇靈活。

  CAN 總線的通信速率可達 1Mbit/s(此時通信距離最長為 40 米),通信距離最遠可達 10km(速率在 5kbit/s 以下)。

  CAN 總線上的節點信息分成不同的優先級,可以滿足不同級別的實時要求,高優先級的數據可以在 134μs 內得到傳輸。

  CAN 總線通過報文濾波即可實現點對點、一點對多點及全局廣播等幾種方式傳送數據,無需專門的調度。

  CAN 總線的數據采用短幀結構,傳輸時間短,受干擾概率低,具有極好的檢錯效果。

  CAN 總線采用 CRC 檢驗并可提供相應的錯誤處理功能,保證了數據通信的可靠性。

  CAN 總線上的器件可被置于無任何內部活動的睡眠方式,相當于未連接到總線上,可以有效降低系統功耗。

  CAN 總線上的節點在錯誤嚴重的情況下具有自動關閉輸出的功能,以使總線上其他節點的操作不受影響。CAN 總線卓越的特性、極高的可靠性和獨特的設計,特別適合工業過程中監控設備的互連,因此,越來越受到工業界的重視,并被公認為是最有前途的現場總線之一。另外,CAN 總線協議已被國際標準化組織認可,技術比較成熟,控制的芯片已經商品化,性價比高,特別適用于分布式測控系統之間的數通訊。

  CAN 總線插卡可以任意插在 PC AT XT 兼容機上,方便地構成分布式監控系統。因此,用 FPGA 實現 CAN 總線通信控制器具有非常重要的應用價值。本篇將通過一個實例講解利用 FPGA 實現 CAN 總線通信控制器的實現方法。

  第三篇內容摘要:本篇會介紹程序的仿真與測試以及總結等相關內容。

  四、程序的仿真與測試

  CAN 總線通信控制器的仿真程序,需要模擬數據的發送和接收。

  下面是測試程序的部分代碼:

  //連接 can_top 模塊

  can_top i_can_top(

  .cs_can_i(cs_can),

  .clk_i(clk),

  .rx_i(rx_and_tx),

  .tx_o(tx),

  .irq_on(irq),

  .clkout_o(clkout)

 ?。?;

  //產生 24 MHz 時鐘

  iniTIal

  begin

  clk=0;

  forever #21 clk = ~clk;

  end

  //初始化

  iniTIal

  begin

  start_tb = 0;

  cs_can = 0;

  rx = 1;

  extended_mode = 0;

  tx_bypassed = 0;

  rst_i = 1'b0;

  ale_i = 1'b0;

  rd_i = 1'b0;

  wr_i = 1'b0;

  port_0_o = 8'h0;

  port_0_en = 0;

  port_free = 1;

  rst_i = 1;

  #200 rst_i = 0;

  #200 start_tb = 1;

  end

  //產生延遲的 tx 信號(CAN 發送器延遲)

  always

  begin

  wait (tx);

  repeat (4*BRP) @ (posedge clk); // 4 TIme quants delay

  #1 delayed_tx = tx;

  wait (~tx);

  repeat (4*BRP) @ (posedge clk); // 4 TIme quants delay

  #1 delayed_tx = tx;

  end

  assign rx_and_tx = rx & (delayed_tx | tx_bypassed); // When this signal is on, tx is not

  looped back to the rx.

  //主程序

  initial

  begin

  wait(start_tb);

  //設置總線時序寄存器

  write_register(8'd6, {`CAN_TIMING0_SJW, `CAN_TIMING0_BRP});

  write_register(8'd7, {`CAN_TIMING1_SAM, `CAN_TIMING1_TSEG2, `CAN_TIMING1_TSEG1});

  // 設置時鐘分頻寄存器

  extended_mode = 1'b0;

  write_register(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not

  extended)

  //設置接收代碼和接收寄存器

  write_register(8'd16, 8'ha6); // acceptance code 0

  write_register(8'd17, 8'hb0); // acceptance code 1

  write_register(8'd18, 8'h12); // acceptance code 2

  write_register(8'd19, 8'h30); // acceptance code 3

  write_register(8'd20, 8'h0); // acceptance mask 0

  write_register(8'd21, 8'h0); // acceptance mask 1

  write_register(8'd22, 8'h00); // acceptance mask 2

  write_register(8'd23, 8'h00); // acceptance mask 3

  write_register(8'd4, 8'he8); // acceptance code

  write_register(8'd5, 8'h0f); // acceptance mask

  #10;

  repeat (1000) @ (posedge clk);

  //開關復位模式

  write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});

  repeat (BRP) @ (posedge clk);

  // 在復位后設置總線空閑

  repeat (11) send_bit(1);

  test_full_fifo; // test currently switched on

  send_frame; // test currently switched off

  bus_off_test; // test currently switched off

  forced_bus_off; // test currently switched off

  send_frame_basic; // test currently switched off

  send_frame_extended; // test currently switched off

  self_reception_request; // test currently switched off

  manual_frame_basic; // test currently switched off

  manual_frame_ext; // test currently switched off

  $display(“CAN Testbench finished !”);

  $stop;

  end

  在測試過程中通過多個任務來分別驗證程序的各個功能模塊。下面的程序用于驗證強制關閉總線任務:

  //強制關閉總線任務

  task forced_bus_off; // Forcing bus-off by writinf to tx_err_cnt register

  begin

  //切換到復位模式

  write_register(8'd0, {7'h0, `CAN_MODE_RESET});

  // 設置時鐘分頻寄存器

  write_register(8'd31, {1'b1, 7'h0}); // Setting the extended mode (not normal)

  // 寫數據到寄存器中

  write_register(8'd15, 255);

  // 切換復位模式

  write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});

  #2500000;

  // 切換復位模式

  write_register(8'd0, {7'h0, `CAN_MODE_RESET});

  // 寫數據到寄存器中

  write_register(8'd15, 245);

  //關閉復位模式

  write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});

  #1000000;

  end

  endtask // forced_bus_off

  下面的程序驗證如何發送一個基本格式的幀數據:

  //發送一個基本格式的幀

  task manual_frame_basic;

  begin

  // 切換到復位模式

  write_register(8'd0, {7'h0, (`CAN_MODE_RESET)});

  //設置寄存器

  write_register(8'd4, 8'h28); // acceptance code

  write_register(8'd5, 8'hff); // acceptance mask

  repeat (100) @ (posedge clk);

  // 切換復位模式

  write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});

  // 模塊復位后設置總線空閑

  repeat (11) send_bit(1);

  write_register(8'd10, 8'h55); // Writing ID[10:3] = 0x55

  write_register(8'd11, 8'h57); // Writing ID[2:0] = 0x2, rtr = 1, length = 7

  write_register(8'd12, 8'h00); // data byte 1

  write_register(8'd13, 8'h00); // data byte 2

  write_register(8'd14, 8'h00); // data byte 3

  write_register(8'd15, 8'h00); // data byte 4

  write_register(8'd16, 8'h00); // data byte 5

  write_register(8'd17, 8'h00); // data byte 6

  write_register(8'd18, 8'h00); // data byte 7

  write_register(8'd19, 8'h00); // data byte 8

  tx_bypassed = 1; // When this signal is on, tx is not looped back to the rx.

  fork

  begin

  self_reception_request_command;

  end

  begin

  #2200;

  repeat (1)

  //開始發送數據

  begin

  send_bit(0); // 幀起始

  send_bit(0); // ID

  send_bit(1); // ID

  send_bit(0); // ID

  send_bit(1); // ID

  send_bit(0); // ID

  send_bit(1); // ID

  send_bit(0); // ID

  send_bit(1); // ID

  send_bit(0); // ID

  send_bit(1); // ID

  send_bit(0); // ID

  send_bit(1); // RTR

  send_bit(0); // IDE

  send_bit(0); // r0

  send_bit(0); // DLC

  send_bit(1); // DLC

  send_bit(1); // DLC

  send_bit(1); // DLC

  send_bit(1); // CRC

  send_bit(1); // CRC

  send_bit(0); // CRC stuff

  send_bit(0); // CRC 6

  send_bit(0); // CRC

  send_bit(0); // CRC

  send_bit(0); // CRC

  send_bit(1); // CRC stuff

  send_bit(0); // CRC 0

  send_bit(0); // CRC

  send_bit(1); // CRC

  send_bit(0); // CRC

  send_bit(1); // CRC 5

  send_bit(1); // CRC

  send_bit(0); // CRC

  send_bit(1); // CRC

  send_bit(1); // CRC b

  send_bit(1); // CRC DELIM

  send_bit(0); // ACK

  send_bit(1); // ACK DELIM

  send_bit(1); // EOF

  send_bit(1); // EOF

  send_bit(1); // EOF

  send_bit(1); // EOF

  send_bit(1); // EOF

  send_bit(1); // EOF

  send_bit(1); // EOF

  send_bit(1); // INTER

  send_bit(1); // INTER

  send_bit(1); // INTER

  end // repeat

  end

  join

  //從接收緩沖中讀取數據

  read_receive_buffer;

  release_rx_buffer_command;

  read_receive_buffer;

  release_rx_buffer_command;

  read_receive_buffer;

  #4000000;

  end

  endtask // manual_frame_basic

  五、總結

  本篇通過一個實例講解如何用 FPGA 實現 CAN 總線通信控制器。首先講解了 CAN 總線協議的有關內容,然后介紹了一種常用的 CAN 通信控制器 SJA1000 的主要特點。接下來講解程序的主要框架和具體代碼。最后通過一個測試程序驗證了程序。這個實例為讀者實現自己的 CAN總線通信控制器提供了一個可以應用的案例。



更多信息可以來這里獲取==>>電子技術應用-AET<<

mmexport1621241704608.jpg

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲福利在线看| 久久久99爱| 久久香蕉国产线看观看网| 亚洲欧美国产精品va在线观看| 欧美亚洲视频在线看网址| 国产日韩欧美不卡在线| 亚洲欧美激情在线视频| 国外成人在线| 国产综合欧美| 久久精品国产亚洲5555| 欧美日本一区二区视频在线观看| 国产综合精品| 欧美激情一区二区三区高清视频| 久久国产精品72免费观看| 国产精品天天看| 久久综合九色欧美综合狠狠| 激情综合在线| 一区二区电影免费观看| 国产免费观看久久黄| 久久久久久电影| 日韩亚洲国产欧美| 欧美一区影院| 一区二区三区视频免费在线观看| 韩日精品中文字幕| 欧美在线一区二区三区| 欧美视频二区36p| 日韩天天综合| 美日韩精品视频免费看| 国内伊人久久久久久网站视频| 久久riav二区三区| 亚洲午夜电影| 亚洲午夜女主播在线直播| 六十路精品视频| 亚洲黄色性网站| 欧美国产视频日韩| 麻豆成人精品| 欧美亚洲一级| 久久久久国产精品厨房| 老鸭窝亚洲一区二区三区| 欧美福利电影网| 一区二区三区视频观看| 亚洲麻豆视频| 欧美一区激情视频在线观看| 欧美亚州韩日在线看免费版国语版| 亚洲天堂第二页| 永久域名在线精品| 亚洲三级色网| 国产精品久久一卡二卡| 这里只有精品视频在线| 制服丝袜激情欧洲亚洲| 午夜久久99| 亚洲乱码国产乱码精品精| 亚洲福利视频三区| 国产日韩视频一区二区三区| 国产精品草莓在线免费观看| 国产精品久久久久9999吃药| 一区二区三区四区精品| 日韩视频一区二区三区在线播放| 狠狠色丁香婷婷综合| 亚洲欧美成人综合| 亚洲美女黄网| 国产精品欧美日韩久久| 欧美日韩不卡在线| 欧美成va人片在线观看| 亚洲高清资源综合久久精品| 欧美成人精品h版在线观看| 国产精品自拍网站| 欧美一区免费视频| 国产精品v亚洲精品v日韩精品| 欧美精品一区二区三区在线看午夜| 亚洲精品女人| 欧美成人午夜激情| 欧美亚洲日本国产| 伊大人香蕉综合8在线视| 亚洲国产精品久久久久秋霞蜜臀| 亚洲日本无吗高清不卡| 国产视频综合在线| 欧美日韩日本网| 欧美网站大全在线观看| 国产精品久久久一区麻豆最新章节| 国产精品久久久久9999吃药| 亚洲免费播放| 欧美在线视频日韩| 欧美日韩亚洲综合一区| 中文成人激情娱乐网| 亚洲激情影院| 午夜精品美女久久久久av福利| 久久综合五月天婷婷伊人| 亚洲精品日韩欧美| 国产欧美一二三区| 亚洲色图制服丝袜| 亚洲精品小视频在线观看| 精品99视频| 国产精品一区久久久| 一区二区三区福利| 欧美一区亚洲一区| 亚洲视频在线观看免费| 午夜在线观看免费一区| 欧美视频在线观看一区| 欧美激情女人20p| 一本久久综合亚洲鲁鲁| 麻豆9191精品国产| 亚洲国产日韩一区二区| 亚洲欧美精品在线| 18成人免费观看视频| 欧美三日本三级三级在线播放| 欧美激情视频一区二区三区免费| 国产欧美一区二区精品秋霞影院| 国产亚洲免费的视频看| 亚洲在线观看免费视频| 一色屋精品视频免费看| 欧美日韩在线播放| 另类图片综合电影| 久久se精品一区精品二区| 欧美性猛交xxxx乱大交蜜桃| 亚洲精品视频免费观看| 欧美一区日本一区韩国一区| 亚洲一本大道在线| 亚洲在线网站| 先锋影音网一区二区| 国产欧美精品在线| 欧美成人精品在线| 日韩视频专区| 欧美亚洲一区二区三区| 亚洲性夜色噜噜噜7777| 99国产精品视频免费观看一公开| 欧美午夜在线一二页| 欧美日韩一区二区三区免费看| 久久一区国产| 在线一区二区三区四区| 久久国产精品电影| 亚洲国产成人porn| 日韩性生活视频| 在线播放日韩欧美| 国产欧美 在线欧美| 日韩视频中午一区| 欧美激情综合五月色丁香小说| 国产日韩精品一区二区三区在线| 亚洲自拍16p| 激情六月婷婷综合| 激情欧美丁香| 亚洲综合色噜噜狠狠| 久久久精品日韩欧美| 99国产精品视频免费观看一公开| 亚洲国产成人在线播放| 国产亚洲成年网址在线观看| 91久久精品日日躁夜夜躁国产| 国产欧美日韩视频在线观看| 亚洲国产小视频在线观看| 欧美在线一二三| 国产精品美女久久福利网站| 欧美日韩极品在线观看一区| 国产亚洲制服色| 亚洲精品综合精品自拍| 欧美成人在线免费观看| 亚洲电影在线免费观看| 亚洲国产精品成人精品| 激情av一区二区| 国产精品一国产精品k频道56| 国产一区二区三区在线免费观看| 欧美一级视频一区二区| 久久噜噜噜精品国产亚洲综合| 一区二区久久久久| 亚洲日本aⅴ片在线观看香蕉| 欧美国产日韩精品免费观看| 亚洲一区二区三区精品视频| 在线视频你懂得一区二区三区| 国产在线播放一区二区三区| 亚洲永久免费精品| 国产精品人人做人人爽人人添| 欧美大片一区| 夜夜精品视频一区二区| 一本色道精品久久一区二区三区| 久久久女女女女999久久| 久久婷婷国产麻豆91天堂| 久久久久国内| 亚洲人体一区| 欧美日韩国产精品自在自线| 亚洲卡通欧美制服中文| 国产欧美视频一区二区三区| 亚洲国产精品一区二区三区| 欧美激情精品久久久| 性高湖久久久久久久久| 午夜精品www| 国产一区二区久久精品| 欧美三级日本三级少妇99| 欧美精品一区二区在线播放| 国产精品亚洲不卡a| 在线日韩日本国产亚洲| 久久综合九色综合网站| 久久久国产成人精品| 国产日产精品一区二区三区四区的观看方式| 国产毛片一区二区| 久久青草欧美一区二区三区| 亚洲每日更新| 欧美性生交xxxxx久久久| 欧美体内谢she精2性欧美| 亚洲激情亚洲| 亚洲美女中出| 亚洲美女诱惑| 亚洲午夜精品17c| 噜噜噜在线观看免费视频日韩| 国内精品**久久毛片app| 亚洲精品久久视频| 国产精品福利网站| 一区免费在线| 国产精品私拍pans大尺度在线| 国产一区二区三区最好精华液| 欧美精品日韩三级| 亚洲私人影院在线观看| 99综合电影在线视频| 欧美日韩一区二区在线视频| 性xx色xx综合久久久xx| 欧美色道久久88综合亚洲精品| 久久婷婷国产综合尤物精品| 亚洲第一色中文字幕| 亚洲精品国产精品久久清纯直播| 精品成人a区在线观看| 欧美1级日本1级| 欧美v国产在线一区二区三区| 亚洲国产美女久久久久| 欧美日韩精品久久| 国产人成一区二区三区影院| 欧美日本国产视频| 久久丁香综合五月国产三级网站| 欧美激情一区二区久久久| 欧美日韩另类字幕中文| 亚洲性人人天天夜夜摸| 亚洲人精品午夜在线观看| 红桃视频国产一区| 亚洲一区二区高清视频| 免费短视频成人日韩| 亚洲欧美国产制服动漫| 亚洲夫妻自拍| 久久久久久网| 久久一区二区三区超碰国产精品| 久久中文精品| 韩国福利一区| 欧美精品久久一区二区| 亚洲欧美www| 欧美色播在线播放| 亚洲另类在线一区| 你懂的视频欧美| 国产欧美精品一区aⅴ影院| 欧美日韩中文另类| 香蕉久久一区二区不卡无毒影院| 国产一区二区三区成人欧美日韩在线观看| 久久精品五月| 久久国产加勒比精品无码| 欧美中日韩免费视频| 欧美一级视频一区二区| 在线观看一区二区精品视频| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品久久国产精品99gif| 亚洲国产精品成人综合| 日韩视频一区二区三区在线播放免费观看| 一区二区三区高清| 久久久精品国产99久久精品芒果| 欧美精品乱人伦久久久久久| 久久成人人人人精品欧| 欧美激情精品| 欧美日韩和欧美的一区二区| 美日韩精品免费观看视频| 国产精品视频免费一区| 精品99视频| 午夜一区二区三视频在线观看| 亚洲性线免费观看视频成熟| 欧美在线亚洲在线| 国产深夜精品| 欧美三级资源在线| 精品999在线播放| 国产精品剧情在线亚洲| 亚洲国产一区在线| 亚洲女ⅴideoshd黑人| 99精品热视频| 欧美日本乱大交xxxxx| 欧美日韩美女在线观看| 性8sex亚洲区入口| 欧美成人免费视频| 一本色道综合亚洲| 国产女主播一区二区| 国产精品国产三级国产aⅴ9色| 欧美激情1区2区| 免费成人高清视频| 欧美三级电影精品| 欧美精品一区二区高清在线观看| 亚洲第一免费播放区| 日韩视频免费观看高清在线视频| 欧美日韩国产成人在线免费| 国产精品电影网站| 欧美四级在线观看| 欧美日韩一二区| 你懂的成人av| 一区在线电影| 欧美日韩另类丝袜其他| 欧美裸体一区二区三区| 欧美日韩国产经典色站一区二区三区| 国产一区二区高清视频| 亚洲视频第一页| 欧美日韩在线精品一区二区三区| 欧美日韩国产综合一区二区| 亚洲免费视频中文字幕| 欧美日韩亚洲一区在线观看| 欧美福利视频网站| 久久久水蜜桃| 久久这里只精品最新地址| 欧美日韩中文字幕在线| 老司机凹凸av亚洲导航| 亚洲国产精品一区二区久| 国产精品久久久久久福利一牛影视| 欧美日韩在线视频一区| 亚洲国产精品久久久久秋霞影院| 玖玖综合伊人| 亚洲国产欧美一区| 国产午夜精品久久久久久久| 一区二区三区日韩| 一区二区精品在线观看| 欧美日韩在线影院| 欧美国产视频日韩| 国产欧美一区二区三区在线看蜜臀| 精品盗摄一区二区三区| 女仆av观看一区| 欧美日韩午夜精品| 亚洲黑丝一区二区| 欧美日韩另类视频| 亚洲欧美欧美一区二区三区| 欧美手机在线| 亚洲第一区在线观看|