ubuntu读取can口数据_嵌入式Linux下CAN接口调试[通俗易懂]

ubuntu读取can口数据_嵌入式Linux下CAN接口调试[通俗易懂]ByToradex秦海1).简介CAN(ControllerAreaNetwork)总线是嵌入式设备最为常用的接口之一,常用于汽车以及工业自动化等嵌入式领域,因此本文就基于嵌入式Linux演示使用CAN总线进行通讯测试。本文所演示的平台来自于ToradexColibriiMX6DL和ApalisiMX6DARM嵌入式平台,这两个平台是都是基于NXPiMX6系列ARM处理器,支持双…

大家好,又见面了,我是你们的朋友全栈君。

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”。

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程序代码请见如下:

./ 程序执行包含两个变量,第一个变量为”-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”。

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程序代码请见如下:

./ 程序执行包含两个变量,第一个变量为”-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总线也支持同时发送并接收,这里就不做演示了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149004.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • visio2013首要事项闪退_visio一保存就闪退

    visio2013首要事项闪退_visio一保存就闪退问题描述visio2013安装完成后,新建流程图或者打开流程图,程序就会自动关闭,为了找到错误,我们打开“控制面板->事件查看器->windows事件日志”可以看到一个错误日志,错误如下:错误应用程序名称:VISIO.EXE,版本:15.0.4420.1017,时间戳:0x506742a9错误模块名称:VISLIB.dll,版本:15.0.4420.1017,时间戳:0x506741bc异常代码:0xc0000005错误偏移量:0x000000000010a887错

  • js数组常用方法「建议收藏」

    js数组常用方法「建议收藏」1.join()(数组转字符串)数组转字符串,方法只接收一个参数:即默认为逗号分隔符()。&lt;script&gt; vararr=[1,2,3,4]; console.log(arr.join());//1,2,3,4 console.log(arr.join(":"));//1:2:3:4 console.log(arr);//[1,2,3,4],原数组不变&l…

  • k8sV1.18.0版本一键部署脚本(全部代码在下方)

    k8sV1.18.0版本一键部署脚本(全部代码在下方)

  • 最新idea激活码永久【2021免费激活】

    (最新idea激活码永久)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • python列表转化字符串_python中怎么把列表转成字符串

    python列表转化字符串_python中怎么把列表转成字符串详细内容python中把列表转成字符串先将列表中的元素全部转化为str类型,然后使用Python的字符串内建函数join对列表中的元素进行连接。实例如下:>>>list1=[‘ak’,’uk’,4]>>>list2=[str(i)foriinlist1]#使用列表推导式把列表中的单个元素全部转化为str类型>>>list2#查…

  • JAVA打印数组的四种方法

    JAVA打印数组的四种方法JAVA打印数组的四种方法探究无聊看模块Integer.java源码时(IDEA中鼠标悬浮在Integer上按ctrl+alt可以转到类源码),因为刚学java,想尝试着仿照python的方法打印数组:finalint[]arr1={1,2,3,4,5};System.out.println(arr1);只打印出了地址:于是上网搜了下打印数组内容的正确方法,整理如下:1.循环打印数组String[]arr2={“dashi”,”baiqun”,”wangxiang”

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号