网站首页 > 技术文章 正文
飞凌嵌入式OKMX8MP-C核心板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。
说明
(1)OKMX8MP-C核心板有两路原生的SPI总线,目前是将SPI1的引脚用作了LED和UART3的功能,SPI2做成了正常的SPI2接口。此处以SPI2转CAN为例,移植SPI转CAN芯片;
(2)SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;
(3)本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。
01 移植MC2518芯片驱动
在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。
02 补全对can_rx_offload_add_manual函数的定义
vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h
添加:
int can_rx_offload_add_manual(struct net_device *dev,
struct can_rx_offload *offload,
unsigned int weight)
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c
添加:
int can_rx_offload_add_manual(struct net_device *dev,
struct can_rx_offload *offload,
unsigned int weight)
{
if (offload->mailbox_read)
return -EINVAL;
return can_rx_offload_init_queue(dev, offload, weight);
}
EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
03 修改上一级目录spi/下的Makefile和Kconfig
vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile
添加:
obj-y += mcp25xxfd/
vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig
添加:
source "drivers/net/can/spi/mcp25xxfd/Kconfig"
04 修改驱动配置文件,将MCP2518编译进内核
vi OK8MP-linux-kernel/arch/arm64/configs/OK8MP-C_defconfig
找到:CONFIG_CAN_MCP251X=y
改为:# CONFIG_CAN_MCP251X is not set
添加:CONFIG_CAN_MCP25XXFD=y
05 在设备树中配置时钟
vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts
添加:
clocks{
mcp2518fd_clock:
mcp2518fd_clock{
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <40000000>;
};
};
06 找一个引脚用作芯片的中断引脚
此处是将GPIO4_IO21用作了中断引脚。
vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts
添加:
pinctrl_ecspi2_can: ecspi2can{
fsl,pins = <
MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
>;
};
07 在设备树的ecspi2节点中进行修改
vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts
从:
&ecspi2{
#address-cells= <1>;
#size-cells= <0>;
fsl,spi-num-chipselects= <1>;
pinctrl-names= "default";
pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
status= "okay";
spidev1:spi@0 {
reg= <0>;
compatible= "rohm,dh2228fv";
spi-max-frequency= <500000>;
};
};
改为:
&ecspi2{
#address-cells= <1>;
#size-cells= <0>;
fsl,spi-num-chipselects= <1>;
pinctrl-names= "default";
pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
status= "okay";
mcp1:mcp2518fd@0{
compatible= "microchip,mcp2518fd";
reg= <0>;
spi-max-frequency= <20000000>;
clocks= <&mcp2518fd_clock2>;
interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
};
};
完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
08 开发板验证
将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。
用户使用手册下载链接:
https://pan.baidu.com/s/1TY4R5BrAnjAuTTJj9fNGWw
提取码:
7qc8
猜你喜欢
- 2024-12-25 DISPLAY环境变量的作用 display环境变量设置为0
- 2024-12-25 linux kernel内核的头文件获取、安装等方法
- 2024-12-25 面试如何说分布式 java面试分布式
- 2024-12-25 C语言实现MD5加密,竟如此简单 c++md5加密
- 2024-12-25 一文了解汽车CAN总线技术原理 汽车can总线原理图
- 2024-12-25 一文搞懂轻量级开源堡垒机Teleport的部署(1)
- 2024-12-25 如何关闭SELinux? 如何关闭selinux的权限
- 2024-12-25 关于Linux中使用USE(使用率/饱和度/错误)方法分析系统性能
- 2024-12-25 Linux建立软/硬链接文件(ln命令) linux建立软连接和硬链接的命令
- 2024-12-25 CAN分析仪通讯失败的可能原因有哪几个?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)