快速瀏覽

如何配置和使用CAN總線


 

本頁介紹瞭如何通過 HW SPI 接口啟用 ODROID-C4 上的 CAN 總線。
還記錄了與 MCP2515 總線監控板交換數據的詳細說明。

can_bus


配置硬件需要以下產品:

ODROID-C4,修補套件,MCP2515 CAN 模塊

ODROID-C4
C 修補工具包 mcp2515

參考電路

使用修補套件連接 CAN 模塊和 ODROID-C4

[注 1] D1 二極管
如果 mcp2515 CAN 模塊加載/初始化沒有問題,則不需要串聯的二極管。
在 ODROID-C4 的情況下,pin2 或 pin4 的 5V 電源設計為 5.207V。
取決於板子在啟動時稍微提供了大約 5.3V 或更高的電壓。
該行為已導致 CAN 模塊的驅動程序探測失敗。如果您在 ODROID-C4 下遇到問題,請考慮串聯一個普通二極管,其正向電壓為 0.7V 或更低。
(在檢查中,從 ODROID-C4 引腳 2 或引腳 4 向 CAN 模塊提供 30mA 電流,因此二極管 1N5819 的正向電壓約為 0.3V。)
有時,即使使用長杜邦電纜也可以解決。

☞ 下載 Fritzing 零件mcp2515_canwthinkeringb.fzz


  • 2020 年 11 月 20 日4.9.236-104內核上使用ODROID-N2 ubuntu 最小圖像確認操作
  • 2020 年 11 月 20 日4.9.236-51內核上使用ODROID-C4 ubuntu 最小圖像確認操作
  • can-bus 示例使用與 spidev 相同的 cs-pin,因此不能同時啟用兩者。
  • 如果啟用了spidev,則can-bus 可能無法正常工作。
  • can-bus 示例使用設備樹覆蓋和 SPI 主機接口。spidev 模塊上分配的 cs-pin 為 0(零),mcp251x 使用的 can_dev 為 1(一)。
root@odroid:~# apt update && apt full-upgrade

在位於 /media/boot/config.ini 的文件中的 Device Tree Overlay 部分添加文本“can0”-can(zero)-。

    .
    .
    88
    89  ; Device Tree Overlay
    90  overlay_resize=16384
    91  overlay_profile=
    92  overlays="spi0 i2c0 i2c1 uart0 can0"
    93
    .
    .

然後重新啟動以應用更改。您可以檢查模塊是否已加載。

root@odroid:~# dmesg | grep spi
[    5.034462] meson-spicc ffd13000.spi: registered master spi0
[    5.034626] spi spi0.1: setup mode 0, 8 bits/w, 10000000 Hz max --> 0
[    5.034745] meson-spicc ffd13000.spi: registered child spi0.1
[    5.034768] spi spi0.0: setup mode 0, 8 bits/w, 100000000 Hz max --> 0
[    5.034863] meson-spicc ffd13000.spi: registered child spi0.0
[    9.297674] mcp251x spi0.1: setup mode 0, 8 bits/w, 10000000 Hz max --> 0
[    9.352688] mcp251x spi0.1 can0: MCP2515 successfully initialized.
root@odroid:~# lsmod | grep spi
spidev                 20480  0
spi_meson_spicc        20480  0
root@odroid:~# lsmod | grep mcp251x
mcp251x                24576  0
can_dev                24576  1 mcp251x
root@odroid:~#

驗證 CAN 主機驅動程序已正確註冊
root@odroid:~# ls /sys/class/net/
can0  eth0  lo
root@odroid:~# ifconfig can0
can0: flags=128<NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
root@odroid:~# 

在所有操作之前設置比特率示例:將can0接口的比特率設置為125kbps:

root@odroid:~# ip link set can0 type can bitrate 125000 triple-sampling on
root@odroid:~# ifconfig can0 up
root@odroid:~# ifconfig
can0: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.8  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::e160:7710:5360:f82a  prefixlen 64  scopeid 0x20<link>
        ether 02:00:00:0d:1d:01  txqueuelen 1000  (Ethernet)
        RX packets 24  bytes 6066 (6.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 54  bytes 6420 (6.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 22  
 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 129  bytes 10117 (10.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 129  bytes 10117 (10.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
root@odroid:~#

can-utils 包是 Linux 的 CAN 驅動程序和網絡工具的集合。它允許以與其他網絡設備類似的方式連接 CAN 總線設備。

sudo apt install can-utils

can0 上的環回模式

ifconfig can0 down 
ip link set can0 type can bitrate 125000 loopback on 
ifconfig can0 up 
ip -details link show can0
root@odroid:~# ifconfig can0 down
root@odroid:~# ip link set can0 type can bitrate 125000 loopback on
root@odroid:~# ifconfig can0 up
root@odroid:~# ip -details link show can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 10
    link/can  promiscuity 0 
    can <LOOPBACK,TRIPLE-SAMPLING> state ERROR-ACTIVE restart-ms 0 
          bitrate 125000 sample-point 0.850 
          tq 400 prop-seg 8 phase-seg1 8 phase-seg2 3 sjw 1
          mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
          clock 5000000numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
root@odroid:~# 

以下命令顯示從 CAN 總線接收到的報文

candump can0

在第二個終端上,以下命令在總線上發送 3 個字節(0x11、0x22、0x33),標識符為 500。

cansend can0 500#11.22.33

連接兩塊ODROID-N2/C4板的CANL、CANH引腳

下圖適用於舊版本的內核,不使用設備樹覆蓋,CS 引腳使用引腳編號 24(CE0)。
如果您使用的是內核設備樹覆蓋的最新版本內核 4.9.236-51(現在是 2020 年 11 月 27 日),則 CS 引腳應連接在引腳編號 26(#118)處,如上述參考電路

CAN總線連接

為兩塊板加電 在兩塊板的外殼中鍵入以下內容以配置 CAN 總線設備:

ip link set can0 type can bitrate 125000 triple-sampling on
ifconfig can0 up

在 板1(用於測試can0設備接收)的shell中輸入以下內容:

candump can0

在 板2 的shell中鍵入以下內容(用於測試通過can0設備發送數據包):

cansend can0 500#11.22.33

此時1號板會收到2號板發來的數據包:

root@odroid:~# candump can0
  can0  500   [3]  11 22 33
  can0  500   [3]  11 22 33
快速瀏覽

ODROID-C4

四核ARM CORTEX-A55 |4GB RAM |4 USB3 PORTS