1).?簡介
CAN(Controller Area Network)總線是嵌入式設備最為常用的接口之一,常用于汽車以及工業自動化等嵌入式領域,因此本文就基于嵌入式Linux演示使用CAN總線進行通訊測試。
本文所演示的平臺來自于Toradex Colibri iMX6DL?和Apalis iMX6D ARM嵌入式平臺,這兩個平臺是都是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。
2.?準備
a).?Colibri iMX6DL?ARM核心版配合Colibri Eva Board?V3.2B載板,連接調試串口到開發主機,同時配置好Ubuntu開發主機開發環境,具體操作方法可以參考這里。
b).?Apalis iMX6D?ARM核心板配合Ixora?V1.0載板,連接調試串口到開發主機,同時配置好Ubuntu開發主機開發環境,具體操作方法可以參考這里。
c). Colibri iMX6DL和Apalis iMX6D系統使用Toradex Linux Release V2.6.1,下載和更新方法請參考這里。
d). Colibri iMX6DL?提供了兩路來自與iMX6DL芯片的CAN總線(FlexCAN)支持,不過這個不是Colibri系列兼容定義;Colibri Eva Board上面通過SPI總線基于MCP2515芯片擴展了而一路CAN總線接口,這個是整個Colibri兼容的;因此對于本文的測試系統,我們可以有三路CAN總線支持,具體的Pin定義請見如下,其他Colibri系列產品的定義情況請見這里。
./ FlexCAN定義
./ MCP2515?原理圖設計如下,在JP4&JP5跳線連接情況下X2 Top連接器連接的是MCP2515 CAN總線;當斷開JP4&JP5跳線時候,可以使用連接線將FlexCAN RX/TX連接到X38來輸出到X2 Top.
d). Colibri產品系列定義中CAN不是標準定義,因此針對Colibri系列產品使用CAN總線要根據版本情況對kernel或者device tree進行修改編譯,下面針對Colibri iMX6DL V2.6.1版本進行配置,其他產品配置說明請參考這里。
./?下載對應的V2.6.1 kernel源代碼,具體下載和編譯方法請參考這里。
./?檢查kernel config是否下面選項都已經配置,在V2.6.1版本下默認都已經配置。
--------------------------
CONFIG_CAN = y
CONFIG_CAN_RAW = y
CONFIG_CAN_BCM = y
CONFIG_CAN_DEV = y
CAN_FLEXCAN = y
CAN_MCP251X = y
--------------------------
./?默認device tree只支持MCP2515 SPI CAN,通過如下修改device tree文件打開FlexCAN1和FlexCAN2,請注意在Toradex V2.7以上版本image中” &flexcan1”命名修改為”&can1”。
https://github.com/simonqin09/cantest/blob/master/flexcan.patch
e). Ixora載板CAN接口通過X20輸出,Apalis iMX6D?默認device tree已經支持FlexCAN1和FlexCAN2,無需做改動。
3).?使用CAN Utilities對CAN接口進行測試
a). Linux系統通過SocketCAN層提供CAN支持,使得可以使用類似操作socket API函數來操作CAN總線,具體關于SocketCAN說明請見這里。
b). Colibri iMX6?和Apalis iMX6默認image已經包含can-utils,可以直接使用;如下硬件連接將Colibri iMX6 FlexCAN1和Apalis iMX6 FlexCAN1進行連接
./ Colibri Eva Board JP4和JP5跳線斷開,將X9連接器?SODIMM_55和SODIMM_63管腳分別連接到X38連接器TX和RX插座。
./ Colibri Eva Board X2 Top DB9?管腳2和7通過兩端均配置120Ohm終端電阻的連線和Ixora載板X20管腳1和2連接。
c).?使能FlexCAN接口,下面以Colibri iMX6為例,Apalis iMX6方法一致
--------------------------
root@colibri-imx6:~# ip link set can1 type can bitrate 500000???????????????????
root@colibri-imx6:~# ip link set can1 up
/*也可以通過ifconfig up/down CAN接口*/
//root@colibri-imx6:~# ifconfig can1 up/down
/*ip –details查看CAN總線狀態*/
root@colibri-imx6:~# ip -details link show can1????????????????????????????????
3: can1: mtu 16 qdisc pfifo_fast state UNKNOWN mode DE0
link/can??promiscuity 0
can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.866
tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
clock 30000000
/* ip -details -statistics?查看工作狀態*/
root@colibri-imx6:~# ip -details -statistics link show can1
3: can1: mtu 16 qdisc pfifo_fast state UNKNOWN mode DE0
link/can??promiscuity 0
can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.866
tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
clock 30000000
re-started bus-errors arbit-lost error-warn error-pass bus-off
0??????????0??????????0??????????0??????????0??????????0
RX: bytes??packets??errors??dropped overrun mcast
0??????????0????????0???????0???????0???????0
TX: bytes??packets??errors??dropped carrier collsns
0??????????0????????0???????0???????0???????0
--------------------------
d). FlexCAN接口發送接收測試,下面以Colibri iMX6發送,Apalis iMX6接收為例,另外一個方向方法一致
--------------------------
/*Apalis iMX6*/
root@apalis-imx6:~# candump can0???????????????????????????????????????????????
interface = can0, family = 29, type = 3, proto = 1?????????????????????????????
<0x0000001f> [8] 11 22 33 44 55 66 77 88
/*Colibri iMX6*/
cansend can1 -e -i 0x1F 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
--------------------------
4).?通過C程序操作CAN總線示例
a).?首先同樣需要使用ip link命令配置CAN接口bitrate并使能接口,這里同樣在Colibri iMX6上面使用can1接口,同時Apalis iMX6上面使用can0接口。
b).?測試c程序代碼請見如下:
https://github.com/simonqin09/cantest/blob/master/cantest.c
./?程序執行包含兩個變量,第一個變量為”-r”或者”-s”來制定接收或者發送,第二個變量為所要測試的CAN bus,如”can0”。
./?具體以Colibri iMX6作為接收端,Apalis iMX6?作為發送端測試程序運行結果如下:
--------------------------
// Colibri iMX6?先運行接收命令
root@colibri-imx6:~# ./cantest -r can1?????????????????????????????????????????
can port is can1
// Apalis iMX6?然后運行發送命令
root@apalis-imx6:~# ./cantest -s can0??????????????????????????????????????????
can port is can0???????????????????????????????????????????????????????????????
can0 ID=0x1f data length=8?????????????????????????????????????????????????????
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 Sent out
//?此時Colibri iMX6上面接收數據情況如下,證明已經發送接收成功
root@colibri-imx6:~# ./cantest -r can1?????????????????????????????????????????
can port is can1???????????????????????????????????????????????????????????????
can1 ID=0x1f data length=8??????????????????????????????????????????????????????
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
--------------------------
5).?總結
利用SocketCAN可以非常方便的在Linux下使用CAN總線,另外CAN總線也支持同時發送并接收,這里就不做演示了。By Toradex秦海
1).?簡介
CAN(Controller Area Network)總線是嵌入式設備最為常用的接口之一,常用于汽車以及工業自動化等嵌入式領域,因此本文就基于嵌入式Linux演示使用CAN總線進行通訊測試。
本文所演示的平臺來自于Toradex Colibri iMX6DL?和Apalis iMX6D ARM嵌入式平臺,這兩個平臺是都是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。
2.?準備
a).?Colibri iMX6DL?ARM核心版配合Colibri Eva Board?V3.2B載板,連接調試串口到開發主機,同時配置好Ubuntu開發主機開發環境,具體操作方法可以參考這里。
b).?Apalis iMX6D?ARM核心板配合Ixora?V1.0載板,連接調試串口到開發主機,同時配置好Ubuntu開發主機開發環境,具體操作方法可以參考這里。
c). Colibri iMX6DL和Apalis iMX6D系統使用Toradex Linux Release V2.6.1,下載和更新方法請參考這里。
d). Colibri iMX6DL?提供了兩路來自與iMX6DL芯片的CAN總線(FlexCAN)支持,不過這個不是Colibri系列兼容定義;Colibri Eva Board上面通過SPI總線基于MCP2515芯片擴展了而一路CAN總線接口,這個是整個Colibri兼容的;因此對于本文的測試系統,我們可以有三路CAN總線支持,具體的Pin定義請見如下,其他Colibri系列產品的定義情況請見這里。
./ FlexCAN定義
./ MCP2515?原理圖設計如下,在JP4&JP5跳線連接情況下X2 Top連接器連接的是MCP2515 CAN總線;當斷開JP4&JP5跳線時候,可以使用連接線將FlexCAN RX/TX連接到X38來輸出到X2 Top.
d). Colibri產品系列定義中CAN不是標準定義,因此針對Colibri系列產品使用CAN總線要根據版本情況對kernel或者device tree進行修改編譯,下面針對Colibri iMX6DL V2.6.1版本進行配置,其他產品配置說明請參考這里。
./?下載對應的V2.6.1 kernel源代碼,具體下載和編譯方法請參考這里。
./?檢查kernel config是否下面選項都已經配置,在V2.6.1版本下默認都已經配置。
--------------------------
CONFIG_CAN = y
CONFIG_CAN_RAW = y
CONFIG_CAN_BCM = y
CONFIG_CAN_DEV = y
CAN_FLEXCAN = y
CAN_MCP251X = y
--------------------------
./?默認device tree只支持MCP2515 SPI CAN,通過如下修改device tree文件打開FlexCAN1和FlexCAN2,請注意在Toradex V2.7以上版本image中” &flexcan1”命名修改為”&can1”。
https://github.com/simonqin09/cantest/blob/master/flexcan.patch
e). Ixora載板CAN接口通過X20輸出,Apalis iMX6D?默認device tree已經支持FlexCAN1和FlexCAN2,無需做改動。
3).?使用CAN Utilities對CAN接口進行測試
a). Linux系統通過SocketCAN層提供CAN支持,使得可以使用類似操作socket API函數來操作CAN總線,具體關于SocketCAN說明請見這里。
b). Colibri iMX6?和Apalis iMX6默認image已經包含can-utils,可以直接使用;如下硬件連接將Colibri iMX6 FlexCAN1和Apalis iMX6 FlexCAN1進行連接
./ Colibri Eva Board JP4和JP5跳線斷開,將X9連接器?SODIMM_55和SODIMM_63管腳分別連接到X38連接器TX和RX插座。
./ Colibri Eva Board X2 Top DB9?管腳2和7通過兩端均配置120Ohm終端電阻的連線和Ixora載板X20管腳1和2連接。
c).?使能FlexCAN接口,下面以Colibri iMX6為例,Apalis iMX6方法一致
--------------------------
root@colibri-imx6:~# ip link set can1 type can bitrate 500000???????????????????
root@colibri-imx6:~# ip link set can1 up
/*也可以通過ifconfig up/down CAN接口*/
//root@colibri-imx6:~# ifconfig can1 up/down
/*ip –details查看CAN總線狀態*/
root@colibri-imx6:~# ip -details link show can1????????????????????????????????
3: can1: mtu 16 qdisc pfifo_fast state UNKNOWN mode DE0
link/can??promiscuity 0
can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.866
tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
clock 30000000
/* ip -details -statistics?查看工作狀態*/
root@colibri-imx6:~# ip -details -statistics link show can1
3: can1: mtu 16 qdisc pfifo_fast state UNKNOWN mode DE0
link/can??promiscuity 0
can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.866
tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
clock 30000000
re-started bus-errors arbit-lost error-warn error-pass bus-off
0??????????0??????????0??????????0??????????0??????????0
RX: bytes??packets??errors??dropped overrun mcast
0??????????0????????0???????0???????0???????0
TX: bytes??packets??errors??dropped carrier collsns
0??????????0????????0???????0???????0???????0
--------------------------
d). FlexCAN接口發送接收測試,下面以Colibri iMX6發送,Apalis iMX6接收為例,另外一個方向方法一致
--------------------------
/*Apalis iMX6*/
root@apalis-imx6:~# candump can0???????????????????????????????????????????????
interface = can0, family = 29, type = 3, proto = 1?????????????????????????????
<0x0000001f> [8] 11 22 33 44 55 66 77 88
/*Colibri iMX6*/
cansend can1 -e -i 0x1F 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
--------------------------
4).?通過C程序操作CAN總線示例
a).?首先同樣需要使用ip link命令配置CAN接口bitrate并使能接口,這里同樣在Colibri iMX6上面使用can1接口,同時Apalis iMX6上面使用can0接口。
b).?測試c程序代碼請見如下:
https://github.com/simonqin09/cantest/blob/master/cantest.c
./?程序執行包含兩個變量,第一個變量為”-r”或者”-s”來制定接收或者發送,第二個變量為所要測試的CAN bus,如”can0”。
./?具體以Colibri iMX6作為接收端,Apalis iMX6?作為發送端測試程序運行結果如下:
--------------------------
// Colibri iMX6?先運行接收命令
root@colibri-imx6:~# ./cantest -r can1?????????????????????????????????????????
can port is can1
// Apalis iMX6?然后運行發送命令
root@apalis-imx6:~# ./cantest -s can0??????????????????????????????????????????
can port is can0???????????????????????????????????????????????????????????????
can0 ID=0x1f data length=8?????????????????????????????????????????????????????
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 Sent out
//?此時Colibri iMX6上面接收數據情況如下,證明已經發送接收成功
root@colibri-imx6:~# ./cantest -r can1?????????????????????????????????????????
can port is can1???????????????????????????????????????????????????????????????
can1 ID=0x1f data length=8??????????????????????????????????????????????????????
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
--------------------------
5).?總結
利用SocketCAN可以非常方便的在Linux下使用CAN總線,另外CAN總線也支持同時發送并接收,這里就不做演示了。
?
評論
查看更多