i.MX8MP开发板如何实现SPI转CAN

[复制链接]
2129|0
 楼主| 布罗利 发表于 2023-9-11 15:14 | 显示全部楼层 |阅读模式
本帖最后由 布罗利 于 2023-9-11 15:17 编辑

飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。

说明

  • OKMX8MP-C核心板有两路原生的SPI总线,目前是将SPI1的引脚用作了LED和UART3的功能,SPI2做成了正常的SPI2接口。此处以SPI2转CAN为例,移植SPI转CAN芯片;



  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;



  • 本次移植的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

添加:


  1. int can_rx_offload_add_manual(struct net_device *dev,
  2.     struct can_rx_offload *offload,
  3.     unsigned int weight)

vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c

添加:


  1. int can_rx_offload_add_manual(struct net_device *dev,
  2.         struct can_rx_offload *offload,
  3.             unsigned int weight)
  4. {
  5.     if (offload->mailbox_read)
  6.             return -EINVAL;
  7.       return can_rx_offload_init_queue(dev, offload, weight);
  8. }
  9. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);

03修改上一级目录spi/下的Makefile和Kconfig

vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile

添加:


  1. obj-y     +=  mcp25xxfd/

vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig

添加:

  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>

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

添加:​​​​​​​

  1. clocks{

06找一个引脚用作芯片的中断引脚

此处是将GPIO4_IO21用作了中断引脚。

vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts

添加:​​​​​​​


  1. pinctrl_ecspi2_can: ecspi2can{
  2.   fsl,pins = <
  3.     MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
  4.     >;
  5. };

07

在设备树的ecspi2节点中进行修改

vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts

从:​​​​​​​


  1. &ecspi2{
  2.     #address-cells= <1>;
  3.     #size-cells= <0>;
  4.     fsl,spi-num-chipselects= <1>;
  5.     pinctrl-names= "default";
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
  8.     status= "okay";

  9.     spidev1:spi[url=home.php?mod=space&uid=2514928]@0[/url] {
  10.         reg= <0>;
  11.         compatible= "rohm,dh2228fv";
  12.         spi-max-frequency= <500000>;
  13.     };
  14. };

改为:​​​​​​​


  1. &ecspi2{
  2.     #address-cells= <1>;
  3.     #size-cells= <0>;
  4.     fsl,spi-num-chipselects= <1>;
  5.     pinctrl-names= "default";
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
  8.     status= "okay";

  9. mcp1:mcp2518fd@0{
  10.             compatible= "microchip,mcp2518fd";
  11.             reg= <0>;
  12.             spi-max-frequency= <20000000>;
  13.             clocks= <&mcp2518fd_clock2>;
  14.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
  15.         };
  16. };

完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。


08

开发板验证

将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

179

主题

181

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部