CAN测试

重新build rootfs

重新配置

在后续配置CAN通信速率及回环模式等操作时,需要使用 ip 命令。但使用 PetaLinux 默认编译生成的 ip 命令时,会出现如下错误提示:

根据参考资料的说明,需要在 rootfs 中正确配置 iproute2 组件,以获得完整功能的 ip 命令支持:

参考资料:

65243 - PetaLinux 2014.4 - The "ip" Command Fails to Properly Locate CAN Devices

进行编译和打包

在上一步‘petalinux-config -c rootfs’完成之后重新使用以下命令进行编译和打包:

更新文件系统到TF卡

清除之前TF卡第二分区的内容,通过以下命令重新将./image/rootfs.tar.gz文件解压到TF卡的第二个分区:

将TF卡插入板卡内,跳线帽选择SD卡启动模式,板卡连接好串口并上电。

添加代码到vitis应用工程

右击src建立新的文件夹:

image-20250710140513635

建立相关的.c .h文件后如下图:

image-20250714102016171

编译调试

添加包含.h的文件夹到路径中:

image-20250714102318467

通过命令进行测试

通过命令将CAN通道打开并设置好波特率,相关命令如下:

更改can的工作状态时,须先关闭can0,否则会报”Device or resource busy"

image-20250714111708984

image-20250714111809960

通过vitis工程进行测试

Linux系统将CAN设备作为网络设备进行管理,提供了SocketCAN接口,使得CAN总线通信可以像以太网一样,应用程序开发接口更加通用,也更灵活。

初始化

对CAN初始化和设置,是通过system()系统调用前面提到的相应的命令来完成。

SocketCAN中大部分的数据结构和函数定义在linux/can.h中,CAN总线套接字的创建采用标准的网络套接字来完成。

数据发送

CAN总线每次接收数据都是以can_frame为单位,该结构体定义如下:

can_id为帧的标识符,如果发送的是标准帧,就使用can_id的低11位;如果为扩展帧,就是用0~28位。can_id的低29,30,31位是帧的标识位,用来定义帧的类型,如下所示:

数据发送使用write函数实现,发送数据帧标识符为0x123,发送的数据为一个字节的0xAB,发送方法如下:

如果发送的是远程帧,则frame.can_id = CAN_RTR_FLAG | 0x123

数据接收

数据接收使用read函数来完成,实现如下:

创建接收线程

Linux 下测试 CAN 通信程序 通常需要创建一个线程负责接收,通过线程的使用能充分利用 Linux 内核提供的 任务调度与资源复用