前言
MCP2515
是 SPI 转 CAN 模块
建议在完成且掌握泰山派小手机项目的全过程后进行此操作,这样难度会低一些
目标平台: 泰山派RK3566
连接
rk3566(泰山派)的spi3各管脚连接MCP2515的SPI接口,另外MCP2515还需要一个中断引脚,用到的全部管脚如下:
其中GPIO3_A6为中断引脚
移植过程
1.配置kernel
cd到SDK/kernel 目录下,执行 make ARCH=arm64 menuconfig
,打开相关的配置项,看下图:↓
即打开CAN_ROCKCHIP和CAN_MCP251X项
save,生成.config后,使用make ARCH=arm64 savedefconfig
命令 将在sdk/kernel目录下生成一个defconfig文件.
实际上,编译器访问的config文件在 sdk/kernel/arch/arm64/configs/ 下,被命名为 rockchip_linux_defconfig,为了防止翻车,可以将源文件命名为 rockchip_linux_defconfig.bak 。
接下来在 sdk/kernel 下使用命令:
mv defconfig arch/arm64/configs/rockchip_linux_defconfig
2.改驱动文件
mcp2515的驱动文件名为 cmp251x.c,在 SDK/kernel/drivers/net/can/spi下,下面是完整的 mcp251x.c文件的内容,请替换掉原有内容!!
3.配置DTS
设备树文件在 SDK/kernel/arch/arm64/boot/dts/rockchip中,文件名为tspi-rk3566-user-v10-linux.dts
找到SPI3节点,spi3节点原内容为:
status = "okay";
max-freq = <48000000>;
dma-names = "tx","rx";
pinctrl-names = "default", "high_speed";
pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>;
pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>;
spi_test@10 {
compatible ="rockchip,spi_test_bus1_cs0";
reg = <0>;
spi-max-frequency = <24000000>;
status = "okay";
};
2
3
4
5
6
7
8
9
10
11
12
进行替换
status = "okay";
max-freq = <48000000>;
//dma-names = "tx","rx";
pinctrl-names = "default", "high_speed";
pinctrl-0 = <&spi3m1_cs0 &spi3m1_pins>;
pinctrl-1 = <&spi3m1_cs0 &spi3m1_pins_hs>;
//pinctrl-0 is "default" pinctrl-1 is "high_speed"
mcp2515: can@00 {
status = "okay";
compatible ="microchip,mcp2515";
reg = <0x00>;
clocks = <&mcp251x_clk>; //mcp 2515 clock
interrupt-parent = <&gpio3>; //interrupt pin group3 ->gpio3_A6
interrupts = <RK_PA6 IRQ_TYPE_EDGE_FALLING>; //A0 = 0
spi-max-frequency = <10000000>;
pinctrl-names = "default";
pinctrl-0 = <&mcp2515_irq1_pins>;
poll_mode = <0>;
enable_dma = <1>;
};
mcp251x_clk:mcp251x-clk{
compatible="fixed-clock";
#clock-cells = <0>;
clock-frequency = <8000000>; //mcp2515 jingzhenpinlv
};
};
&pinctrl {
mcp2515 {
mcp2515_irq1_pins: mcp2515-irq1-pins {
rockchip,pins = <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
在原SPI3管脚的基础上,增加了gpio3_pa6作为中断引脚
4.buildroot中添加配置工具和测试工具
打开SDK/buildroot/configs下的 rockchip_rk3566_defconfig 文件,buildroot的软件包可以在此开启编译,增加字段:
BR2_PACKAGE_CAN_UTILS=y
BR2_PACKAGE_IPROUTE2=y
BR2_PACKAGE_LIBSOCKETCAN=y
这些操作增加了必要的工具 : ip和canutils,ip用来配置can socket参数,canutils中包含了多个工具,可以对can总线进行测试。
接下来进入SDK目录下,使用命令:./build.sh buildroot
该命令目前已知仅适用于rk3566(泰山派)上,其他目标板请自行适配,其目的是编译buildroot
会遇见的问题(仅限rk3566 泰山派)
在进入编译后,iproute这个工具可能会先报一下类似于 first defined here multiple-definition 的问题,很好解决,找到多重定义的符号,然后对其重新命名!!
例如报错 a.o(来自a.c) 和 b.o(来自b.c)中有重名的变量X,解决方法为将b.c中的X变量全部重命名为X1,肯定会遇到改成X1后提示X1重名,很简单,在另一个文件把X1换成X2
5.工具替换
友情提示:替换之前请备份目标机现正运行的固件,工具替换操作后可能导致系统无法启动
在第4步中,完成了iproute工具的编译,编译完成后,在
SDK/buildroot/output/rockchip_rk3566/build/iproute2-4.14.1/ip
路径下生成了一个名为ip的可执行文件,将此文件使用 adb push 命令暂时放到目标板文件的 /etc 下
windows powershell命令为adb push ip /etc
其中ip为要上传的文件,/etc为目标路径
上传完成,可以在目标板的etc下看到 ip 这个可执行文件,adb push过去的文件是没有执行权限的因此要在目标板的/etc中给ip这个可执行文件增加执行权限:chmod +x ip
添加完后,./ip -V
查看ip这个可执行文件的版本
将目标机 原ip可执行文件 替换为/etc/ip 请谨慎操作,注意检查命令是否正确 /etc/ip是上面编译iproute工具生成的可执行文件 目标机上
cd /etc
进入目标机的etc文件夹cp ip /sbin/ip -f
替换完毕后在进入目标机根目录测试ip命令的可用性
此状态即为可用状态
6.配置并启动can设备
使用命令查看can总线驱动是否加载,在连接好硬件的情况下,使用 ifconfig -a
命令查看设备状态
使用ifconfig
可以查看成功启动的设备
可以看出can0已经成功加载但是并未启动,此时需配置can总线的波特率,使用命令ip link set can0 type can bitrate 250000
can0即为ifconfig -a命令后出现的can0,250000为波特率,实际速度为250K
此外还有loop模式,启动命令为ip link set can0 type can bitrate 250000 loopback on
后面和正常模式一样
配置完波特率,启动can0,使用命令ifconfig can0 up
启动can0
此时再使用ifconfig
可以看到 can0已经启动
7.测试CAN收发
仅CAN测试,rk官方对CANFD支持不完善
前面编译的canutils中有candump和cansend两个工具,cansend可以发送数据,candum可以接收数据
连接好CAN测试工具,在目标板上输入命令进行接收测试
candump can0 &
可以在串口控制台中查看收到的数据(adb shell并未测试)
CAN测试工具软件发送
目标板接收数据为
其中can0 为目标板上mcp2515设备名, 000 为发送方的地址,对应上面图帧ID []为长度 ,01234567为接收的数据
连接好CAN测试工具,在目标板上输入命令进行发送测试
启动cansend工具,发送帧id为18E9F4C9,内容为 12 23 34 45 56 67 78 89,长度为8的数据
can0 为MCP2515,18e9f4c9是帧ID, #号后面是数据,数据用'.'作为间隔
CAN测试工具接收为