FLEXCAN(Flexible Controller Area Network),是一个支持CAN2.0协议规范的CAN通信控制器。CAN 是控制器局域网络(Controller Area Network)的简称,是1986年德国电气商博世公司开发的面向汽车产业的串行通信协议,主要满足汽车行业以下几点需求:数据处理的实时性、EMI环境下数据传输的可靠性、降低线缆成本、增大数据带宽等。
开发板提供两路原生的CAN。
硬件原理
ELF 1开发板跟NXP使用的原生的FLEXCAN是同一方案,所以,添加起来就简单多了。
通过查表CAN1_TX对应的PAD NAME为UART3_CTS_B,CNA1_RX的PAD NAME为UART3_RTS_B,CAN2_TX对应的PAD NAME为UART2_CTS_B,CNA2_RX的PAD NAME为UART2_RTS_B。
IOMUX配置
在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中已经添加好的配置:
设备节点
已配置好的设备节点:
其中xceiver-supply = <®_can_3v3>;属性表示给can收发时供电的电源。
添加驱动
使用make menuconfig打开图形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig |
在Networking support菜单下添加CAN bus subsystem support:
进入该选项,在
CAN bus subsystem support -> CAN Device Drivers |
中选中以下几个选项:
替换配置文件
通过make menuconfig修改的内容写入到了.config文件,当使用make imx6ull_elf1_defconfig配置内核源码时,.config文件会被覆盖,因此,需要替换原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ull_elf1_defconfig |
编译测试
编译内核和设备树并拷贝到开发板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage root@172.16.0.175:/run/media/mmcblk1p1/ elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/ |
进行sync操作后重启开发板:
我们使用CAN1和CAN2进行对测。将开发板的 CAN1与CAN2 的H与H相连,L与L相连。板子启动之后,在命令行输入以下命令,对CAN1配置波特率为125000:
root@ELF1:~# ifconfig can0 down //关闭can1 |
root@ELF1:~# ip link set can0 up type can bitrate 125000 triple-sampling on //设置can1波特率 |
root@ELF1:~# ifconfig can0 up //开启can1 |
对CAN2配置波特率为125000:
root@ELF1:~# ifconfig can1 down //关闭can2 |
root@ELF1:~# ip link set can1 up type can bitrate 125000 triple-sampling on //设置can2波特率 |
root@ELF1:~# ifconfig can1 up //开启can2 |
CAN2接收数据:
root@ELF1:~# candump can1 & //can2以后台方式接收数据 |
[1] 686 |
CAN1发送数据:
root@ELF1:~# cansend can0 123#1234567891234567 //can1发送数据 |
can1 123 [8] 12 34 56 78 91 23 45 67 //can2接收到数据 |