【Linux】全志T507添加MCP2515驱动并移植canutils实现SPI转CAN

  • Post author:
  • Post category:linux




一、实验准备



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通信实验结果。

在这里插入图片描述



版权声明:本文为weixin_45321163原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。