1).?簡(jiǎn)介
CAN(Controller Area Network)總線是嵌入式設(shè)備最為常用的接口之一,常用于汽車(chē)以及工業(yè)自動(dòng)化等嵌入式領(lǐng)域,因此本文就基于嵌入式Linux演示使用CAN總線進(jìn)行通訊測(cè)試。
本文所演示的平臺(tái)來(lái)自于Toradex Colibri iMX6DL?和Apalis iMX6D ARM嵌入式平臺(tái),這兩個(gè)平臺(tái)是都是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。
2.?準(zhǔn)備
a).?Colibri iMX6DL?ARM核心版配合Colibri Eva Board?V3.2B載板,連接調(diào)試串口到開(kāi)發(fā)主機(jī),同時(shí)配置好Ubuntu開(kāi)發(fā)主機(jī)開(kāi)發(fā)環(huán)境,具體操作方法可以參考這里。
b).?Apalis iMX6D?ARM核心板配合Ixora?V1.0載板,連接調(diào)試串口到開(kāi)發(fā)主機(jī),同時(shí)配置好Ubuntu開(kāi)發(fā)主機(jī)開(kāi)發(fā)環(huán)境,具體操作方法可以參考這里。
c). Colibri iMX6DL和Apalis iMX6D系統(tǒng)使用Toradex Linux Release V2.6.1,下載和更新方法請(qǐng)參考這里。
d). Colibri iMX6DL?提供了兩路來(lái)自與iMX6DL芯片的CAN總線(FlexCAN)支持,不過(guò)這個(gè)不是Colibri系列兼容定義;Colibri Eva Board上面通過(guò)SPI總線基于MCP2515芯片擴(kuò)展了而一路CAN總線接口,這個(gè)是整個(gè)Colibri兼容的;因此對(duì)于本文的測(cè)試系統(tǒng),我們可以有三路CAN總線支持,具體的Pin定義請(qǐng)見(jiàn)如下,其他Colibri系列產(chǎn)品的定義情況請(qǐng)見(jiàn)這里。
./ FlexCAN定義
./ MCP2515?原理圖設(shè)計(jì)如下,在JP4&JP5跳線連接情況下X2 Top連接器連接的是MCP2515 CAN總線;當(dāng)斷開(kāi)JP4&JP5跳線時(shí)候,可以使用連接線將FlexCAN RX/TX連接到X38來(lái)輸出到X2 Top.
d). Colibri產(chǎn)品系列定義中CAN不是標(biāo)準(zhǔn)定義,因此針對(duì)Colibri系列產(chǎn)品使用CAN總線要根據(jù)版本情況對(duì)kernel或者device tree進(jìn)行修改編譯,下面針對(duì)Colibri iMX6DL V2.6.1版本進(jìn)行配置,其他產(chǎn)品配置說(shuō)明請(qǐng)參考這里。
./?下載對(duì)應(yīng)的V2.6.1 kernel源代碼,具體下載和編譯方法請(qǐng)參考這里。
./?檢查kernel config是否下面選項(xiàng)都已經(jīng)配置,在V2.6.1版本下默認(rèn)都已經(jīng)配置。
--------------------------
CONFIG_CAN = y
CONFIG_CAN_RAW = y
CONFIG_CAN_BCM = y
CONFIG_CAN_DEV = y
CAN_FLEXCAN = y
CAN_MCP251X = y
--------------------------
./?默認(rèn)device tree只支持MCP2515 SPI CAN,通過(guò)如下修改device tree文件打開(kāi)FlexCAN1和FlexCAN2,請(qǐng)注意在Toradex V2.7以上版本image中” &flexcan1”命名修改為”&can1”。
https://github.com/simonqin09/cantest/blob/master/flexcan.patch
e). Ixora載板CAN接口通過(guò)X20輸出,Apalis iMX6D?默認(rèn)device tree已經(jīng)支持FlexCAN1和FlexCAN2,無(wú)需做改動(dòng)。
3).?使用CAN Utilities對(duì)CAN接口進(jìn)行測(cè)試
a). Linux系統(tǒng)通過(guò)SocketCAN層提供CAN支持,使得可以使用類(lèi)似操作socket API函數(shù)來(lái)操作CAN總線,具體關(guān)于SocketCAN說(shuō)明請(qǐng)見(jiàn)這里。
b). Colibri iMX6?和Apalis iMX6默認(rèn)image已經(jīng)包含can-utils,可以直接使用;如下硬件連接將Colibri iMX6 FlexCAN1和Apalis iMX6 FlexCAN1進(jìn)行連接
./ Colibri Eva Board JP4和JP5跳線斷開(kāi),將X9連接器?SODIMM_55和SODIMM_63管腳分別連接到X38連接器TX和RX插座。
./ Colibri Eva Board X2 Top DB9?管腳2和7通過(guò)兩端均配置120Ohm終端電阻的連線和Ixora載板X(qián)20管腳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
/*也可以通過(guò)ifconfig up/down CAN接口*/
//root@colibri-imx6:~# ifconfig can1 up/down
/*ip –details查看CAN總線狀態(tài)*/
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?查看工作狀態(tài)*/
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接口發(fā)送接收測(cè)試,下面以Colibri iMX6發(fā)送,Apalis iMX6接收為例,另外一個(gè)方向方法一致
--------------------------
/*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).?通過(guò)C程序操作CAN總線示例
a).?首先同樣需要使用ip link命令配置CAN接口bitrate并使能接口,這里同樣在Colibri iMX6上面使用can1接口,同時(shí)Apalis iMX6上面使用can0接口。
b).?測(cè)試c程序代碼請(qǐng)見(jiàn)如下:
https://github.com/simonqin09/cantest/blob/master/cantest.c
./?程序執(zhí)行包含兩個(gè)變量,第一個(gè)變量為”-r”或者”-s”來(lái)制定接收或者發(fā)送,第二個(gè)變量為所要測(cè)試的CAN bus,如”can0”。
./?具體以Colibri iMX6作為接收端,Apalis iMX6?作為發(fā)送端測(cè)試程序運(yùn)行結(jié)果如下:
--------------------------
// Colibri iMX6?先運(yùn)行接收命令
root@colibri-imx6:~# ./cantest -r can1?????????????????????????????????????????
can port is can1
// Apalis iMX6?然后運(yùn)行發(fā)送命令
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
//?此時(shí)Colibri iMX6上面接收數(shù)據(jù)情況如下,證明已經(jīng)發(fā)送接收成功
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).?總結(jié)
利用SocketCAN可以非常方便的在Linux下使用CAN總線,另外CAN總線也支持同時(shí)發(fā)送并接收,這里就不做演示了。By Toradex秦海
1).?簡(jiǎn)介
CAN(Controller Area Network)總線是嵌入式設(shè)備最為常用的接口之一,常用于汽車(chē)以及工業(yè)自動(dòng)化等嵌入式領(lǐng)域,因此本文就基于嵌入式Linux演示使用CAN總線進(jìn)行通訊測(cè)試。
本文所演示的平臺(tái)來(lái)自于Toradex Colibri iMX6DL?和Apalis iMX6D ARM嵌入式平臺(tái),這兩個(gè)平臺(tái)是都是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。
2.?準(zhǔn)備
a).?Colibri iMX6DL?ARM核心版配合Colibri Eva Board?V3.2B載板,連接調(diào)試串口到開(kāi)發(fā)主機(jī),同時(shí)配置好Ubuntu開(kāi)發(fā)主機(jī)開(kāi)發(fā)環(huán)境,具體操作方法可以參考這里。
b).?Apalis iMX6D?ARM核心板配合Ixora?V1.0載板,連接調(diào)試串口到開(kāi)發(fā)主機(jī),同時(shí)配置好Ubuntu開(kāi)發(fā)主機(jī)開(kāi)發(fā)環(huán)境,具體操作方法可以參考這里。
c). Colibri iMX6DL和Apalis iMX6D系統(tǒng)使用Toradex Linux Release V2.6.1,下載和更新方法請(qǐng)參考這里。
d). Colibri iMX6DL?提供了兩路來(lái)自與iMX6DL芯片的CAN總線(FlexCAN)支持,不過(guò)這個(gè)不是Colibri系列兼容定義;Colibri Eva Board上面通過(guò)SPI總線基于MCP2515芯片擴(kuò)展了而一路CAN總線接口,這個(gè)是整個(gè)Colibri兼容的;因此對(duì)于本文的測(cè)試系統(tǒng),我們可以有三路CAN總線支持,具體的Pin定義請(qǐng)見(jiàn)如下,其他Colibri系列產(chǎn)品的定義情況請(qǐng)見(jiàn)這里。
./ FlexCAN定義
./ MCP2515?原理圖設(shè)計(jì)如下,在JP4&JP5跳線連接情況下X2 Top連接器連接的是MCP2515 CAN總線;當(dāng)斷開(kāi)JP4&JP5跳線時(shí)候,可以使用連接線將FlexCAN RX/TX連接到X38來(lái)輸出到X2 Top.
d). Colibri產(chǎn)品系列定義中CAN不是標(biāo)準(zhǔn)定義,因此針對(duì)Colibri系列產(chǎn)品使用CAN總線要根據(jù)版本情況對(duì)kernel或者device tree進(jìn)行修改編譯,下面針對(duì)Colibri iMX6DL V2.6.1版本進(jìn)行配置,其他產(chǎn)品配置說(shuō)明請(qǐng)參考這里。
./?下載對(duì)應(yīng)的V2.6.1 kernel源代碼,具體下載和編譯方法請(qǐng)參考這里。
./?檢查kernel config是否下面選項(xiàng)都已經(jīng)配置,在V2.6.1版本下默認(rèn)都已經(jīng)配置。
--------------------------
CONFIG_CAN = y
CONFIG_CAN_RAW = y
CONFIG_CAN_BCM = y
CONFIG_CAN_DEV = y
CAN_FLEXCAN = y
CAN_MCP251X = y
--------------------------
./?默認(rèn)device tree只支持MCP2515 SPI CAN,通過(guò)如下修改device tree文件打開(kāi)FlexCAN1和FlexCAN2,請(qǐng)注意在Toradex V2.7以上版本image中” &flexcan1”命名修改為”&can1”。
https://github.com/simonqin09/cantest/blob/master/flexcan.patch
e). Ixora載板CAN接口通過(guò)X20輸出,Apalis iMX6D?默認(rèn)device tree已經(jīng)支持FlexCAN1和FlexCAN2,無(wú)需做改動(dòng)。
3).?使用CAN Utilities對(duì)CAN接口進(jìn)行測(cè)試
a). Linux系統(tǒng)通過(guò)SocketCAN層提供CAN支持,使得可以使用類(lèi)似操作socket API函數(shù)來(lái)操作CAN總線,具體關(guān)于SocketCAN說(shuō)明請(qǐng)見(jiàn)這里。
b). Colibri iMX6?和Apalis iMX6默認(rèn)image已經(jīng)包含can-utils,可以直接使用;如下硬件連接將Colibri iMX6 FlexCAN1和Apalis iMX6 FlexCAN1進(jìn)行連接
./ Colibri Eva Board JP4和JP5跳線斷開(kāi),將X9連接器?SODIMM_55和SODIMM_63管腳分別連接到X38連接器TX和RX插座。
./ Colibri Eva Board X2 Top DB9?管腳2和7通過(guò)兩端均配置120Ohm終端電阻的連線和Ixora載板X(qián)20管腳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
/*也可以通過(guò)ifconfig up/down CAN接口*/
//root@colibri-imx6:~# ifconfig can1 up/down
/*ip –details查看CAN總線狀態(tài)*/
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?查看工作狀態(tài)*/
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接口發(fā)送接收測(cè)試,下面以Colibri iMX6發(fā)送,Apalis iMX6接收為例,另外一個(gè)方向方法一致
--------------------------
/*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).?通過(guò)C程序操作CAN總線示例
a).?首先同樣需要使用ip link命令配置CAN接口bitrate并使能接口,這里同樣在Colibri iMX6上面使用can1接口,同時(shí)Apalis iMX6上面使用can0接口。
b).?測(cè)試c程序代碼請(qǐng)見(jiàn)如下:
https://github.com/simonqin09/cantest/blob/master/cantest.c
./?程序執(zhí)行包含兩個(gè)變量,第一個(gè)變量為”-r”或者”-s”來(lái)制定接收或者發(fā)送,第二個(gè)變量為所要測(cè)試的CAN bus,如”can0”。
./?具體以Colibri iMX6作為接收端,Apalis iMX6?作為發(fā)送端測(cè)試程序運(yùn)行結(jié)果如下:
--------------------------
// Colibri iMX6?先運(yùn)行接收命令
root@colibri-imx6:~# ./cantest -r can1?????????????????????????????????????????
can port is can1
// Apalis iMX6?然后運(yùn)行發(fā)送命令
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
//?此時(shí)Colibri iMX6上面接收數(shù)據(jù)情況如下,證明已經(jīng)發(fā)送接收成功
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).?總結(jié)
利用SocketCAN可以非常方便的在Linux下使用CAN總線,另外CAN總線也支持同時(shí)發(fā)送并接收,這里就不做演示了。
?
評(píng)論
查看更多