全志T507添加MCP2515驱动并移植canutils实现SPI转CAN
一、实验准备
1、全志T507
全志T507是
全志(Allwinner)T5系列
车规级处理器,Cortex-A53架构,主频1.5GHz,支持Android10、Linux+Buildroot、Ubuntu和Debian操作系统,适用于车载电子、工业控制、电力、医疗等领域。芯片框图如下图所示。
2、开发环境
本次实验使用QIHUA-X507开发板,以下涉及到的命令均是在root权限下执行。
编译平台使用X86_64架构Ubuntu14.04版本虚拟机,已安装软件包如下所示。
apt-get install git-core flex bison gnupg gperf build-essential zip gawk curl
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev
lib32readline6-dev lib32ncurses5 lib32z1 x11proto-core-dev libx11-dev
lib32z1-dev libxml2-utils autoconf automake libtool xsltproc imagemagick
gettext texinfo liballegro4-dev lzop u-boot-tools
运行平台是arm64架构搭载Ubuntu20.04操作系统,使用开发板商家提供的Linux SDK源码编译而成。SDK包含uboot源码、linux4.9内核源码、ubuntu文件系统、编译工具链等。
3、MCP2515
MCP2515是微芯(Microchip)的一款带有SPI接口的独立CAN控制器芯片,支持CAN V2.0B技术规范,通信速率为1Mb/s。电路模块如下图所示,包含了MCP2515和TJA1050(CAN收发器芯)。
4、canutils
canutils是socketcan工具软件,基于GNU GPLv2的开源项目,包含canconfig、canecho、cansend、candump、cansequence五个命令,用于检测和监控Socket CAN接口。
编译canutils还需要libsocketcan库的支持,本次实验使用canutils-4.0.6和libsocketcan-0.0.12版本。
canutils下载地址:
https://public.pengutronix.de/software/socket-can/canutils/v4.0/
libsocket下载地址:
https://public.pengutronix.de/software/libsocketcan/
二、添加MCP2515驱动
(1)选择SPI接口,由于开发板只提供了SPI1的接口,因此本实验选用SPI1,具体引脚如下所示。
PH5 --> SPI1_CS0
PH6 --> SPI1_CLK
PH7 --> SPI1_MOSI
PH8 --> SPI1_MISO
PA8 --> INT //中断引脚可根据实际情况选择
(2)添加设备节点,在Linux内核源码中找到对应的设备树文件,
vim /home/root/qihua-x507-linux4.9/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/qihua-x507-common.dtsi
然后在SPI1接口下注释掉其他设备并添加MCP2515设备,如图下所示。
mcp2515 {
compatible = "microchip,mcp2515";
mcp-int-gpio = <&pio PA 8 6 1 1 0>; //中断引脚PA8
//spi-max-frequency = <0x5f5e100>; //5f5e100 = 100M
//spi-max-frequency = <0x4c4b40>; //0x4c4b40 = 5M
spi-max-frequency = <0xf4240>; //0xf4240 = 1M
reg = <0x0>;
spi-rx-bus-width = <0x1>;
spi-tx-bus-width = <0x1>;
};
(3)添加驱动配置,在linux内核目录下,进入驱动配置界面,执行命令如下,
cd /home/root/qihua-x507-linux4.9/kernel/linux-4.9
make menuconfig ARCH=arm64
在配置界面根据以下目录找到MCP2515的驱动配置,
[*] Networking support --->
<*>CAN bus subsystem support ---> //默认关闭,需要标记星号后才有下面的目录
CAN Device Drivers --->
CAN SPI interfaces --->
<*> Microchip MCP251x SPI CAN controllers
配置后记得保存,然后就可以编译并打包SDK生成固件,烧录到开发板后,执行如下命令,
ifconfig -a
出现can0就证明驱动添加成功,如下图所示。
驱动添加成功后,可以执行如下命令来开启和关闭can0,
ip link set can0 up //开启
ip link set can0 down //关闭
但是想要使用can0实现CAN通信还需要canutils提供的命令工具。
三、移植canutils
1、配置编译环境
由于编译平台是X86_64架构的,而运行平台是arm64架构的,因此需要使用对应的编译工具,在编译平台上编译好后直接复制到运行平台上运行。这是交叉编译的概念,即在一个平台上生成另一个平台上的可执行代码。
(1)添加编译工具环境变量,执行命令如下,
export PATH=/home/root/qihua-x507-linux4.9/out/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin:$PATH
以上添加环境变量是临时有效的,重启后失效。
(2)新建文件夹用来保存编译输出文件,执行命令如下。
mkdir out
2、编译libsocketcan
(1)解压压缩包
tar xzvf libsocketcan-0.0.12.tar.gz
(2)生成配置文件
cd libsocketcan-0.0.12
./autogen.sh
(3)编译配置
./configure --host=aarch64-linux-gnu --prefix=/home/root/out
--host=编译工具
--prefix=编译输出文件路径
(4)生成文件
make && make install
成功后在out/文件夹下有include、lib和share三个文件夹,它们与canutils的编译有关。
3、编译canutils
(1)解压压缩包
tar jxvf canutils-4.0.6.tar.bz2
(2)生成配置文件
cd canutils-4.0.6
./autogen.sh
(3)编译配置
./configure --host=aarch64-linux-gnu --prefix=/home/root/out
libsocketcan_LIBS="-L/home/root/out/lib -lsocketcan"
libsocketcan_CFLAGS="-I/home/root/out/include"
libsocketcan_LIBS=libsocketcan链接库路径
libsocketcan_CFLAGS=libsocketcan头文件路径
(4)生成文件
make INCLUDES="-I/home/root/out/include"
make install
INCLUDES=libsocketcan头文件路径
成功后可在out/文件夹下看到bin、include、lib、sbin和share五个文件夹,需要把它们复制到运行平台上。
4、NFS传输文件
编译平台和运行平台都已经默认配置好NFS(网络文件系统)功能,使用mount命令可以将编译平台的目录挂载到运行平台上,这样就可以方便地把编译生成文件复制到开发板上了。
(1)运行平台连接局域网,开发板通过网线接入虚拟机所在的局域网,并通过如下命令修改静态IP网络配置,
vim /etc/network/interfaces.d/eth0
修改后reboot重启开发板,能ping通虚拟机IP证明开发板成功接入局域网。
(2)编译平台添加共享文件夹,在虚拟机上执行如下命令,
vim /etc/exports
添加共享文件夹如下所示。
/home/qihua/nfs *(rw,sync,no_root_squash,no_subtree_check)
/home/root *(rw,sync,no_root_squash,no_subtree_check)
(3)运行平台挂载编译平台目录,在开发板上运行如下命令进行挂载,
mount -t nfs -o nolock,nfsvers=3,vers=3 xxx.xxx.xxx.xxx:/home/qihua/nfs /mnt
xxx.xxx.xxx.xxx为虚拟机IP
-t 参数指定挂载类型是nfs
-o 参数指定nfs版本
挂载成功后,先把编译输出文件夹复制到NFS共享文件夹,
cp -r /home/root/out /qihua/nfs
然后在运行平台上执行如下命令,把编译输出文件复制到/usr目录下。
cp -r /mnt/out/* /usr
以上步骤执行完成后,开发板就可以通过canutils命令进行can0的配置和通信了。
四、实验结果
QIHUA-X507开发板通过MCP2515模块与STM32F103(外接CAN收发器模块)进行CAN通信。编写了简单的STM32 CAN通信程序,开发板使用candump命令能够正常接收STM32发送的数据,但是使用cansend命令却不能发送完整的数据给STM32。经过多次调试,最后还是编写了更底层的socketcan程序才能进行正常通信。下图是使用QT实现的CAN通信实验结果。