IMX6ULL开发板的CAN通信
查看板子上的CAN设备是否使能:

如果查询到上图所示,说明CAN设备(也可称为CAN“网卡”)是可以工作的,否则需要做好底层设备树及驱动配置。将板子上CAN接口(该板子只有1路CAN)的CAN_H和CAN_L分别接到USBCAN盒的其中一路CAN输入的CAN_H和CAN_L上,尝试从开发板发送数据到USBCAN上位机以及从上位机通过USBCAN发送数据到开发板。Linux系统将CAN当作网络设备进行统一管理,所以CAN应用程序仍然采用经典的socket通信那一套。开发板发送数据的应用代码如下。需要注意的是,对于CAN协议族,socket应该使用原始套接字SOCK_RAW。因为仅有发送,所以通过setsockopt设置了过滤规则为不接收任何报文。发送的内容是每帧8个字节的数据:0xAB 0xBC 0xCD 0xDE 0xEF 0xFA 0xAB 0xBC,ID为0x123,发送周期为1s。
编译后在开发板上运行,可以看到USBCAN的上位机接收结果如图,可见USBCAN上位机成功接收到了来自开发板的CAN报文。

开发板上CAN接收数据的应用代码如下。需要注意的是,由于是接收数据,这里设置了三组报文ID过滤,分别是0x123、0x234和0x345,掩码设置的都是0x7FF,也就是说设置开发板的CAN仅接收ID为0x123或0x234或0x345的报文,其它ID不会被接收。接收到数据后根据报文ID中的一些特殊位,可以进行错误帧、扩展帧、远程帧等类型的判断。
编译后在开发板上运行。尝试在USBCAN上位机发送若干种ID及类型的报文:

开发板侧的接收情况如下。很明显可见,只有上面提到的那三种ID的报文才被接收了,并正确获取了帧类型。


