linux can软件,Linux学习系列十:使用CAN

1.引言

CAN总线由于其高可靠性,被广泛的应用在汽车电子及工业领域。生活中常见的一个使用CAN的地方是汽车OBD接口,它一般位于汽车方向盘的左下角,是一个16针的插座,其中里面就有一个CAN接口,可以用来查看汽车的刹车、转向、故障信息等。单片机或处理器上如果有CAN控制器,外围再搭配一个CAN收发器,就可以进行通信了。本篇对Linux下CAN使用做个简单总结,希望对大家有所帮助。

e2c3210d903be309f18ebad1bf5c22c9.png

2.环境介绍

2.1.硬件

1) 网上的一个第三方做的NUC972开发板:

74c619bf9d58c76fa057342ccd515094.png

2) CAN相关电路

67347c5d0a44e7e7c7fc63adcbaa330a.png

为了进行后面的实验,将CAN0的H和CAN1的H,CAN0的L和CAN1的L分别短接起来。

结合我之前遇到的实际问题,对上面电路做两点说明:

i)从处理器芯片CAN控制器出来的两个引脚TX和RX,和CAN收发器的TX(上图收发器芯片的1脚D)和RX(上图收发器芯片的4脚R)是直连的,就是TX连接TX,RX连接RX,千万别把TX和RX连接在一起了,这个和串口里的交叉连接不是一回事。当年就因为这个小问题,我在一个客户那里折腾了老半天。

ii) 收发器出来的CANH和CANL之间有一个120欧姆电阻,CAN总线结构如下,这个120欧姆电阻只需要在两侧的节点上加就行,用来保证整个总线的阻抗匹配。这个得注意,虽然有时不加也能通信,但是还是得按照CAN总线的要求加上,不然通信会不稳定的。

a2a8a743ff7f34a81646afacc4a06318.png

2.2.软件

1) Uboot继续使用之前文章用的,无需改动。

2) Kernel在上一篇基础上,要做一定的修改。

3) Rootfs在上一篇用Buildroot生成的基础上,要做一定的修改。

3.内核配置

内核CAN配置

626054ba614bb11595c1aa0de5f79bc8.png

bdcea40a121f1c9e4321709527b2a40e.png

4.Buildroot配置

iproute2配置

92c7e362ac3117b554fda9b42f8ea437.png

使能can-utils工具,用来支持candump/cansend命令

22d1c2ab0b23b250349ba9f3b3c54ddf.png

socketcand配置

c60c9f01ba3c378b64958b0b64ccb2a9.png

5.收发测试

5.1.命令行调试

将上述修改后的内核和文件系统下载到板子里启动后,

1) ifconfig -a 查看全部接口,可以看到can0和can1接口

09938de81532613c73a740ea3a7f3ed3.png

2) 输入下面两条指令

ip link set can0 up type can bitrate 500000

ip link set can1 up type can bitrate 500000

b09326004df9807075ec82dee87459ac.png

ifconfig 可以看到两个can接口

2f66ff432b65cefc440e3e007103ed47.png

下面的两条指令完成can0接收,can1发送,可以看到收发正常

candump

can0 &

cansend can1 888#11223344

0eee93400f6e81c14cc2cae11e4973c2.png

如果也让can1接收,通过can0或者can1发送,两个can口都可以接收到数据。

5928d4ab423735938b6c1106d0ea2eda.png

5.2.C代码实现

1) 代码实现的功能是,先通过can0发送一串数据,然后不断接收数据并打印。完整代码见百度网盘。

2)执行can_demo程序,可以看到can1会收到can0发送的数据

60c0b80d447365414b4c88fba3703423.png

如果通过cansend can1 12345678#1122334455 发送数据

514b55d83b21101bba32f44e73bd3fa2.png

程序会打印出接收到的数据:

93836b4250ac664760c92d2fd0a9760c.png

里面有一个重要的数据结构说明如下:

/**

* struct can_frame - basic CAN frame structure

* @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition

* @can_dlc: frame payload length in byte (0 .. 8) aka data length code

* N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1

* mapping of the 'data length code' to the real payload length

* @data: CAN frame payload (up to 8 byte)

*/

struct can_frame {

canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */

__u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */

__u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));

};

/*

* Controller Area Network Identifier structure

*

* bit 0-28: CAN identifier (11/29 bit)

* bit 29: error message frame flag (0 = data frame, 1 = error message)

* bit 30: remote transmission request flag (1 = rtr frame)

* bit 31: frame format flag (0 = standard 11 bit, 1 = extended 29 bit)

*/

typedef __u32 canid_t;

#define CAN_MAX_DLEN 8

6.结束语

本篇为大家介绍了Linux下CAN接口的简单使用,欢迎大家多交流,可以在网页下方留言讨论,或者发邮件:Topsemic@sina.com ,微信公众号如下,欢迎关注:

本期相关的资料在百度网盘,链接:

里面包含如下内容:

26cb6d96eddb2bcebfe33fa46372b21d.png

本系列往期文章见:

7.参考资料

0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值