1).简介
can(controller area network)总线是嵌入式设备最为常用的接口之一,常用于汽车以及工业自动化等嵌入式领域,因此本文就基于嵌入式linux演示使用can总线进行通讯测试。
本文所演示的平台来自于toradex colibri imx6dl和apalis imx6d arm嵌入式平台,这两个平台是都是基于nxp imx6系列arm处理器,支持双核心cortex-a9。
2.准备
a).colibri imx6dlarm核心版配合colibri eva boardv3.2b载板,连接调试串口到开发主机,同时配置好ubuntu开发主机开发环境,具体操作方法可以参考这里。
b).apalis imx6darm核心板配合ixorav1.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/canpromiscuity 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/canpromiscuity 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
000000
rx: bytespacketserrorsdropped overrun mcast
000000
tx: bytespacketserrorsdropped carrier collsns
000000
--------------------------
d). flexcan接口发送接收测试,下面以colibri imx6发送,apalis imx6接收为例,另外一个方向方法一致
--------------------------
/*apalis imx6*/
root@apalis-imx6:~# candump can0
interface = can0, family = 29, type = 3, proto = 1
[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 imx6dlarm核心版配合colibri eva boardv3.2b载板,连接调试串口到开发主机,同时配置好ubuntu开发主机开发环境,具体操作方法可以参考这里。
b).apalis imx6darm核心板配合ixorav1.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/canpromiscuity 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/canpromiscuity 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
000000
rx: bytespacketserrorsdropped overrun mcast
000000
tx: bytespacketserrorsdropped carrier collsns
000000
--------------------------
d). flexcan接口发送接收测试,下面以colibri imx6发送,apalis imx6接收为例,另外一个方向方法一致
--------------------------
/*apalis imx6*/
root@apalis-imx6:~# candump can0
interface = can0, family = 29, type = 3, proto = 1
[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总线也支持同时发送并接收,这里就不做演示了。
一加5和锤子坚果Pro哪个更好?一加5和锤子坚果Pro谁更美?一加5和哪些手机撞脸?
传感器产业的新应用有哪些?
电脑主板键盘接口修复技巧
仪表放大器和普通放大器的区别在哪
一种除去晶片表面有机物的清洗方法
嵌入式Linux下CAN接口调试
小米mix2什么时候上市,小米mix2最新消息:小米mix2又被提前发布,国外网站已启动预约
英创信息技术WinCE工控主板4G/3G/GPRS通用拨号介绍
苹果起诉宏达电侵犯其20项iPhone手机专利
深度解读:中国为什么选择电动车?
如何下载PCIe的linux驱动?
JabraEngage50专业有线耳机评测 专为客服人员设计
运算放大器学习的12个常见问题
诺思高频率、宽频带BAW滤波器开启5G新时代
莫斯科法院裁定破产债务人的加密货币资金不能用于支付债务
华润微IGBT产品逐渐成为汽车行业的新宠
模块化原理和方法 模块化的方法和注意事项
自动化的基本概念 自动化设备有哪些
德国莱茵TUV认证用于三星Galaxy M31的新电池
华为扔出三颗炸弹,不留任何喘息机会!