閱讀882 返回首頁    go 技術社區[雲棲]


基於MCP2515的Linux CAN總線驅動程序設計

MCP2515簡介

MCP2515是一種獨立的CAN總線通信控製器,是Microchip公司首批獨立CAN解決方案的升級器件,其傳輸能力較Microchip公司原有CAN控製器(MCP2510)高兩倍,最高通信速率可達到1Mbps。MCP2515能夠接收和發送標準數據幀和擴展數據幀以及遠程幀,通過兩個接收屏蔽寄存器和六個接收過濾寄存器濾除無關報文,從而減輕CPU負擔。

MCP2515主要功能參數及電氣特性如下:
      (1)支持CAN技術規範2.0A/B, 最高傳輸速率達到1Mbps;
      (2)支持標準數據幀、擴展數據幀和遠程幀,每幀數據域長度可為0~8個字節;
      (3)內含兩個的接收緩衝器和三個發送緩衝器,並且可編程設定優先級;
      (4)內含六個29位(bit)的接收過濾寄存器和兩個29位(bit)的接收屏蔽寄存器;
      (5)高速SPI接口,支持SPI 0,0和1,1模式;
      (6)一次性模式可確保報文被一次性傳輸;
      (7)具有可編程時鍾脈衝輸出引腳,可作為其他芯片時鍾信號源;
      (8) 幀起始(SOF)信號輸出功能可被用於在確定的係統中(如時間觸發CAN-TTCAN)執行時隙功能,或在CAN總線診斷中決定早期總線出級;
      (9) 采用低功耗CMOS技術,工作電壓:2.7V~5.5V, 工作電流:5mA(待機狀態1μA);
      (10)工作溫度範圍:(I)-40℃到+85℃,(E)-40℃到+125℃。

MCP2515 Socket CAN驅動實現

內核中為MCP2515提供了Socket CAN驅動程序,我們隻需為MCP2515芯片配置內核選項就可以使用Socket編程的方式使用MCP2515 CAN總線。

Socket CAN介紹

Socket CAN是在Linux下CAN協議實現的一種實現方法。Linux下最早使用CAN的方法是基於字符設備來實現的,與之不同的是Socket CAN使用伯克利的Socket接口和Linux網絡協議棧,這種方法使得CAN設備驅動可以通過網絡接口來調用。Socket CAN的接口被設計的盡量接近TCP/IP的協議,讓那些熟悉網絡編程的程序員能夠比較容易的學習和使用。

向Linux內核注冊MCP2515驅動

向Linux內核添加SPI驅動在之前的文章已經有詳細的介紹,根據硬件原理圖圖3所示,MCP2515掛在SPI0上,使用中斷GPF1,所以要向Linux內核注冊MCP2515設備,


注冊完成,執行make menuconfig配置內核選項。

1    [*]Networking support->
        2    <*>CAN bus subsystem support->
        3    <*>Raw CAN Protocal
        4    <*>Broadcast Manage CAN Protocal
        5    CAN Device Drivers->
        6    <*>Platform CAN driver with Netlink support
        7    [*]CAN bit-timing calculation
        8    <*>Microchip MCP251x SPI CAN controllers
        9 
        10    Device drivers->
        11    [*]SPI support -> 
        12    <*> Samsung S3C2416 series type SPI

編譯內核,內核啟動如圖顯示即說明MCP2515驅動加載成功。


Socket CAN測試

因為最新版BusyBox對Socket CAN的不支持,所以為了測試和使用Socket CAN,我們需要自己編譯Socket CAN的工具。這裏介紹兩個工具,分別是iproute2 和 canutils。

1 iproute2

(1)下載iproute2的最新源碼https://www.kernel.org/pub/linux/utils/net/iproute2/ 。筆者下載的是iproute2 3.6.0。

(2)解壓iproute2-3.6.0.tar.xz,修改Makefile第33行。
        33 #CC = gcc
        34 CC = arm-none-linux-gnueabi-gcc

(3)因為我們隻需要iprout2的ip命令,所以修改Makefile的第42行。
        42 #SUBDIRS=lib ip tc bridge misc netem genl man
        43 SUBDIRS=lib ip

(4)修改完成執行make命令,生成ip命令,拷貝到開發板文件係統目錄。

(5)使用ip命令。
        ifconfig can0 down         //關閉can0,以便配置
        ./ip link set can0 up type can bitrate 250000         //設置can0波特率
        ./ip -details link show can0        //顯示can0信息


2 canutils

Canutils是基於GNU GPLv2許可的開源代碼,包括canconfig、canecho、cansend、candump、cansequence五個工具,用於檢測和監控Socket CAN接口。

(1)下載canutils的最新源碼https://www.pengutronix.de/software/socket-can/download/canutils 。筆者下載的是canutils 4.0.6。
        (2)因為canutils編譯需要libsocketcan庫的支持,需要下載libsocketcan。https://www.pengutronix.de/software/libsocketcan/download/ 筆者下載的是libsocketcan 0.0.9。
        (3)解壓libsocketcan-0.0.9.tar.bz2。執行configure命令。(其中--host是指定交叉工具鏈,--prefix是指定庫的生成位置)
        ./configure --host=arm-none-linux-gnueabi --prefix=/home/linux/workdir/can/tools/libsocketcan
        (4)執行make編譯庫;
        (5)執行make install 生成庫。至此,libsocketcan編譯完畢。
        (6)解壓canutils-4.0.6.tar.bz2,執行configure命令。(其中--host是指定交叉工具鏈,--prefix是指定庫的生成位置,libsocketcan_LIBS是指定canconfig需要鏈接的庫,LDFLAGS是指定外部庫的路徑,CPPFLAGS是指定外部頭文件的路徑)
        ./configure --host=arm-none-linux-gnueabi --prefix=/home/linux/workdir/can/tools/canutils libsocketcan_LIBS=-lsocketcan LDFLAGS=-L/home/linux/workdir/can/tools/socketcan/lib CPPFLAGS=-I/home/linux/workdir/can/tools/socketcan/include
        (7)修改完成執行make命令,生成四個目錄,分別拷貝到開發板文件係統的相應目錄。
        (8)使用canutils工具。(可以使用[命令 + --help]的方式來查看命令的詳細用法,下麵隻介紹一些常用的指令)

① 配置CAN的總線通訊波特率:
        canconfig canX bitrate + 波特率


② 開啟 / 重啟 / 關閉CAN總線
        canconfig canX start
        canconfig canX restart
        canconfig canX stop


③ 查看CAN總線狀態
        canecho canX


④ 發送信息
        cansend canX –-identifier=ID + 數據


⑤ 接收數據
        candump canX


⑥ 使用濾波器接收ID匹配的數據
        candump canX –-filter=ID:mask





最後更新:2017-04-03 05:39:50

  上一篇:go 動態規劃經典題目:最大連續子序列和
  下一篇:go Maven詳解之倉庫------本地倉庫、遠程倉庫