FLEXCAN(Flexible Controller Area Network),是一個(gè)支持CAN2.0協(xié)議規(guī)范的CAN通信控制器。CAN 是控制器局域網(wǎng)絡(luò)(Controller Area Network)的簡稱,是1986年德國電氣商博世公司開發(fā)的面向汽車產(chǎn)業(yè)的串行通信協(xié)議,主要滿足汽車行業(yè)以下幾點(diǎn)需求:數(shù)據(jù)處理的實(shí)時(shí)性、EMI環(huán)境下數(shù)據(jù)傳輸的可靠性、降低線纜成本、增大數(shù)據(jù)帶寬等。
開發(fā)板提供兩路原生的CAN。
硬件原理
ELF?1開發(fā)板跟NXP使用的原生的FLEXCAN是同一方案,所以,添加起來就簡單多了。
通過查表CAN1_TX對應(yīng)的PAD NAME為UART3_CTS_B,CNA1_RX的PAD NAME為UART3_RTS_B,CAN2_TX對應(yīng)的PAD NAME為UART2_CTS_B,CNA2_RX的PAD NAME為UART2_RTS_B。
IOMUX配置
在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中已經(jīng)添加好的配置:
設(shè)備節(jié)點(diǎn)
已配置好的設(shè)備節(jié)點(diǎn):
其中xceiver-supply = <®_can_3v3>;屬性表示給can收發(fā)時(shí)供電的電源。
添加驅(qū)動(dòng)
使用make menuconfig打開圖形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?make menuconfig |
在Networking support菜單下添加CAN bus subsystem support:
進(jìn)入該選項(xiàng),在
CAN bus subsystem support -> CAN Device Drivers |
中選中以下幾個(gè)選項(xiàng):
替換配置文件
通過make menuconfig修改的內(nèi)容寫入到了.config文件,當(dāng)使用make imx6ull_elf1_defconfig配置內(nèi)核源碼時(shí),.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 |
編譯測試
編譯內(nèi)核和設(shè)備樹并拷貝到開發(fā)板:
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/ |
進(jìn)行sync操作后重啟開發(fā)板:
我們使用CAN1和CAN2進(jìn)行對測。將開發(fā)板的 CAN1與CAN2 的H與H相連,L與L相連。板子啟動(dòng)之后,在命令行輸入以下命令,對CAN1配置波特率為125000:
root@ELF1:~#?ifconfig can0 down????????????????????????????????//關(guān)閉can1 |
root@ELF1:~#?ip link set can0 up type can bitrate 125000 triple-sampling on?//設(shè)置can1波特率 |
root@ELF1:~#?ifconfig can0 up??????????????????????????????????//開啟can1 |
對CAN2配置波特率為125000:
root@ELF1:~#?ifconfig can1 down????????????????????????????????//關(guān)閉can2 |
root@ELF1:~#?ip link set can1 up type can bitrate 125000 triple-sampling on?//設(shè)置can2波特率 |
root@ELF1:~#?ifconfig can1 up??????????????????????????????????//開啟can2 |
CAN2接收數(shù)據(jù):
root@ELF1:~#?candump can1 &???????????????????//can2以后臺方式接收數(shù)據(jù) |
[1] 686 |
CAN1發(fā)送數(shù)據(jù):
root@ELF1:~#?cansend can0 123#1234567891234567???????//can1發(fā)送數(shù)據(jù) |
can1 123 [8] 12 34 56 78 91 23 45 67 ????????????????????????//can2接收到數(shù)據(jù) |