Visionfive 2系统CAN总线测试
visionFive2 系统集成了两个CAN2.0B总线控制器,本次测试一下系统的CAN总线。测试从系统配置,必要软件安装,外围物理层扩展和实际通讯测试几个方面。
- 系统配置
1)首先下载官方推荐5.15.0的linux内核系统。下载地址参考官方文档
https://doc.rvspace.org/VisionFive2/SW_TRM/VisionFive2_SW_TRM/swtrm_compiling_linux_kernel%20-%20vf2.html
2)设备树源文件存放于linux/arch/riscv/boot/dts/starfive中,我们需要修改该文件,增加CAN总线对应的硬件引脚,并开启CAN总线设备。
3)打开jh7100-visionfive-v2.dts文件
4)增加CAN总线引脚定义
找到设备树源文件中gpio项,
在gpio项下面,增加can总线的引脚定义项,如下所示:
can0_pins: can0-pins {
can0-pins0 {
starfive,pins = <PAD_GPIO61>;
starfive,pinmux = <PAD_GPIO61_FUNC_SEL 0>;
starfive,pin-ioconfig = <IO(GPIO_IE(1))>;
starfive,pin-gpio-dout = <GPO_CAN0_CTRL_TXD>;
starfive,pin-gpio-doen = <OEN_LOW>;
};
can0-pins1 {
starfive,pins = <PAD_GPIO44>;
starfive,pinmux = <PAD_GPIO44_FUNC_SEL 0>;
starfive,pin-ioconfig = <IO(GPIO_IE(1))>;
starfive,pin-gpio-doen = <OEN_HIGH>;
starfive,pin-gpio-din = <GPI_CAN0_CTRL_RXD>;
};
/*
can0-pins2 {
starfive,pins = <PAD_GPIO32>;
starfive,pinmux = <PAD_GPIO32_FUNC_SEL 0>;
starfive,pin-ioconfig = <IO(GPIO_IE(1))>;
starfive,pin-gpio-dout = <GPO_CAN0_CTRL_STBY>;
starfive,pin-gpio-doen = <OEN_LOW>;
};
*/
};
can1_pins: can1-pins {
can1-pins0 {
starfive,pins = <PAD_GPIO63>;
starfive,pinmux = <PAD_GPIO63_FUNC_SEL 0>;
starfive,pin-ioconfig = <IO(GPIO_IE(1)| GPIO_DS(3))>;
starfive,pin-gpio-dout = <GPO_CAN1_CTRL_TXD>;
starfive,pin-gpio-doen = <OEN_LOW>;
};
can1-pins1 {
starfive,pins = <PAD_GPIO60>;
starfive,pinmux = <PAD_GPIO60_FUNC_SEL 0>;
starfive,pin-ioconfig = <IO(GPIO_IE(1)| GPIO_DS(3))>;
starfive,pin-gpio-doen = <OEN_HIGH>;
starfive,pin-gpio-din = <GPI_CAN1_CTRL_RXD>;
};
/*
can1-pins2 {
starfive,pins = <PAD_GPIO45>;
starfive,pinmux = <PAD_GPIO45_FUNC_SEL 0>;
starfive,pin-ioconfig = <IO(GPIO_IE(1))>;
starfive,pin-gpio-dout = <GPO_CAN1_CTRL_STBY>;
starfive,pin-gpio-doen = <OEN_LOW>;
};
*/
};
根据官方文件描述,visionfive2的所有gpio引脚都可以复用支持的所有外设功能,所以我们可以将CAN总线引脚映射到40-pin的端子上没有用到的位置。
我这里将他们分别映射到GPIO61,GPIO44,GPIO63和GPIO60.
序号 |
外设功能 |
40Pin端子位置 |
GPIO分配 |
备注 |
1 |
CAN0-TX |
38 |
GPIO61 |
|
2 |
CAN0-RX |
40 |
GPIO44 |
|
3 |
CAN1-TX |
35 |
GPIO63 |
|
4 |
CAN1-RX |
37 |
GPIO60 |
|
5)使能CAN总线设备
在文件的末尾增加
&can0 {
pinctrl-names = "default";
pinctrl-0 = <&can0_pins>;
status = "okay";
};
&can1 {
pinctrl-names = "default";
pinctrl-0 = <&can1_pins>;
status = "okay";
};
使能CAN0和CAN1设备。
6)编译dts文件生成dtb文件
在linux目录下,执行
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu-
当编译结束后,dtb文件也同时编译完成了。
7)复制新的dtb文件到烧录好的TF卡并应用
将TF卡放入读卡器,并连接到ubuntu系统中,使用如下命令挂载boot分区。执行命令完成分区挂载,官方提供的boot分区在sdb3.
sudo mount –t vfat /dev/sdb3 /media/boot
挂载后,将之前编译好的jh7110-visionfive-v2.dtb文件复制到boot/dtbs/starfive/ 下面。如果想简单点,直接覆盖下面的同名文件。
我们还可以将这个文件重新命名为其它文件名,不过需要修改uEnv.txt文件。
fdt_high=0xffffffffffffffff
initrd_high=0xffffffffffffffff
kernel_addr_r=0x44000000
kernel_comp_addr_r=0x90000000
kernel_comp_size=0x10000000
fdt_addr_r=0x48000000
ramdisk_addr_r=0x48100000
# Move distro to first boot to speed up booting
boot_targets=distro mmc0 dhcp
# Fix wrong fdtfile name
fdtfile=starfive/jh7110-visionfive-v2.dtb (调整这个文件名为刚才命名的文件即可)
# Fix missing bootcmd
bootcmd=run load_distro_uenv;run bootcmd_distro
调整后,将TF卡重新插回板卡,重新启动系统。
8)检查CAN设备加载情况
检查方法有两种,第一种,在终端执行如下命令
第二种,在终端执行
我们可以看到系统中的Can0和Can1设备都已经出现了。
- 安装测试软件
为了完成后面的测试工作,我们安装candump软件。在终端中执行
sudo apt update
sudo apt install can-utils
- 扩展物理接口
利用MXDock中扩展的CAN总线接口,一端连接VisionFive2 的40Pin连接器,提供TTL电平信号,一端连接CAN总线和其它CAN总线设备互联。
CAN总线接线原理图
- 通讯测试及遇到的问题
配置Can0总线,使用命令
ip link set can0 up type can bitrate 50000
利用candum 接收can总线数据,验证总线通讯的情况。执行命令
candump can0
实际是什么信息都没有收到,通过示波器测量总线信号。没有连接mxdock的can ttl-rx信号线到visionfive2时的波形。
将CAN TTL信号连接到VisionFive2后,信号立刻衰减了,低电平完全低不下去。
请大家帮忙解决一下,是什么原因导致的。
本帖最后由 我爱下载 于 2023-7-11 10:23 编辑